Differences
This shows you the differences between two versions of the page.
Both sides previous revision Previous revision Next revision | Previous revision Next revision Both sides next revision | ||
complexvalues [2019/01/04 12:47] christian [Anatomy of a Value] |
complexvalues [2019/01/04 16:50] christian [Anatomy of a Value] |
||
---|---|---|---|
Line 10: | Line 10: | ||
Now, I use Values for more than 10 years and I cannot do without it anymore. Most of the classes I define are Values. Objects are used for the " | Now, I use Values for more than 10 years and I cannot do without it anymore. Most of the classes I define are Values. Objects are used for the " | ||
+ | |||
+ | ==== Using Values ==== | ||
+ | |||
+ | To define a new Value class: | ||
+ | - create a new subclass of Value without instance variables and " | ||
+ | - edit he class method # | ||
+ | - add a pragma for each instance variable describing the variable | ||
+ | - open the popup menu on the new class and select "add Value methods..." | ||
+ | - edit the class method #example to provide a useful value | ||
+ | |||
+ | Done. | ||
+ | |||
+ | Now you have: | ||
+ | * a class with the specified instance variables | ||
+ | * an accessor for each variable with the same name | ||
+ | * an initializer with all parameters which sets up a fresh value | ||
+ | * a constructor taking all parameters and the sole caller of the initializer | ||
+ | * (2^^< | ||
+ | * an example | ||
+ | |||
+ | Lets have an example for example: | ||
+ | <code smalltalk> | ||
+ | Person | ||
+ | name: ' | ||
+ | sex: #male | ||
+ | birthday: (Date d: 25 m: 6 y: 1960) | ||
+ | </ | ||
+ | |||
+ | Withit you can: | ||
+ | * create a value with <code smalltalk> | ||
+ | * ask for its parts <code smalltalk> | ||
+ | * print it as code <code smalltalk> | ||
+ | ' | ||
+ | name: '' | ||
+ | sex: #male | ||
+ | birthday: (Date d: 25 m: 6 y: 1960)' "</ | ||
+ | * get the value from its code <code smalltalk> | ||
+ | * add fancy access methods like <code smalltalk> | ||
+ | weekdayAtBirth | ||
+ | ^self birthday weekday | ||
+ | </ | ||
+ | |||
==== Anatomy of a Value ==== | ==== Anatomy of a Value ==== | ||
Line 19: | Line 61: | ||
- sex | - sex | ||
- birthday | - birthday | ||
+ | |||
+ | Each variable has a simple getter method with a comment indicating the class. | ||
+ | |||
+ | <code smalltalk> | ||
+ | Person>> | ||
+ | "< | ||
+ | ^name | ||
+ | |||
+ | Person>> | ||
+ | "< | ||
+ | ^sex | ||
+ | |||
+ | Person>> | ||
+ | "< | ||
+ | ^birthday | ||
+ | </ | ||
The variables are set all at once by an initalizing method which has all initial values as parameters. | The variables are set all at once by an initalizing method which has all initial values as parameters. | ||
The object becomes immutable after initialization and all instance variables are effectively constants. | The object becomes immutable after initialization and all instance variables are effectively constants. | ||
+ | |||
+ | The parameter names are the concatenated name and its class. This prevents name clashes, is systematic and still readable. | ||
<code smalltalk> | <code smalltalk> | ||
- | Person>> | + | Person>> |
- | name := aString. | + | name := nameString. |
- | sex := aSymbol. | + | sex := sexSymbol. |
- | birthday := aDate. | + | birthday := birthdayDate. |
self beImmutable | self beImmutable | ||
</ | </ | ||
Line 34: | Line 94: | ||
<code smalltalk> | <code smalltalk> | ||
- | Person class>> | + | Person class>> |
| inst | | | inst | | ||
inst := self new. | inst := self new. | ||
- | inst initializeName: | + | inst initializeName: |
^inst | ^inst | ||
</ | </ | ||
Line 51: | Line 111: | ||
</ | </ | ||
+ | The initializer, | ||
+ | |||
+ | <code smalltalk> | ||
+ | Person class>> | ||
+ | < | ||
+ | < | ||
+ | < | ||
+ | </ | ||
+ | |||
+ | === Defaults === | ||
+ | |||
+ | The simple values above are not very interesting. But when you define defaults for some of the variables, Values become more useful. Lets add a nickname to the specification: | ||
+ | |||
+ | <code smalltalk> | ||
+ | Person class>> | ||
+ | < | ||
+ | < | ||
+ | < | ||
+ | < | ||
+ | </ | ||
+ | |||
+ | After generating code with: <code smalltalk> | ||
+ | |||
+ | <code smalltalk> | ||
+ | Person example nickname | ||
+ | </ | ||
+ | |||
+ | and there is a new constructor available: | ||
+ | <code smalltalk> | ||
+ | Person class>> | ||
+ | </ | ||
==== Get it ==== | ==== Get it ==== |