[Newbies] Re: Alternative for static const...

Mispunt mispunt at users.sourceforge.net
Fri Mar 2 07:54:40 UTC 2007


Well, I don't have thousands of methods :) but when the application is
running to slow, I will remember this option :)

On 3/2/07, David Mitchell <david.mitchell at gmail.com> wrote:
> Another alternative is to create a class with a bunch of methods that
> represent the constants. The methods are simple:
>
> codeThatMeansSomething
> ^'16r1F'
>
> The neat thing is that it is dynamic and all the rules of late binding
> and message lookup come into play, you can build object structures with
> proxies, decorators, composites, and so on.
>
> I actually did this on a large system (for money). It started out as a
> bunch of tables and we ended up with 3 instances that had rather insane
> interfaces (thousands of methods*). We thought it would be really slow,
> but it turned out to be measurably faster than dictionary lookups. Even
> better, we had revision history for our "dictionaries" because it was
> all methods.
>
> * Oh, wait, I forgot I was in Squeak. Thousands of methods is no big deal.
>
>
> Bert Freudenberg wrote:
>
> > On Feb 27, 2007, at 10:08 , Mispunt wrote:
> >
> >> Hi all,
> >>
> >> For programming my Lego Mindstorms NXT I have to use codes like 16r1F.
> >> But I actually want to be able to use "readable" codes. In a language
> >> like Java I will do that with a static const, but as far as I know I
> >> have to do it with symbols in Smalltalk.
> >
> >
> > No, there is a better way.
> >
> > If you are inside one class (or its subclasses), you would use "class
> > variables", one per constant. You add them in the class template:
> >
> > Object subclass: #Bla
> >     instanceVariableNames: ''
> >     classVariableNames: 'Const1 Const2'
> >     poolDictionaries: ''
> >     category: 'Bert-Bla'
> >
> > and the initialization code is in a class-side #initialize method:
> >
> > initialize
> >     "self initialize"
> >     Const1 := 16r1F.
> >     Const2 := 12345.
> >
> > You need to execute the "self initialize" in the browser to do the
> > initialization. It will be executed automatically when loaded into
> > another image.
> >
> > Class variables are capitalized because they are sort-of "global",
> > they can be used in the defining class, its metaclass, and all their
> > subclasses. If you need to give access to these variables across the
> > class hierarchies, then you would do the same, but as a subclass of
> > SharedPool:
> >
> > SharedPool subclass: #BlaConstants
> >     instanceVariableNames: ''
> >     classVariableNames: 'Const1 Const2'
> >     poolDictionaries: ''
> >     category: 'Bert-Bla'.
> >
> > To use this "pool" of variables in another class, list it as a "pool
> > dictionary":
> >
> > Object subclass: #Bla
> >     instanceVariableNames: ''
> >     classVariableNames: ''
> >     poolDictionaries: 'BlaConstants'
> >     category: 'Bert-Bla'
> >
> > This makes all class variables of BlaConstants available to Bla as if
> > they were class variables.
> >
> > There are quite a few other ways to allow "global" variables in
> > Smalltalk, but this one is the "clean" way to do it which works
> > nicely with tools like Monticello.
> >
> > - Bert -
> >
> >
> >
> > _______________________________________________
> > Beginners mailing list
> > Beginners at lists.squeakfoundation.org
> > http://lists.squeakfoundation.org/mailman/listinfo/beginners
> >
>
>
> _______________________________________________
> Beginners mailing list
> Beginners at lists.squeakfoundation.org
> http://lists.squeakfoundation.org/mailman/listinfo/beginners
>


More information about the Beginners mailing list