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

Bert Freudenberg bert at freudenbergs.de
Fri Mar 2 14:31:48 UTC 2007


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 -






More information about the Beginners mailing list