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