[Tweak] generic views [Was: Tweak position?]

Andreas Raab andreas.raab at gmx.de
Thu Feb 10 00:29:12 UTC 2005


Hi Howard,

I think this is very applicable to the overall discussion but I don't think 
it will have any immediate impact ;-) This is mostly because you'd probably 
have to spend significant amounts of time of getting the ground work for 
such a generic CLIM like viewing architecture into place *and* your clients 
need to be written that way. And what we're struggling with here is mostly 
legacy apps which we'd like to change as little as possible.

It is good food for thought though on the meta-level of Tweak programming. 
In many ways one could argue that the "matching" is somewhat equivalent to 
the process of choosing the right costume for the right player (e.g., the 
interaction methodology appropriate for some task). It's a really 
interesting exercise to see if a CLIM like methodology would make it easy to 
extend the Tweak player/costume architecture to a non-graphical kind of user 
interface (something that I have always had trouble with when it came to 
think about).

We should chat about this the next time we meet (this is something that I'd 
rather discuss over a beer than over a keyboard ;-)

Cheers,
  - Andreas

----- Original Message ----- 
From: "Howard Stearns" <HStearns at wisc.edu>
To: <tweak at impara.de>
Cc: "The general-purpose Squeak developers list" 
<squeak-dev at lists.squeakfoundation.org>
Sent: Wednesday, February 09, 2005 8:38 AM
Subject: [Tweak] generic views [Was: Tweak position?]


