Thanks for the additional perspective Guille. Now reading back I see that I was not explicit. I was proposing the following changes might be preferred... Example1 -- DAPackageRelationGraph>>addMessageSendDependencies: aPackage analyser := DAMessageSendAnalyzer newWith: aPackage; yourself. Example 2 -- FreeTypeFontProvider>>#updateFromFile: aFile face := FreeTypeFace newWithFileContentsExternalMemory: externalMem . since I'm guessing the above aren't performance sensitive. Example 3, same idea, but maybe its performance critical, but as you say, sista should fix that. cheers -ben On Tue, May 30, 2017 at 2:40 PM, Guillermo Polito <guillermopolito@gmail.com
wrote:
Hi Ben,
Just to complete Sven's answer: #new will send #initialize to the new instance. Some frameworks may not want that to avoid extra initializations or side-effects. Think for example about any kind of serializer like Fuel or Glorp: the object they serialize/deserialize already have state, there is no need to execute the #initialize method on them.
Now, checking the cases you show in the first email:
- Case 1: could probably call #new - Case 2: I don't know without checking the code :) - Case 3: could probably call #new
I think Cases 1 and 3 are just optimizations. They avoid #new to avoid the extra (empty) call to #initialize. Sista should fix this by smartly inlining the #initialize methods thus avoiding extra overhead for these cases...
That said, I'd say that - people should not use #basicNew, unless they know what they are doing and why. - corollary: if you do not know what to use, use #new
That will avoid headaches like "My object is not initialized ñaañaña" :)
Guille
On Tue, May 30, 2017 at 8:16 AM, Ben Coman <btc@openinworld.com> wrote:
On Tue, May 30, 2017 at 2:05 PM, K K Subbu <kksubbu.ml@gmail.com> wrote:
On Sunday 28 May 2017 02:09 PM, Ben Coman wrote:
Thanks Subbu. That is a useful insight for me, but is about the implementation. My query was more about senders of basicNew, so is still open if you have an opinion there, or anyone else.
It is just a private primitive for creating new instances. I don't think there is any restriction in the language that it should only be sent only from class-side methods. Only methods which are part of language implementation will send this selector and it so happens that most callers fall on the class side. You will also find instance side methods (operators) in non-trivial basic types like Colors or DateAndTime sending #basicNew.
Regards .. Subbu
Cool. Sounds like I was being over-eager then. cheers -ben
--
Guille Polito
Research Engineer
French National Center for Scientific Research - *http://www.cnrs.fr* <http://www.cnrs.fr>
*Web:* *http://guillep.github.io* <http://guillep.github.io>
*Phone: *+33 06 52 70 66 13 <+33%206%2052%2070%2066%2013>