[pro] When to use SLOT-VALUE...

Hans Hübner hans.huebner at gmail.com
Mon Nov 22 12:51:25 UTC 2010


By private email, James Anderson pointed out that accessors are
traceable, whereas SLOT-VALUE is not.  To me, that is the most
convincing argument for always using accessors, even in class-internal
initialization code.

Thanks for all your input!

-Hans

On Tue, Nov 16, 2010 at 11:05 AM, Hans Hübner <hans.huebner at gmail.com> wrote:
> Hi,
>
> The company I work for has a Common Lisp style guide that generally
> disallows using SLOT-VALUE.  Instead, accessor should be used so that:
> BEFORE and :AFTER methods are always invoked when accessing a slot.
> Generally, I think this is a good idea when looking at classes and instances
> from the outside.  Slots should be considered as being an implementation
> detail, and users (i.e. client code and derived class methods) should not
> make assumptions about how functionality is implemented.
>
> Now, I often have the need for class instances that are constant in some
> respect, i.e. some properties of the instance that are implemented using
> slots can't directly be changed.  I often declare such slots havin only a:
> READER in the class definition, which makes the read-only nature of this
> slot apparent right away.
>
> Of course, such slots need to be initialized somehow. An :INITARG sometimes
> does the trick, but it is more common that the value of such slots is
> calculated and recalculated during the lifetime of the instance, and as such
> the slot's value must be set.
>
> Now, from the perspective of seeing the class declaration as documenting the
> visible behavior of instances of a class, it does not seem to be proper to
> declare an accessor to be used in class-internal code so that the slot's
> value can be updated.  Instead, I think that it is better to use SLOT-VALUE
> to mess with the guts of an instance from code that is part of the guts
> itself.
>
> Of course, one may want to argue that DEFCLASS forms should not be
> considered to be an interface definition. Instead, one could call for a
> series of DEFGENERIC forms to define the external interface of some "module"
> and make class definitions be internal. From a more practical perspective,
> though, class definitions in CL serve both as interface and implementation
> definition, thus it seems to be appropriate using the mechanisms provided by
> CLOS to support both uses.
>
> How do others use or avoid SLOT-VALUE? Is it frowned upon in your company's
> or project's (verbal) style guide?
>
> Thanks for your input,
> Hans
>




More information about the pro mailing list