respondTo: is different from a perform based on forging a selector. 
respondTo: implies a different control while perform: is just sending a 
message. 

Some logic of Spec or something else was doing respondTo: and it is an 
indication of weak polymorphism.
Either objects are polymorphic or they are not. 
Because else you expect a behavior and because of a hidden respondTo: you get a 
api not invoked. 
This forces you to read all the code and step to find the super cool users of 
respondTo: 

So I really stand on my claim respondTo: should only be used in last resort. 
It covers shitty design. 

S. 

> On 16 Sep 2020, at 19:28, s...@clipperadams.com wrote:
> 
> Stéphane Ducasse <stephane.duca...@inria.fr> wrote:
> 
> refrain from using respondTo: I make code difficult to evolve and can 
> introduce vicious bugs.
> 
> Steph, would you say more about this? It’s something I’ve been wondering 
> about.
> 
> I was recently reading the Strategy pattern in the Smalltalk Companion to the 
> GOF book. On p. 339, they proposed the following "Smalltalk way" as an 
> alternative to the common class-per-strategy implementation:
> 
> [[[language=smalltalk
> 
> Composition>>repair
> 
> "Without the strategy pattern, but using perform:."
> 
> | selector |
> 
> "Construct the name of the method to invoke:"
> 
> selector := ('formatWith', formattingStrategy, 'Algorithm') asSymbol.
> 
> self perform: selector
> 
> ]]]
> 
> It then dismissed the approach as "''clever but difficult from a program 
> understanding perspective. Even static analysis tools such as code browsers' 
> "senders" and "messages" fail on this code.''"
> 
> It struck me as perhaps a bit extreme (i.e. too clever indeed) to construct 
> the algorithm selector via string concatenation. Maybe "senders" search 
> capabilities have gotten more sophisticated since publication, but Pharo 
> seems to support symbol arguments, even for e.g. message renames. I thought, 
> why not the following:
> 
> [[[language=smalltalk
> 
> Composition>>repair
> 
> "Without the strategy pattern, but using perform:."
> 
> self perform: self formattingStrategy
> 
> ]]]
> 
> Then client code like ==aComposition formattingStrategy: 
> #formatWithSimpleAlgorithm== would show up in senders, message renames, etc.
> 
> But from what you’re saying, I feel I may be missing something…
> 
> 
> 

--------------------------------------------
Stéphane Ducasse
http://stephane.ducasse.free.fr / http://www.pharo.org 
03 59 35 87 52
Assistant: Aurore Dalle 
FAX 03 59 57 78 50
TEL 03 59 35 86 16
S. Ducasse - Inria
40, avenue Halley, 
Parc Scientifique de la Haute Borne, Bât.A, Park Plaza
Villeneuve d'Ascq 59650
France

Reply via email to