But remember that it was before new invoke initialized was introduced.
We introduced back in squeak because it helps newcomers: they do not have to understand metaclass the first day.

Stef

Le 4/5/15 00:40, Carlo a écrit :
Hi

Kent Beck came up with some useful idioms in his book Smalltalk Best Practice Patterns. One of them was the 'Creation Parameter Method' which is basically the "set" based initialisation method (which Ben mentioned below). This idiom used in conjunction with the "Complete Creation Method" I believe helps communicate "how can I create a valid instance?" to users of your objects.

Cheers
Carlo


On 02 May 2015, at 4:52 PM, Ben Coman <b...@openinworld.com <mailto:b...@openinworld.com>> wrote:

There are other conventions like:

* set...
   * Delay class >> forMilliseconds: aNumber
^ self new setDelay: aNumber forSemaphore: Semaphore new

* initializeFor...
   * DynamicMessageImplementor class>>#for:in:
^ self new initializeFor: aMessage in: aClass

* from:to:...
    * Bezier2Segment class>>#from:to:via:
^self new from: startPoint to: endPoint via: viaPoint

I dug a bit to produce this script so you can view more yourself...

protocols := (Protocol allInstances select: [ :p | p name = 'instance creation' ]) flatCollect: [ :p | p methods ].
    methods := protocols select: [ :m | (m occurrencesOf: $:) > 1 ].
    implementors := methods flatCollect: [ :m | m implementors ].
constructorExamples := implementors select: [ :i | (i sourceCode includesAll: 'new') or: [ i sourceCode includesAll: 'basicNew' ] ].

cheers -ben


On Sat, May 2, 2015 at 9:02 PM, Peter Uhnák <i.uh...@gmail.com <mailto:i.uh...@gmail.com>> wrote:

    It seems to me that Smalltalkers are not very fond of constructors
    and I can't comprehend why.

    If for example I want to create object X that _needs_ object Y,
    then I would have to make a Y accessor.

    X>>y: anY
        y := anY

    but this makes no sense as I can still change the `y` object at
    later date breaking everything.

    An alternative is having:

    X>>initializeWithY: anY
        y := anY.
        self initialize.

    X>>y: anY
        ^ self basicNew initalizeWithY: anY.

    However I see only 59 initializeWith* methods (in about 6
    packages) compared to 2302 initialize methods. Thus I am deducing
    that doing this is not very common.

    Am I missing something or am I trying to unnecessarily constraint
    the user and I should just trust™ him that he knows what he should
    use?

    As a user of an interface I would prefer not to have useless
    things available that would just break things.

    Thanks,
    Peter




Reply via email to