Excellent!

Thank you.

jrs

On May 18, 2006, at 9:06 AM, P T Withington wrote:

> Since the developer's guide is aimed (mostly) at the LZX programmer, 
> it should just say that it is best practice to declare all the 
> attributes of your class and to give them default values.  Adding 
> attributes to a class at run time is discouraged as it impacts both 
> the performance and safety of your code.
>
> For a default value, it is preferable to use a value of the expected 
> type.  E.g., for a boolean attribute, use `true` or `false`, rather 
> than `null` (or no default).  `null` and the undefined value are 
> equivalent to `false` in a boolean context, but if you mean false, say 
> so; don't leave future maintainers mystified over whether you might 
> have meant your attribute to behave differently for null and false 
> (yes, there are such attributes in the LFC and they should be 
> documented with blinking red text).
>
> For an attribute that expects an object value, it may be that `null` 
> is the only sensible default value, but often it will be worthwhile to 
> consider either initializing the attribute to an 'empty' instance or 
> giving the attribute a 'sentinel' instance that can act as a marker 
> for the default value, and will behave innocuously if it is accessed.  
> If you use `null` as the default value, then everywhere in your code 
> where you access this attribute, you need to first check if it is null 
> before you attempt to access its properties; if you use a sentinel 
> object, then your code can safely access the sentinel's properties and 
> you only need to check for the sentinel when you are trying to 
> determine if the attribute has other than default properties.
>
> A simple example:  you have an attribute that is an Array of values.  
> You have three choices for initialization:
>
> o `null` -- which you have to check for each time you access the 
> attribute
>   very efficient, least safe (must check every access)
> o `new Array` -- which means you will allocate an empty array for each 
> instance
>   less efficient, very safe (always of correct type)
> o a sentinel array -- which you will have to replace when you add 
> values
>   moderately efficient, moderately safe (must check on modifying 
> access)
>
> <!-- Null default, must check on each access -->
> <attribute name="valueList" value="null" />
> <method name="addValue" args="value">
>   if (! valueList) {
>     this.valueList = new Array;
>   }
>   valueList.push(value);
> </method>
> <method name="getValues">
>   if (! valueList) {
>     this.valueList = new Array;
>   }
>   return valueList;
> </method>
>
> <!-- Empty default, cost at creation, but no checking required -->
> <attribute name="valueList" value="$once{new Array}" />
> <method name="addValue" args="value">
>   valueList.push(value);
> </method>
> <method name="getValues">
>   return valueList;
> </method>
>
> <!-- Sentinel default, only check on setting, not getting -->
> var emptyList = new Array;
> <attribute name="valueList" value="emptyList" />
> <method name="addValue" args="value">
>   if (valueList === emptyList) {
>     this.valueList = new Array;
>   }
>   valueList.push(value);
> </method>
> <method name="getValues">
>   return valueList;
> </method>
>
>
> On 2006-05-18, at 08:03 EDT, John Sundman wrote:
>
>> I have followed this discussion with great attention and even greater 
>> head-scratching, trying to figure out what, if anything I should add 
>> to the Developer's Guide about checking for the existence of 
>> properties.
>>
>> It seems to me that the first sentence of Tucker's message, below, is 
>> basically all I need to say on the topic. Any deviations from "good 
>> software engineering practice" being beyond the scope of OpenLaszlo 
>> docs.
>>
>> If I should say anything else, please let me know what it is.
>>
>> Thanks,
>>
>> jrs
>> On May 12, 2006, at 1:33 PM, P T Withington wrote:
>>
>>> I think it is best to define all your properties, rather than relying
>>> on it not being an error to reference an undefined property.  It's
>>> good software engineering, and I think we will see Javascript tending
>>> in a direction where you have to give up this kind of dynamicity for
>>> performance anyways (IOW, it will cost you more to reference a non-
>>> existent property than a property declared with a default).
>>>
>>> Remember also that many times you can set a default value on the
>>> class prototype and get it 'for free' in all the instances of the 
>>> class.
>>>
>>> On 2006-05-12, at 09:19 PDT, Philip Romanik wrote:
>>>
>>>> Thanks Tucker!
>>>>
>>>> I have a related question. When I find object properties that are
>>>> not defined, I am giving them an initial value of null. This
>>>> eliminates the problem with undefined and allows me to do this,
>>>>
>>>>     if (this.somevariable)
>>>>         ...
>>>>
>>>> in the code. This makes cleaner code but it does potentially define
>>>> a lot of properties that are not often used.
>>>>
>>>> Any advice?
>>>>
>>>> Phil
>>>>
>>>>
>>>>> `in` is not yet supported in the SWF runtime.
>>>>>
>>>>> `hasOwnProperty` is supported in both runtimes.  When we use `new
>>>>> Object` or literal objects to represent hash tables, best
>>>> practice is
>>>>> to use `hasOwnProperty` to detect the presence of a key in the
>>>>> table.  (Consider a table that might have the keys `toString`,
>>>>> `constructor`, etc. which are inherited by all objects:  only
>>>>> `hasOwnProperty` can tell if those keys are in the table or not.)
>>>>>
>>>>> So my recommendation to Phil is to use `hasOwnProperty` anywhere it
>>>>> is clear that we are using an object as a hash table and only 
>>>>> resort
>>>>> to `[]` or `typeof` if it is not clear.
>>>>
>>>
>>> _______________________________________________
>>> Laszlo-dev mailing list
>>> [email protected]
>>> http://www.openlaszlo.org/mailman/listinfo/laszlo-dev
>>
>

_______________________________________________
Laszlo-dev mailing list
[email protected]
http://www.openlaszlo.org/mailman/listinfo/laszlo-dev

Reply via email to