# from Michael G Schwern
# on Tuesday 25 October 2011 12:57:

>On 2011.10.25 12:29 AM, Eric Wilhelm wrote:
>> I like the sound of plan B, except for the "stores itself in"
>> combined with "swap me out".
>
>Any specific doubts?

I'm only working from intuition and my understanding of what you 
described as the problem.  If you try to implement a few scenarios of 
special handler functionality using each design approach, that might 
help clarify the issues.

It just sounds like a lot of mechanics to require/allow from the handler 
objects.  If the specific push/pop/swap mechanism is handled by the 
event coordinator, you leave less to go wrong.  I see it as mostly 
a "memory management" sort of problem in that it is tedious and 
error-prone for objects to ad-hoc manage holding other objects which 
are not really under their authority.

Note that you should be able to allow e.g. "the new subtest object is 
just a copy of me" and other advanced usage without ceding all of the 
mechanics to the handler object.

Mainly, this structure seems upside down -- because if the handler 
object is expected to take care of storage and swap-out, it must retain 
the parent and return it to be 'current' at the end.

  subtest->new(...,
    parent => subtest->new(...,
      parent => subtest->new(...,
        parent => $root
      )
    )
  )

The trouble with doing this with a stack in the coordinator instead is 
that you may need a way for a subtest to access its parent handler for 
context -- but that need doesn't dictate that the subtest handler must 
store the parent handler.  For instance, perhaps you continually pass 
the coordinator or a context in e.g. $handler->$method($coordinator) 
and allow access via that with the proviso that $coordinator's 
attributes must not be held in $handler.  My main concern here is 
avoiding memory-loop and handler swapping bugs which are likely when 
various handlers start interacting.

>> have the coordinator providing the functionality which you were
>> thinking of getting from the delegator.
>
> problems are A) it constrains what an event watcher can do...
>But I don't see a solution to A.
>..., I can easily imagine a history or event logger
> that wants to record the whole test as a tree.
>
>Part of the point is to provide maximum flexibility to test module
> authors, so we're not stuck with design mistakes 10 years later,
> while still retaining a system that's easy to use if you do things as
> expected.

It seems like keeping the stack/current control in the coordinator will 
help more than hurt in future flexibility.  Would you rather be blocked 
from making a change because somebody did something you didn't think of 
in a subtest_start() and the API had granted them implicit permission 
to do that (aka "total control") or grow from a more conservative 
position where more of the data and flow control is managed by your 
coordinator object which grants flexibility via defined interfaces?

--Eric
-- 
So malloc calls a timeout and starts rummaging around the free chain,
sorting things out, and merging adjacent small free blocks into larger
blocks. This takes 3 1/2 days.
--Joel Spolsky
---------------------------------------------------
    http://scratchcomputing.com
---------------------------------------------------

Reply via email to