[Cuis] Fwd: Fwd: Patterns

Thierry Goubier thierry.goubier at gmail.com
Tue Nov 17 12:59:12 CST 2015


Hi Juan,

Le 17/11/2015 18:36, Juan Vuletich a écrit :
> Hi Thierry,
>
>>
>>
>> I would give HotDraw, and some of the original design pattern work on
>> editors, especially the parts derived from the InterViews toolkit.
>
> Uh, it is not easy to find stuff about that, so I can't really comment.

InterViews was kept alive as the ivtools for long, very long after 
InterViews lost to Motif as the X Window toolkit. Fresco, InterViews 
successor, was also very interesting.

HotDraw is old as well. But I did some cool stuff with it (a hypermedia 
system, in 1993).

>> Now, I used to be pretty up to date on the literature and some of the
>> criticism of the MVC model (especially the division between V and C)
>> but my memory of that time is all fuzzy.
>
> Well, in my opinion View / Model separation is a great property of the
> design of an application. Controller is more of a requirement of the
> ST-80 MVC framework. In principle, I see no problem in merging
> Controller into View. But, in Cuis, it can be argued that the Editor
> hierarchy is essentially a hierarchy of Controllers, and that's ok if
> the decomposition of responsibilities makes sense.
>
> In View / Model separation there are two restrictions that need to be
> honored:
> - The Model doesn't know about the possible Views. This means, for
> instance, that it could provide all its services, and exercise all its
> functionality, even if the GUI framework is completely absent. Model
> code should never fail because of this. This is great for moving models
> from and two different runtimes (client, server, gemstone, various
> dialects, etc) and also for writing tests.
> - Model behavior should not leak into Views. This means that if the
> views are removed (maybe to be replaced by some others, in the same or
> in another framework), Model should not lose state nor behavior. Model
> must be complete by itself.
> So, the idea is essentially to protect the integrity and consistency of
> Models.

I do agree with that objective, but, in practice, what I find as a 
result is that an additional layer (model mediation or the M2 of MMVC) 
helps immensely by:

- regrouping certain model features which are introduced to satisfy view 
requirements...

   - For example a pure model can just have a copy or save to file 
operation, but a view would like to have a feedback on the length of the 
operation. In non gui mode, having the model expose that sort of 
information is a needless waste of code and resources. This would better 
be carried by a layer on top (which is still a model IMHO, since it 
maintain a certain level of decoupling with a view).

- Expose explicitely certain adaptations which are made for a specific 
toolkit (they are in that model).

- Allow for user-features oriented models to appear on top of the pure, 
abstract model

   - In a browser, one can imagine scoped models of the code as a 
user-oriented feature that a disconnected mode doesn't need to integrate.

Nothing really grandiose or earth-shattering, mind you. Just convenient.

>> What would you think of a drag and drop feedback which is dependent of
>> the type of the model elements?
>
> Well, lets assume a Model with 2 collections of elements. To make it
> sound a bit more concrete, lets call them Orders and Assets. And lets
> assume that the UI has some place(s) from where the user can drag many
> kinds of objects, like Orders, Assets, between others. Now, the user
> drags an Asset and wants to drop it into the Orders list. Given that the
> widget for the Orders list supports dropping, lets assume that its
> 'dropActionSelector' is #addOrder:. This #addOrder: model method would
> be called with an Asset. So, #addOrder: could answer false, to let
> sender know that the addition was rejected (because it was not an
> Order!). It makes sense to have the method in ListWidget that calls
> 'dropSelector' check for the result, and if it is false, let the user
> know that the drop was rejected, for instance, by keeping the dragged
> object in the hand.

Hum, I was more thinking of what I am dealing with at the moment, which 
is a drop in the Orders list is a drop on a specific order item, which 
has to tell:

- during the drag, if a drop would be honored
- after the drop, if it is accepted or rejected
- and, if accepted, that specific order item changes state and is shown 
as such (and may also change the number of order items, etc...)

I found, when doing that, to have an intermediate model on top of my 
Asset/Order object to mediate with the drag and drop API very usefull 
(that is, what is displayed and dragged are Views on AssetModels which 
are themselves observers of Assets).


>
>>
>>
>>>     So the most elegant way I've used is the two models: a pure,
>>>     abstract model, totally view independent. And a pragmatic, closer
>>>     to the view / aware of the view, application model as an mediator.
>>>
>>>
>>>
>>>                     I think it is better for the View to start it all.
>>>
>>>
>>>                 +1
>>>
>>>
>>>             I prefer to model an Application concept in the target
>>>             desktop environment if I want to model highly portable stuff.
>>>
>>>             That application concern can be folded into a dedicated
>>>             view if that is the preferred convention in the target
>>>             environment.
>>>
>>>             Regards,
>>>
>>>             Thierry
>>>
>>>
>>>         I wonder how would this result in practice. Do you have some
>>>         examples to share?
>>>
>>>
>>>     I have a complex example, a system browser, would that fit?
>>
>>     Sure.
>>
>>
>> Well, a short estimate on that particular application is that, linked
>> with the pluggable morphs, 10 to 20% of the code in the application
>> model is:
>> - widget creation, setup, layout
>> - dynamic morph addition / removal when activating certain functions
>> on the model
>> - workarounds the pluggable morphs api to:
>>   - dynamically refresh parts of the inside of widgets
>>   - disconnect then reconnect links between widgets so that the
>> model-triggered update of one does not change the state of the other
>> one (i.e. protect the model from unwanted view triggered updates when
>> the model is changing part of its contents).
>
> "View model" is a bit a misleading name. I'd say all this belongs in the
> Views world.

As I said, it may be moved into the View world, in the sense that it 
holds view-related concerns. But, at the same time, it has Model like 
decoupling from the Views.

> Besides, the method called to update Views after Model changes should
> not modify the Model. In this way, there would be no extra Model events
> triggered, and spurious updates would not occur. This might require
> enhancing the Views framework, if not mature enough.

I'll let you have a try at that :)

>>
>> This application model uses mainly two widgets.
>>
>> I do have a long term plan to port that to Cuis, and I expect I will
>> have to write that very same code somewhere (maybe more, maybe less).
>>
>> Regards,
>>
>> Thierry
>
> Hopefully, it will be less :)

I'm certainly looking forward to it.

Regards,

Thierry




More information about the Cuis mailing list