You are very right - it hadn’t sunk in that a compiled method attribute would 
give you what you want - but then we are back to an easily extendible browser … 
which I think calypso actually is … hmm should be quite easily doable to get 
all described here - and show  private methods in a private category like 
Dolphin did (somewhat related, I wish class methods worked this way too - I 
hate flipping between class/instance mode)

Anyway, a great topic for making you think a bit more.

Tim

> On 23 Aug 2021, at 15:06, Esteban Maringolo <emaring...@gmail.com> wrote:
> 
> If something, I'd rather have _ as a prefix indicating a private
> method, very much like Dart does.
> But why use a "syntax" trick when it could be an attribute of the
> CompiledMethod itself?
> 
> As for many private methods being a code smell... it could be, but it
> depends, until you find the right abstractions you might want to keep
> private all the stuff that is causing the smell :-)
> 
> 
> 
> 
> Esteban A. Maringolo
> 
>> On Mon, Aug 23, 2021 at 8:06 AM Tim Mackinnon <tim@testit.works> wrote:
>> 
>> As many have described, I’ve seen this work reasonably well too - while I’ve 
>> seen the pvt prefix convention, I’ve also seen _name used to - which I felt 
>> was marginally better (it also means private methods get grouped at the top 
>> of the “all list” and not alphabetically in the middle’ish (but it’s a minor 
>> thing as browser tools can filter appropriately anyway, and to be honest, 
>> showing private at the bottom or in a separate place is better).
>> 
>> It is worth saying however - that lots if pvt methods can be a code smell - 
>> it may be better to move them to a separate “policy object” and then focus 
>> on better delegation options - which I believe is where Pharo is heading 
>> with variables as first class objects (and hopefully Marcus will cover in 
>> the U.K. Smalltalk Meetup this week).
>> 
>> Too often we end up up with lots of sub classing and overriding and 
>> privatising - when there is a new object that could group all this stuff and 
>> the methods can be public in that delegate - while the delegate itself is a 
>> “private” object.
>> 
>> I think this should be explored more actually.
>> 
>> Tim
>> 
>>>> On 20 Aug 2021, at 11:19, Richard O'Keefe <rao...@gmail.com> wrote:
>>> 
>>> One of the claimed benefits of object-oriented programming is 
>>> ENCAPSULATION.
>>> The idea is that one of the ways a language helps you is by making some 
>>> errors
>>> difficult or impossible to express.
>>> One of the things you need to understand an object is its INVARIANT.
>>> For example, astc's SortedCollection includes
>>> 
>>> methods for: 'checking'
>>>   invariant
>>>     ^(opposite isNil or: [
>>>       opposite isKindOf: DyadicBlock]) and: [
>>>      super invariant and: [
>>>      (sortBlock
>>>        ifNil:    [(offset + 2 to: offset + size) allSatisfy: [:i |
>>>                    (array at: i-1) <= (array at: i)]]
>>>        ifNotNil: [(sortBlock respondsTo: #value:value:) and: [
>>>                    [(offset + 2 to: offset + size) allSatisfy: [:i |
>>>                      (sortBlock value: (array at: i-1)
>>>                                 value: (array at: i))]]]])]]
>>> 
>>> Private methods are allowed to break the invariant.
>>> Public methods are not.
>>> 
>>> For example, consider reversing a SortedCollection.
>>> Part of this changes the order of the elements, and can be
>>> shared with OrderedCollection.  Part of it swaps the arguments
>>> of the sortBlock, and cannot be shared.
>>> 
>>> methods for: 'rearranging'
>>>   pvtPrereverse
>>>     |t|
>>>     opposite
>>>       ifNil: [
>>>         sortBlock ifNil: [sortBlock := Magnitude defaultSortBlock].
>>>         t := sortBlock.
>>>         opposite := sortBlock.
>>>         sortBlock := [:x :y | t value: y value: x]]
>>>       ifNotNil: [
>>>         t := sortBlock.
>>>         sortBlock := opposite.
>>>         opposite := t].
>>> 
>>> If this method could be called from "outside", it would certainly break
>>> the invariant and leave the object in an unusable state.
>>> 
>>> Now a style rule doesn't *quite* prevent this method being called by
>>> another object.
>>> It is necessary to make sure that #perform: and friends cannot break
>>> encapsulation
>>> either, and this astc does by simply not creating Selector objects for
>>> private methods.
>>> 
>>> Yes, it is a small increase in the complexity of the language, however
>>> - you are not forced to write private methods
>>> - if you run code that uses the pvt* convention in a Smalltalk that does
>>> not use that convention, it works, it's just not safe any longer
>>> - it is not an arbitrary addition to the language, it is a restriction that
>>> makes programming *easier*.
>>> 
>>> Let's look at one additional example.
>>> Behavior>>
>>> new
>>>   ^ self basicNew initialize
>>> 
>>> This means that *any* object can forcibly reinitialize *any* object it can
>>> reach at *any* time.  In astc, it's
>>> 
>>> new
>>>   "other checks"
>>>   ^self pvtNew pvtPostNew
>>> 
>>> and an object cannot be reinitialised against its will.
>>> 
>>> There is a long standing tradition of "program for the typical case and 
>>> trust
>>> the omniscient programmer to know what will probably work and what won't"
>>> in Smalltalk.  This is why in many Smalltalks
>>> aCollection addAll: aCollection
>>> or
>>> aCollection removeAll: aCollection
>>> can go insane for some common collections.  And one *DOES* get away
>>> with it most of the time.  It's typically when someone else triest to use 
>>> your
>>> code and doesn't know the assumptions you didn't bother to write down
>>> that things go wrong.  It's obvious that Pharo has got to where it
>>> amazingly well is without the "bondage and discipline" of, say, Ada or
>>> Agda.  But there is a *reason* why Pharo has lint checking on by default.
>>> 
>>>> On Fri, 20 Aug 2021 at 00:59, Jesus Mari Aguirre <jmariagui...@gmail.com> 
>>>> wrote:
>>>> 
>>>> Please keep Pharo simple, why do you need private methods...you can 
>>>> include then in a protocol named private...other language have 
>>>> it...yes...next addition will be namespaces...other...I don't know...at 
>>>> last we have Java
>>>> 
>>>> El jue., 19 ago. 2021 9:00, Richard O'Keefe <rao...@gmail.com> escribió:
>>>>> 
>>>>> Many years ago there was a proposal in the Squeak mailing list about 
>>>>> enforcing
>>>>> a naming convention, "pvt",  I implemented that in my Smalltalk system.  
>>>>> The
>>>>> compiler enforces the rule that pvt.[A-Z].* message can only be sent to
>>>>> (self|super) (basicNew|basicNew: n|new|new: n|pvtNew: n)?
>>>>> in a class method or
>>>>> (self|super) ((class (new|new: n)|pvtSpeciesNew: n|pvtClone)?
>>>>> in an instance method.
>>>>> There are currently
>>>>> 9412 public selectors
>>>>> 793 pvt* selectors and
>>>>>  23 private* selectors,
>>>>> where the last group is methods that I *want* to be private in some sense 
>>>>> but
>>>>> cannot do with this machinery.  (For example, calling a "private" method 
>>>>> on
>>>>> another object known to be of the same class.)
>>>>> 
>>>>> I think the evidence shows that this works well enough to be useful, even 
>>>>> if it
>>>>> isn't quite as expressive as I'd like.  And what *that* means is that
>>>>> this can be
>>>>> done with a style check, using the machinery Pharo already has for style 
>>>>> checks.
>>>>> 
>>>>> 
>>>>> 
>>>>> On Wed, 18 Aug 2021 at 08:14, Craig Johnson <cr...@hivemind.net> wrote:
>>>>>> 
>>>>>> Hi All,
>>>>>> 
>>>>>> 
>>>>>> Just a newb off-the-wall question.
>>>>>> 
>>>>>> Is there any good reason why we can't create a true private method in a
>>>>>> Pharo class by putting that method inside an instance or class variable
>>>>>> as a lambda (block).
>>>>>> 
>>>>>> 
>>>>>> This would reduce one of my biggest bugbears with Pharo, namely the
>>>>>> pollution of the global namespace with every single message name in the
>>>>>> entire system.
>>>>>> 
>>>>>> 
>>>>>> 
>>>>>> Craig

Reply via email to