Here's a script that I ran on an MSE generated from Java code at
https://github.com/bethrobson/Head-First-Design-Patterns to show the
<<creates>> relationships in the AbstractFactory example.
I had some trouble with RTMondrian and custom composite shapes. I wasn't
able to set the colors of the individual elements in the RTCompositeShape
that I passed for the nodes. I tried working around it with @RTLabeled, but
it prints an "X" where the Character cr is in the string (rather than
wrapping). Finally it kind of works with border/fill/textColor: on the
RTMondrian shape, but it's not what I expected.
============================
"blocks for readability"
findCreators := [ :class | | findConstructors creators |
findConstructors := [
:cclass | cclass methods select: [ :m | m kind = 'constructor']
].
creators := Set new.
(findConstructors value: class) do: [
:method | method incomingInvocations do: [
:ii | creators add: ii sender parentType ]
].
creators. ].
newLine := Character cr asString.
camelWrap := [ :class |
rex := '([a-z])([A-Z])' asRegex.
rex copy: class name translatingMatchesUsing:
[ :each | (each at:1) asString, newLine, (each at:2) asString ]
].
classes := MooseModel root allModels first allClasses select: [
:c | c mooseName beginsWith: 'headfirst::designpatterns::factory::pizzaaf'].
thinArrow := RTDecoratedLine new
head: (RTFilledNarrowArrow asHead);
attachPoint: (RTBorderAttachPoint new);
width: 2.
"inheritanceArrow := RTDecoratedLine new
head: (RTEmptyNarrowArrow asHead);
attachPoint: (RTBorderAttachPoint new);
width: 2."
myClassShape := RTCompositeShape new
add: (RTBox new);
add: (RTLabel new text:camelWrap);
allOfSameSizeWithPadding.
b := RTMondrian new.
b shape shape: myClassShape;
borderColor: Color black;
fillColor: Color paleYellow;
textColor: Color black.
b nodes: classes.
b shape shape: thinArrow;
color: Color veryLightGray.
b edges moveBehind; connectFromAll: findCreators.
"b shape shape: inheritanceArrow;
color: Color green; withShorterDistanceAttachPoint.
b edges connectToAll: #directSuperclasses."
b layout dominanceTree verticalGap: 80; horizontalGap: 5.
b build.
b view @ RTZoomableView.
^ b
=======================================
Adding inheritance to the tree is commented out, but it makes for a mess
when laying out both creation and dependency.
I had wanted to use RTUMLClassBuilder to show the <<creates>> relations,
but finally I gave up since it appears to have inheritance only hard-coded
in the edges. I remember someone saying it should/would be re-done with
RTEdgeBuilder, so I'm looking forward to that.
Another suggestion for RTUMLClassBuilder would be a message forMooseClasses
(at least with Java in Moose, maybe forMooseJavaClasses?) message that has
these values:
forMooseClasses
self classname: #name.
self instanceVariables: #attributes.
self methodsNames: #methods.
self superclass: #superclass.
self methodselector: #signature. self attributeselector: #name
It yields something like this which is nice:
Hope this feedback is useful.
Cheers,
C. Fuhrman
On Sun, Apr 1, 2018 at 1:18 AM, Tudor Girba <tudor(a)tudorgirba.com> wrote:
+1
Doru
> On Apr 1, 2018, at 5:58 AM, Cris Fuhrman <fuhrmanator(a)gmail.com> wrote:
>
> Hi Nicolas,
>
> Thanks - indeed, iterating over Moose class methods with
>
> ... methods select: [:m | m kind = 'constructor']
>
> finds all the constructors pretty easily (parentType to find createe).
Then it's the incomingInvocations' sender parentType to find the creators.
>
> Cheers!
>
> On Fri, Mar 30, 2018 at 3:15 AM, Nicolas Anquetil <
nicolas.anquetil(a)inria.fr> wrote:
> Hi,
>
> no there is nothing special for <<create>>.
>
> "Creation" actually seems something different than the associations you
list: Access, Invocation, Inheritance and Reference can be lexically
extracted from the source code and they are fundamental mechanisms of many
programming languages.
>
> But it should not be too difficult to model it in Famix and post-process
a model to discover all occurences
>
> cheers
> nicolas
>
> On 29/03/2018 23:25, Cris Fuhrman wrote:
>> Hi all -- I'm not sure if I missed it, but does Moose explicitly model
the <<creates>> relationship of UML between two classes, e.g.,
>> <image.png>
>> Based on
http://themoosebook.org/book/index.html#h1thefamixfamilyofme
ta-models I found Entity -> SourcedEntity -> Association -> {Access,
Invocation, Inheritance, Reference}. In Moose, I can see
outgoingInvocations on methods of a class contain "new X" for all the X
that a class creates, but I wondered if there's a more efficient way.
>>
>> Cheers!
>>
>>
>> ______________________________
>> _________________
>> Moose-dev mailing list
>>
>> Moose-dev(a)list.inf.unibe.ch
>>
https://www.list.inf.unibe.ch/listinfo/moose-dev
>
> --
> Nicolas Anquetil
> RMod team -- Inria Lille
>
>
> _______________________________________________
> Moose-dev mailing list
> Moose-dev(a)list.inf.unibe.ch
>
https://www.list.inf.unibe.ch/listinfo/moose-dev
>
>
> _______________________________________________
> Moose-dev mailing list
> Moose-dev(a)list.inf.unibe.ch
>
https://www.list.inf.unibe.ch/listinfo/moose-dev
--
www.tudorgirba.com
www.feenk.com
“Programming is executable philosophy."
_______________________________________________
Moose-dev mailing list
Moose-dev(a)list.inf.unibe.ch
https://www.list.inf.unibe.ch/listinfo/moose-dev