[squeak-dev] Re: [ANN] Preference pragmas
Andreas Raab
andreas.raab at gmx.de
Fri Mar 6 05:09:26 UTC 2009
Hi -
To get back to the original question, Michael Rueger wrote:
> Looking at your version I see you made some slightly different design
> choices than in the design that has been in design discussion and worked
> on in the last couple of weeks on the Pharo list.
>
> Can you elaborate what motivated the different design? Meaning what
> parts of the Pharo version could be made better?
Now that I've looked at Alain's code I can make a clearer statement
about it. I was misled a little at first by the similarities in the
pragma spec but the philosophy behind both implementations is actually
fairly different.
Alain's implementation of preferences is an improvement on the current
preference system but it is effectively replacing one set of
dependencies with a different set of dependencies. Where previously
Preferences would be registered and stored via Preferences
addPreference:... in Alain's approach preferences get created via (the
old version):
gradientButtonLook
<preference: 'Gradient look for buttons' type: #Boolean set:
#gradientButtonLook: defaultValue: true description: 'Gradient look for
buttons'>
^ GradientButtonLook
ifNil: [GradientButtonLook := PreferenceValue
value: true
location: self
selector: #gradientButtonLook]
or, with the latest:
gradientButtonLook
<preference>
^ GradientButtonLook
ifNil: [GradientButtonLook := PreferenceValue
name: 'Gradient look for buttons'
description: 'Gradient look for buttons'
parent: #uiPreferenceNode
type: #Boolean
default: false]
In other words, a dependency (to either PreferenceNode, PreferenceValue,
RangePreferenceValue, MultiplePreferenceValue etc) is created and stored
client-side.
My approach differs in such that it is aimed at being discoverable
without introducing any dependencies. To illustrate, please load the
latest (updated) version via:
Installer mantis bug: 7306 fix: 'PreferencePragmas.2.cs'.
Preferences registerForEvents.
And then do the following. Go into class MessageTally (to stay on-topic
;-) and change the method #defaultPollPeriod to read:
defaultPollPeriod
"Answer the number of milliseconds between interrupts for spyOn: and
friends.
This should be faster for faster machines."
<preference: 'Default Poll Period'
category: 'Profiling'
description: 'The default poll period (msecs) MessageTally uses'
type: #Number>
^DefaultPollPeriod ifNil: [ DefaultPollPeriod _ 1 ]
(yes, the spec has changed a tiny bit; I like Alain's 'description'
terminology better) Accept the method and open a preference browser.
Voila! There is a brand new "Profiling" category which allows you to set
MessageTally's default poll period. No further changes required.
However, since this was discovered via pragmas, no dependency between
Preferences and MessageTally has been created. You can remove or replace
the preferences implementation in the image without any side effects
whatsoever on MessageTally or its code. A different preference
implementation can discover the same preference and present it
accordingly. This allows adding preferences wherever is convenient
without needlessly introducing dependencies on a particular preference
implementation or UI.
In Alain's version this would not be possible without actually changing
code since it is directly coupled to a particular preference class and API.
Bottom line: I think my approach is a necessity before Alain's
preference implementation can be usefully deployed. It allows us to
define preferences without introducing dependencies to specific
implementations, while allowing different implementations to discover
the same preferences.
I hope this makes the conceptual difference clear.
Cheers,
- Andreas
More information about the Squeak-dev
mailing list
|