> I'd like to suggest a way to architect the problem technically. I  realize 
> it may duplicate what people are thinking, or be completely  incompatible, 
> or just plain irrelevant. Apologies. I've been lurking,  but don't have 
> the Squeak-specific background to know how far off the  mark the following 
> is.
>
> In my experience, some attempts at multiple view presentations have 
> failed because they fail to realize that there is more than one axis 
> along which to make decisions about what is in common between 
> presentations for different media-or-toolkits vs what is different.  It's 
> not just a matter of choosing inspector X or inspector Y, browser  X or 
> browser Y, at top level.
>
> For example, media-or-toolkit X may want to share structure with Y for 
> the two realizations of an inspector. In the HTML-generating world, for 
> example, systems like uPortal separate the structure of the  presentation 
> (defined using XSLT) from the style of the components of  that structure 
> (defined using CSS).  An application is broken down into  various 
> structures used for presentation (the XSLT part), and in  different 
> contexts the same application data might use different XSLT  to specify 
> that structure. Separately, the various bits of structure  that are 
> produced by one XSL or another might be styled using the same  CSS. Or 
> they might well use their own CSS. The point is that the  specification of 
> structure and style are separated.
>
> Of course, XSL and CSS don't provide for a lot of reuse of separately 
> developed components. (If you're a language freak, you might be 
> interested in IBM's Darwin Information Typing Archicture (DITA), which 
> provides for multiple inheritance of XSLT by explicitly doing in XSL 
> attributes exactly what a dynamic language implementation of multiple 
> inheritance does under the surface. Neat stuff.)
>
> In the late '80's I worked on a multiple axis view inheritance system 
> that was used in a product for over 10 years and took the company  through 
> an IPO and two buyouts. We had a geometric expert system and  needed to 
> produce geometric and attribute interfaces to more than 10  CAD systems 
> (and growing). Some were 2d, some 3d, and all had quite  different ways of 
> getting information in and out. Our expert system  used a message-passing 
> style of OO.
>
>    For output, we created a Writer object representing the capabilities 
> of the CAD system. Each Writer had primitives for basic capabilities  like 
> line and arc. Some of these produced results right away, and  others kept 
> state that was later dumped when the serial connection was  closed. 
> Writers for a CAD system that worked like other CAD systems  could inherit 
> from the corresponding Writers. (We had multiple  inheritance, but didn't 
> use it much for Writers. However, 2D CAD  systems did tend to inherit 
> along a branch that inherited the same  3D-to-2D projection code.) 
> Different styles were produced by providing  initialization arguments to a 
> Writer, by side-effecting Writers during  use, or by subclassing the 
> Writers altogether.
>
>    But we did not simply hand one of our geometrical expert-system 
> application objects to the Writer for output, nor did we define output 
> methods on the application object that invoked stuff on the Writer.  When 
> asked for serial output, the Writer was asked to produce a  delegation 
> object for the application object. Our applications had a  whole tree of 
> application objects, and the machinery cached the  Writer-specific 
> delegations so as to produce a shadow tree of  delegation objects. New 
> serializations (e.g., a new file) cleared the  cache. Each 
> shadow/delegation object pointed back to the application  object as 
> needed. (Not unlike Tweak?) The Writer-specific  shadow/delegation objects 
> often had complex structure of their own. For  example, a 3D Cube 
> application object might present on solid-modeling  CAD systems as a 
> single Cube solid, while wireframe CAD systems might  use 12 Line objects. 
> The Writer for the solid modelers produced a  shadow object that just 
> delegated everything back to the Cube  application object. However, the 
> Writer for the wireframe CAD systems  produced shadow objects that had 
> their own little tree of 12 Line  objects. The Line objects were, in turn, 
> output in the normal way, just  as if they were the original application 
> objects. This allows for a  huge amount of reuse in how different CAD 
> system produce similar  structures, even if the syntax of individual item 
> representation was  quite different.
>
>   Even though we had hundreds of application objects in the system, and 
> customers created thousands more, we regularly created presentations  for 
> new CAD systems in a week or so. Mostly it was a matter of defining  only 
> the most primitive methods for the new Writer, reusing a lot of  the 
> delegation objects.
>
> My thinking is that the internal structure of browsers and inspectors  and 
> such are often appropriate to share between different graphics  systems, 
> somewhat orthogonally to how the graphic systems themselves  work.
>
> Since that time, the Lisp community has developed a much more 
> straightforward way to do this, using multiple dispatch. Generic 
> functions are like Block objects. However, instead of dispatching  between 
> methods based on the "receiver" (or what is effectively the  first 
> argument), the dispatch is made based on all the arguments. In  the Common 
> Lisp Interface Manager (CLIM), a presentation is created by  calling a 
> generic function that dispatches on the application object,  the 
> application-defined View for the current context, and the Media (a 
> stream) on which the presentation is to be displayed.  Views can  inherit 
> from other Views, Media can inherit from other Media. Methods  for the 
> presentation generic functions can be created for any specific 
> combination of application object, View, and Media, and these methods  can 
> (and frequently do!) call the next more general applicable method. 
> (Presentations are actually objects that could be further broken down, 
> somewhat like the shadow objects in the CAD output. But in practice,  the 
> multiple dispatch gives sufficient flexibility with reuse, that I  think 
> applications rarely messed with the internals of Presentations.)   The 
> process is essentially doing more flexibly in one line what the CAD 
> output system did by dispatching to Writers and then to delegation 
> objects and then back to the Writer. The whole mechanism fosters even 
> more code reuse when the dispatch can use a form of multiple  inheritance 
> within application object, View, and Media. (The tradeoff  is basically 
> more branches within the objects, or more arguments for  dispatching 
> within the generic function.)  Generic functions are pretty  easy to write 
> in Smalltalk. (Mine at 
> http://groups-beta.google.com/group/comp.lang.smalltalk/browse_frm/ 
> thread/ad5d131840cccafd/b6e691d9834f8b90 just uses the class precedence 
> list implied by Smalltalk's normal single inheritance, but it could 
> easily be changed to use any more complex property.)
>
> -Howard
>
>
>
> _______________________________________________
> Tweak mailing list
> Tweak at impara.de
> http://impara.de/mailman/listinfo/tweak
> 




More information about the Squeak-dev mailing list