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

David Mitchell david.mitchell at gmail.com
Sat Mar 3 19:46:00 UTC 2007


Well, I missed the fact that the codes weren't strings, so that part is
my bad.

My point was simply that I've found it useful to have an object whose
methods are acting as the keys in a dictionary.

This works regardless of what objects were the values.

Bert Freudenberg wrote:

> Did I miss a smiley?
>
> Returning a string makes no sense at all given the OP.
>
> And that new meme of senselessly adding #copy to every literal string  
> is a bad one. Stop it.
>
> - Bert -
>
> On Mar 2, 2007, at 15:23 , Ron Teitelbaum wrote:
>
>> codeThatMeansSomething
>>     ^'16r1F' copy
>>
>> Is better!
>>
>> Ron
>>
>>> From: David Mitchell
>>>
>>> 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
>




More information about the Beginners mailing list