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