[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