Re: Schema Design: Composition vs Subclassing

Jeni Tennison wrote:

> Could you expand on how you see Delegation being used within an XML
> Schema such that an application can take advantage of it in the same
> way as it could were the type hierarchy used?
> 
> For example, given the Camera type hierarchy described in your web
> page, I could (eventually, come XSLT 2.0) do:
> 
> <xsl:template match="*[type() = 'Camera']">
>   ... do some processing common to all cameras ...
> </xsl:template>
> 
> How do you see the Delegation pattern helping here?

In the design-by-composition approach we have this collection of
elements:

camera
  - lens
  - housing
  - recording-medium(abstract)
       ^
       |
       ---------- 35mm or disk or 3x5 etc

A stylesheet application can process a camera element by delegating to
each subordinate element:

<xsl:template match="camera">
    <!-- delegate to lens element -->
    <xsl:apply-templates select="lens"/>
    <!-- delegate to housing element -->
    <xsl:apply-templates select="housing"/>
    <!-- delegate to whatever recording-medium component is present -->
    <xsl:apply-templates select="*[last()]"/>
</xsl:template>

As new types of recording-medium components are required we simply drop
in a template rule.  For example:

<xsl:template match="35mm">
  ... process 35mm recording-medium ...
</xsl:template>

<xsl:template match="disk">
  ... process disk recording-medium ...
</xsl:template>

<xsl:template match="3x5">
  ... process 3x5 recording-medium ...
</xsl:template>

All of these recording-medium components have a type that is the same
as, or derived from, the recording-medium-type.  Thus, if desired, we
could have a single template rule for all there recording-medium
components:

<xsl:template match="*[type() = 'recording-medium-type']">
  ... do some processing common to all recording-medium components ...
</xsl:template>

The important point is that an application can process the camera by
delegating to each of its subordinate elements.  /Roger

Received on Tuesday, 16 April 2002 10:24:23 UTC