[PEAK] Method replacement and ambiguity resolution using next_method

P.J. Eby pje at telecommunity.com
Sat Aug 21 13:01:24 EDT 2010


At 02:23 PM 8/21/2010 +0200, Christoph Zwerschke wrote:
>Am 20.08.2010 20:49 schrieb P.J. Eby:
>>However, at least currently, it seems like use of "next_method" is
>>rare, so these cases are unlikely to be hidden.
>>
>>Your thoughts?
>
>Hm, I already disliked the next_method parameter for it's original 
>purpose, and I also fear that people will add it now just for 
>indicating the relaxed behavior.

I was worried about that too, but it seems to me that if people want 
relaxed behavior, they will find a way (e.g. by writing a 
prioritized_methods package).  ;-)

As I've been thinking about how I would document it, I think this 
approach is probably the best fit with explaining things in terms of 
"subclassing functions", or monkeypatching.

If you monkeypatch an existing function or method, you will generally 
keep track of the original (i.e. next_method), so you can call 
it.  And, if more than one such patch is applied, each later one 
chains to an earlier one.

So, by analogy, if you are adding a rule that overlaps or equals a 
previous rule, that's like monkeypatching it.

Therefore, by implying that using next_method to redefine an existing 
rule or resolve an ambiguity is like monkeypatching, it will be 
implied that this is a bad thing vs. defining a more specific method 
(more like subclassing than monkeypatching).  ;-)

Or, to put it slightly differently, when overlap occurs, it is up to 
you to specify whether you overlooked having a more-specific rule for 
the area of overlap, or whether you intend to have a Chain Of 
Responsibility in that area.

I am also thinking of splitting AmbiguousMethods into two 
differently-named subclasses: DuplicateRules and 
ConflictingRules.  DuplicateRules would be when you have methods that 
have logically-equivalent conditions, and ConflictingRules would be 
for partially-overlapping conditions.  (AmbiguousMethods itself would 
be renamed to OverlappingRules, but available under the old name for 
better backward compatibility.)

This would give more information about the nature of the problem, as 
well as suggest a solution.  For DuplicateRules, you would either get 
rid of one of the methods or use next_method on the later 
one...  *and* I can cheaply make RuleDuplication errors occur at 
definition time for identical signatures.

For ConflictingRules, on the other hand, the recommended approach is 
to define a new method with the signature suggested by the error 
itself.  (The intersection of the conditions involved.)  But you can 
also use next_method in that case.

I think that separating and renaming these errors, reformatting them 
to be easily-understood, and having both offer their recommendations 
for a fix (as well as haivng good explanations), should probably be 
sufficient to get rid of the perceived need for priorities in 
situations that don't *really* need them.



More information about the PEAK mailing list