"Singletons" package on SM

ducasse ducasse at iam.unibe.ch
Thu Dec 4 10:59:22 UTC 2003


>
>> You should have a look at my comparison  
>> http://www.iam.unibe.ch/~scg/Archive/Papers/ 
>> Duca99aMsgPassingControl.pdf
>>
>> If I remember well in VW I did something similar, but
>> 	I created a new behavior copied the format of the class to this  
>> behavior, then compile class to be superclass
>> 	and superclass to be class superclass.
>
> Ah, I may now understand your objection better - what you were doing  
> in your paper was trying to affect an entire class of objects at once,  
> transparently.    I'm trying to affect a single instance, and it  
> doesn't need/want to be transparent.  I'm not using the existing  
> lookup mechanism to hack in new semantics (like my Mixin  
> implementation does, for example), I'm really just trying to introduce  
> a new way of defining subclasses (that happen to have exactly one  
> instance).

No read it well I can have instance based behavior!


>
>> Anyway have a look this was fun.
>>
>> What I would say is that these kinds of hack are fun but after to  
>> make them working in an integrated way
>> you have much more problems.
>
> Again, for my goal (anonymous, instance-based subclasses), I don't  
> think any further integration is really needed (well, it might be nice  
> to show the singleton methods in the Inspector, but that's really  
> minor).  It's not a hack in that sense - I would have no qualms using  
> this in production code (I think - maybe someone can convince me  
> otherwise).  I think the main integration problems would come if you  
> were introducing new CompiledMethods with source code into these  
> subclasses, but since I'm using MessageSends and blocks (through  
> Andreas' ObjectsAsMethods stuff, but could also be MethodWrappers),  
> there are no ugly calls to #compile: or anything.
>
>>> My expectation is that this might be useful as a replacement for  
>>> specifying pluggable behavior with block inst vars or  
>>> target/selector pairs, particularly for UI classes.
>>
>> Why is it really a problem?
>
> Two things.  One is the idea of "unplanned reuse", which I think  
> Smalltalk generally excels at: if you have well factored code, it's  
> often very easy for someone to come along later and introduce a  
> subclass where you had no idea that someone would want to change the  
> behavior you started with, simply by redefining a few key methods.   
> However, this kind of reuse is only possible through subclassing - to  
> reuse code through composition, the developer has to have left you  
> explicit "pluggable" hooks.  Since I think composition is often a  
> better solution than subclassing in other ways, I think this is a  
> shame.  This puts subclassing and composition on equal grounds in that  
> respect.
>
> Second, it's very common for someone to build in extensibility in two  
> ways (subclassing and composition) by having an abstract class that  
> defines a #subclassResponsibility, have some concrete classes that  
> fulfill this responsibility, and then have a Pluggable subclass that  
> allows the user to supply a block to fulfill the responsibility  
> instead.  An example close to this is Set, IdentitySet, and  
> PluggableSet.  With this delegation code, someone just has to mark the  
> extensibility points once with #subclassResponsibility, and that same  
> responsibility can either be fulfilled by an explicit subclass, or by  
> an anonymous instance-based subclass (ie, through composition), with  
> no need for the boilerplate of a "Pluggable" version.  And note that,  
> like Traits, this approach may remove the need for copied code in  
> IdentitySet and IdentityDictionary - instead, you would have a  
> separate IdentityScanner class that implemented the revised #scanFor:,  
> and to make a Set *or* Dictionary into an Identity[Set|Dictionary],  
> you could say
>
> collection delegate: #scanFor: to: (IdentityScanner for: collection).
>
> Or something along those lines.  Hmm... to achieve this otherwise you  
> would need the hierarchy
>
> Set
>   PluggableSet
>      Dictionary
>
> which is ugly for all kinds of reasons (including performance ones).   
> So even if you *are* planning for this kind of reuse, the block  
> pluggability still looks like it's worse.  (Ok, having realized that,  
> I ought to rewrite this argument to be based entirely around that  
> example, but it really is late so I'll let the rambling stand).
>
> Cheers,
> Avi
>
>




More information about the Squeak-dev mailing list