Need feedback on simple idea
Andreas Raab
andreas.raab at gmx.de
Sat Apr 12 00:25:20 UTC 2003
Right on! Thanks for putting it so clearly.
Cheers,
- Andreas
> -----Original Message-----
> From: squeak-dev-bounces at lists.squeakfoundation.org
> [mailto:squeak-dev-bounces at lists.squeakfoundation.org] On
> Behalf Of Nathanael Schärli
> Sent: Friday, April 11, 2003 7:30 PM
> To: 'The general-purpose Squeak developers list'
> Subject: RE: Need feedback on simple idea
>
>
> Hi Martin,
>
> > But you loose something, namely encapsulation. Every object outside
> > morph can screw the state of this morph, without doing
> 'more' to it,
> > meaning this morph will be put in an unvalid state.
>
> I think that the argument about "loosing encapsulation" is complete
> bogus because it has no relevance in practice. In fact, encapsulation
> means:
>
> "The idea of encapsulation in programming languages comes
> from abstract
> data types. In this view, an object has an interface part and an
> implementation part. The interface part is the specification
> of the set
> of operations that can be performed on the object. It is the only
> visible part of the object. The implementation part has a
> data part and
> a procedural part. The data part is the representation or state of the
> object and the procedure part describes the implementation of each
> operation."
>
> Since the Smalltalk language has no concept of encapsulating
> behavior, I
> really don't think that it makes much difference whether you can
> encapsulate state or not. An average class typically has tons of
> "private" methods that are exposed to the outside anyway, and thus,
> every outside object can (at least indirectly) screw with the state of
> such an object anyway.
>
> As an example, just take the class Morph you were talking about. This
> class implements 1088 methods and does not provide any operational
> encapsulation whatsoever. This means that there are tons of
> methods that
> every outside object can call to screw the state of a Morph.
>
> Besides methods that indirectly screw state (e.g, #moveWithPenDownBy:,
> #privateFullMOveBy:), there are ironically even methods such as
> #privateColor:, #privateBounds:, #privateOwner:, #privateSubmorphs:,
> etc. that do exactly what you say you don't like, namely directly
> exposing state. (BTW: #privateOwner: has 33 senders and many
> of them are
> outside Morph).
>
> And Morph is not an exception. In the opposite, many other classes are
> even worse. As an example, the class OrderedCollection
> contains methods
> such as #insert:before:, #removeIndex, etc. that operate
> directly on the
> internal array. (This means that executing "aCollection
> removeIndex: 3"
> actually removes the object at the 3th position in the internal array,
> and not the object at the 3th position of the collection!!). In
> addition, there are is also a methods #setCollection: which
> again allows
> any outside object to directly mess with the internal state.
>
> Looking at Squeak you will see that:
>
> - Most of the classes have many "private helper methods" that allow an
> external object to screw with the state. (Just think: If you really
> program in a structured way, a Smalltalk method typically has
> just about
> 5 lines, all the rest is factored out into "helper methods".
> This means
> that for each of these methods you typically get a couple helper
> methods).
>
> - Classes typically only have a a handful (or even less)
> slots. Usually,
> the number of slots is way smaller than the number of methods in the
> "private" protocol. (As an example, OrderedCollection only has 3 slots
> (array, firstIndex, lastIndex) and it implements 12 "helper methods"
> that allow one to screw with these slots no mater what).
>
> Now, please explain me why you say that it is precisely this small set
> of accessor methods that would make us "loose" encapsulation? Do you
> really think ST has encapsulation now? And let me ask you another
> question: If you care so much about encapsulation, would you then like
> to see a clean language-level encapsulation mechanism in Squeak that
> would provide _real_ encapsulation (meaning a consistent ans unifying
> encapsulation mechanism for any sort of implementation, no matter
> whether it is state or behavior)? If no, then explain me why you
> criticize getting an average of maybe 6 unencapsulated accessors per
> class if an average class maybe already has 10 of them anyway? I think
> this is quite hypocritical.
>
> Nathanael
>
>
>
> > From: Martin Wirblat <sql.mawi at t-link.de>
> > Date: Fri Apr 11, 2003 1:46:37 PM Europe/Zurich
> > To: Squeak <squeak-dev at lists.squeakfoundation.org>
> > Subject: Re:Need feedback on simple idea
> > Reply-To: The general-purpose Squeak developers list
> > <squeak-dev at lists.squeakfoundation.org>
> >
> > Maybe simple but not a good idea IMHO.
> >
> > Stephane Ducasse <ducasse at iam.unibe.ch> wrote on 10.04.2003
> 21:36:42:
> >> Applicability to Squeak:
> >> - would break all the accessors that do something more
> that accessing
> >> (self changed) but we could use a dedicated
> parser/compiler so that
> >> the changes only impact a subset.
> >
> > 'Accessors' which do more than accessing are good programming style.
> > They do what they promise to do ( morph color: Color red ). For the
> > programmers mind programming is speaking a language.
> >
> > There is no disadvantage from the point of view of speaking
> a language
> > with: 'color := x' instead of 'morph color: x' if color: is
> simply the
> > accessor. You gain nothing here. The simplicity of which you are
> > talking ( to have 1 instead of 2 methods of access ) is compared to
> > the complexity of the library so minimal, that it is meaningless.
> >
> > But you loose something, namely encapsulation. Every object outside
> > morph can screw the state of this morph, without doing
> 'more' to it,
> > meaning this morph will be put in an unvalid state.
> >
> > I know there are people who believe that it is bad style to access
> > inst vars directly, but I think it is the other way round.
> I think it
> > is bad style to mix 'accessors' with 'accessors which do
> more' and to
> > not use direct access. In such a system you don't know if
> you have to
> > do more after sending such a message, you will have to look
> into the
> > definition of this 'accessor'. The selector itsself is not
> informing
> > you about what is going on. Even the existence of the
> method tells you
>
> > nothing, because it has to exist.
> >
> > The conclusion for existing standard Smalltalks:
> >
> > 1) Whereever you can use direct access instead of sending
> the access-
> > only-message you should access directly, to make clear that
> there will
>
> > be done nothing else.
> >
> > 2) 'Accessors' should exist only if it is OK to use them from the
> > outside. They may do more than simply access the inst var, however
> > after sending them, the receiver has to be in a consistent
> state. So
> > the existence indicates: there is nothing to do for you afterwards.
> >
> > With the idea in question
> >
> > 1) the accessor-selector itself will not tell you if you have to do
> > something else.
> >
> > 2) the accessor-method will have to exist, so you will a) weaken the
> > encapsulation and b) its existence can't tell you anything.
> >
> > regards, Martin
>
>
More information about the Squeak-dev
mailing list
|