About reflection and it engineering
Roel Wuyts
Roel.Wuyts at ulb.ac.be
Thu Nov 6 07:41:42 UTC 2003
See also things done by Noury Bouraqadi (using mixins for metaclass
composition - see the ESUG Academic Track page for the papers on
http://esug2003.esug.org/academic.htm) and related work by us using
Traits for the same purpose (mail me for the reference; it is submitted
but not yet published).
On Wednesday, Nov 5, 2003, at 21:21 Europe/Zurich, Sam Adams wrote:
>
>
>
>
> (ahh, one of my favorite topics)
>
> I agree with Jecel from a concrete instance perspective, but from a
> more
> abstract perspective (including the fact that metaclasses and
> Metaclass are
> implemented using classes and instances) you really only have three
> metalevels implemented in Squeak:
>
> -Instances (objects having private data, shared structure and shared
> behavior (via their common class))
> -Classes (objects that are instances, but then define the shared
> structure
> and behavior for a lower metalevel of their instances)
> -Metaclasses (objects that define the structure and behavior for a
> lower
> metalevel of their instances (which in fact are classes)
>
> In Smalltalk, metaclasses are instances that model classes, and
> Metaclass
> is the class for all models of classes.
>
> Of course, we can't have "turtles all the way down", so Metaclass
> itself is
> modeled and implemented by subinstances of itself.
>
> It is amazing how much value we have recieved from this model, but as
> Alan
> has mentioned on occasion, we have rarely revisited Metaclass or
> thought of
> its potential siblings.
>
> Years ago when I taught lots of classes on Smalltalk, someone in each
> class
> always asked the "so what is the class of a class of a class?"
> question.
> Its not necessary to understand the answer to get lots of value from
> Smalltalk, but a thought vacation to metaland can be very interesting.
> It
> can also give you a powerful lever on design complexity in many
> domains.
>
> <meta-meta-meta-meta>
> Consider that there is effectively only one Metaclass in Squeak, in
> that
> all classes have a fixed set of ways to define their structure and
> behavior
> and that of their instances. But that one Metaclass defines the entire
> universe of all classes and instances directly implementable in
> Smalltalk.
> (Of course, you can use Smalltalk to indirectly model almost any
> concept,
> but not directly in the sense that you have to create a simulacrum of
> your
> concepts using the Smalltalk concepts of objects, instances, classes,
> messages, methods, etc.)
>
> Now can other kinds of Metaclass exist? Of course they can, and each
> would
> provide a definition for an entirely separate universe of classes and
> instances parallel to the currently Smalltalk universe. For example, a
> class system where all classes must have two and only two
> superclasses, and
> are limited to integer instance variables and unary messages. At this
> metalevel you would find Metaclasses that define entirely distinct
> object
> systems, including lots of those other "object" languages.
>
> If we then can have lots of sibling Metaclasses, what might their class
> look like? <brain hurts> and their class? <brain turns to mush>
>
> A practical application of this meta-mumbling can be found in many
> applications and be straightforwardly implemented in Smalltalk. It is
> not
> uncommon to have real world domains that have their own class-instance
> relationships *in the domain*. For instance, a bank offers several
> kinds
> of account services, say checking and savings. You can directly
> implement
> two account models, perhaps using inheritance to save a little
> recoding,
> and you have your system. You can have CheckingAccount and
> SavingsAccount
> classes, and their instances will hold the account data for each
> customer.
> Note that you have specific classes modeling specific account types and
> their instances modeling accounts.
>
> But what happens when the bank wants to add money-market accounts?
> You can
> of course model those in Smalltalk and add new code, but what if your
> bank
> wants an application that allows it to create new kinds of accounts on
> the
> fly with no new programming? This leads to a situation where many
> projects
> have created horrendously complex classes that attempt at once to model
> both the class-ness and instance-ness of the domain in the same object.
> Big mistake.
>
> What you have here is a situation where you need a "metaclass" of sorts
> that lets you define new types of accounts which can then have
> individual
> customer accounts based on them. You have the same
> Metaclass-Class-Instance relationships that exist in the Smalltalk
> system,
> but you are implementing them on top of the existing Smalltalk system,
> using its classes and intances. Confused yet?
>
> To be more direct, you create a class (say AccountType) in Squeak whose
> instances are different types of accounts, and then create a class (say
> Account) in Squeak whose instances are the individual accounts
> themselves,
> but act as if they were instances of the instances of AccountType. The
> AccountType instances would define the structure(data) and
> behavior(policies, notifications, etc) for the Account instances. Each
> Account instance would upon creation refer to its AccountType "class"
> for
> details of what kind of private data structure (variables) to
> construct.
> During later execution, the Account instance would refer to its
> AccountType
> "class" for its behavior, which would be shared across all Acount
> instances
> referencing the same AccountType "class".
>
> There is *lots* of programming power in this approach, and for all its
> inherent complexity, it can dramatically reduce the complexity of
> competing designs suffering from "domain class-instance confusion".
> This
> approach has been proven many times in systems ranging from global
> trading
> to semiconductor manufacturing to custom billing systems to not-a-few
> AI
> applications. It takes some work to wrap your head around it, but its
> well
> worth the effort.
> </meta-meta-meta-meta>
>
> Regards,
> Sam
>
>
> Sam S. Adams, IBM Distinguished Engineer, IBM Research
> tie line 444-0736, outside 919-254-0736, email: ssadams at us.ibm.com
> <<Hebrews 11:6, Proverbs 3:5-6, Romans 1:16-17, I Corinthians 1:10>>
>
>
>
> |---------+--------------------------------------------->
> | | Jecel Assumpcao Jr |
> | | <jecel at merlintec.com> |
> | | Sent by: |
> | | squeak-dev-bounces at lists.squeakfou|
> | | ndation.org |
> | | |
> | | |
> | | 11/05/2003 01:13 PM |
> | | Please respond to The |
> | | general-purpose Squeak developers |
> | | list |
> | | |
> |---------+--------------------------------------------->
>> ----------------------------------------------------------------------
>> -----------------------|
> |
> |
> | To: The general-purpose Squeak developers list
> |
> | <squeak-dev at lists.squeakfoundation.org>
> |
> | cc:
> |
> | Subject: Re: About reflection and it engineering
> |
> |
> |
>> ----------------------------------------------------------------------
>> -----------------------|
>
>
>
>
> On Monday 03 November 2003 18:50, ducasse wrote:
>> On Lundi, nov 3, 2003, at 15:04 Europe/Zurich, Serge Stinckwich wrote:
>>> Do you know why the authors call Squeak a 5-metalevel system and
>>> Little-Smalltalk a 3-metalevel system ?
>>
>> No I read that too.
>
> It is unlikely I will find time to read the paper this year, so I could
> be totally wrong. But the original Little Smalltalk used:
>
> instance ==> class ==> Class
>
> while Squeak has
>
> instance ==> class ==> metaclass ==> Metaclass ==> Metaclass class +
> ^ +
> +==========================+
>
> The three level system was also used in Smalltalk-76. You can't have
> class variables and such with it, which I don't think is such a huge
> loss. Anyway, I think Little Smalltalk has since "evolved" to a more
> complicated system.
>
> -- Jecel
>
>
>
>
>
Roel Wuyts
DeComp
roel.wuyts at ulb.ac.be Université Libre de
Bruxelles
http://homepages.ulb.ac.be/~rowuyts/
Belgique
Board Member of the European Smalltalk User Group: www.esug.org
More information about the Squeak-dev
mailing list
|