When the top-down and bottom-up drives collide, the result
is often a mess. The top layer of application logic and the bottom
layer of domain primitives have to be impedance-matched by a layer of
glue logic.
One of the lessons Unix programmers have learned over decades is
that glue is nasty stuff and that it is vitally important to keep glue
layers as thin as possible. Glue should stick things together, but
should not be used to hide cracks and unevenness in the layers.
In the Web-browser example, the glue would include the rendering
code that maps a document object parsed from incoming HTML into a
flattened visual representation as a bitmap in a display buffer, using
GUI domain primitives to do the painting. This rendering code is
notoriously the most bug-prone part of a browser. It attracts into
itself kluges to address problems that originate both in the HTML
parsing (because there is a lot of ill-formed markup out there) and
the GUI toolkit (which may not have quite the primitives that are
really needed).
A Web browser's glue layer has to mediate not merely between
specification and domain primitives, but between several different
external specifications: the network behavior standardized in
HTTP, HTML document structure, and various graphics and multimedia
formats as well as the users' behavioral expectations from the
GUI.
And one single bug-prone glue layer is not the worst fate that can
befall a design. A designer who is aware that the glue layer exists,
and tries to organize it into a middle layer around its own set of
data structures or objects, can end up with
two
layers of glue — one above the midlayer and one below.
Programmers who are bright but unseasoned are particularly apt to fall
into this trap; they'll get each fundamental set of classes
(application logic, midlayer, and domain primitives) right and make
them look like the textbook examples, only to flounder as the multiple
layers of glue needed to integrate all that pretty code get thicker
and thicker.
The thin-glue principle can be viewed as a refinement of the
Rule of Separation. Policy (the application logic) should be cleanly
separated from mechanism (the domain primitives), but if there is a
lot of code that is neither policy nor mechanism, chances are that it
is accomplishing very little besides adding global complexity to the
system.
[an error occurred while processing this directive]