And gmail didn't add the image correctly it seems...

​

On Thu, Jun 18, 2015 at 10:10 AM, Peter Uhnák <i.uh...@gmail.com> wrote:

>
>> > I don't fully understand the TreeModel example, what would your tool do
>> with all the men/displayBlock/childrenBlock ... - methods?
>>
>
>
> Ah, I should've explained what TreeModel is; it is a Spec UI widget to
> display tree-like structures:
>
>
> ​
>
> So the way this works is that I give the TreeModel some root object
> (DCFsm) and then blocks that describes some behavior.
> So in childrenBlock: [ :parent | ... ] the block is expected to return
> child elements for the parent.
> In displayBlock: you pass a block that returns the label that you will
> see.. e.g. [ :anObject | anObject name , ' (' , anObject class name , ')' ]
> iconBlock: returns the icon for the object and so on and so forth.
>
> So the way I have implemented it right now is something like
>
> ~~~~~~~~~~~~~~~~~
> childrenFor: anObject
> | col name |
> name := anObject class asString asSymbol.
> col := OrderedCollection new.
> name = #DMMindMap
> ifTrue: [ ^ col ].
> (anObject isKindOf: DCDiagram)
> ifTrue: [ col addAll: anObject elements ].
> (anObject isKindOf: DCNamedElement)
> ifTrue: [
> name = #BormParticipant
> ifTrue: [ col addAll: anObject nodes ].
> name = #BormActivity | (name = #BormState)
> ifTrue: [ col addAll: anObject outgoing ].
> name = #BormActivity
> ifTrue: [ col addAll: anObject sent ].
> name = #BormCommunication
> ifTrue: [ col addAll: anObject dataFlows ].
> name = #BormCommunication
> ifTrue: [
> anObject hasConstraint
> ifTrue: [ col add: anObject constraint ] ].
> name = #BormTransition
> ifTrue: [
> anObject hasConstraint
> ifTrue: [ col add: anObject constraint ] ] ].
> ^ col
> ~~~~~~~~~~~~~~~~~
>
> Which is unreadable, unmaintainable and nonextensible. All the #Borm*
> symbols actually refer to classes of a completely independent package and
> repository which doesn't even need to be loaded in the system.
>
> I think what Peter means is: the object oriented way to handle different
>> types is by dispatching on each type (~ double dispatch, ~ visiting). You
>> could need this for different aspects of your application. In the end, the
>> same core mechanism will be implemented multiple times. Sadly, minor
>> semantics/structural differences will make it hard to abstract this out.
>
>
> Yes, double-dispatch seems like the apt solution, however it would lead to
> NxM number of classes (as mentioned before). But the more I think about it
> the more I feel that I will not get any better than that.
>
> Peter
>

Reply via email to