[SML 7721] Re: Smalltalk勉強会@京都 課題 「CSV to HTML」できました

hirowadenden hirowadenden @ hera.eonet.ne.jp
2009年 11月 19日 (木) 20:37:47 JST


ハンドル名で失礼します、hirowadendenと申します。
前回投稿したクラス図を表示するコードですが、気が付いた点を少し修正したので
再投稿させていただきます。よろしけばお使いください。修正箇所は以下のとおり
です(機能には変更ありません):
・クラスに対応するJunRoughClassEntityを捜すときのキーを、名前の文字列か
らクラスそのものに変更しました。
・描画するクラス全体を保持するのに、クラスの名前をキーにしたDictionaryを
用いていましたがDictionaryである必要は無く、OrderedCollectionに変更し
ました。

以下はコードです。

| aNameSpace aDiagram entitiesDictionary classes nameSpacesAndClasses x
y xStart yMax solitaryClasses topClasses layoutOrder addSubclasses |
aNameSpace := PrimeMinisters.
classes := OrderedCollection new.
solitaryClasses := OrderedCollection new.
topClasses := OrderedCollection new.
layoutOrder := OrderedCollection new.
nameSpacesAndClasses := aNameSpace withAllNameSpacesAndAllClasses.
entitiesDictionary := Dictionary new: nameSpacesAndClasses size.
aDiagram := JunRoughClassDiagram new.
nameSpacesAndClasses
  do:
    [:item |
    (JunStringUtility
      stringMatch: item name asString
      and: '*Test')
      ifFalse:
        [| anEntity |
        item isBehavior
          ifTrue:
            [anEntity := JunRoughClassEntity fromClass: item.
            anEntity detail: true.
            classes add: item]
          ifFalse:
            [anEntity := JunRoughClassEntity label: item printString.
            anEntity origin: 0 @ 0].
        anEntity fitExtent.
        aDiagram addEntity: anEntity.
        entitiesDictionary at: item put: anEntity]].
classes
  do:
    [:class |
    (class superclass = nil
      or: [(entitiesDictionary includesKey: class superclass) not])
      ifTrue:
        [(class subclasses select: [:each | entitiesDictionary
includesKey: each])
          size = 0
          ifTrue: [solitaryClasses add: class]
          ifFalse: [topClasses add: class]]].
layoutOrder add: topClasses.
addSubclasses := [:classCollection |
| subclassCollection |
subclassCollection := OrderedCollection new.
classCollection
  do:
    [:class |
    subclassCollection
      addAll:
        (class subclasses
          select: [:subclass | entitiesDictionary includesKey: subclass])].
subclassCollection size ~= 0
  ifTrue:
    [layoutOrder add: subclassCollection.
    addSubclasses value: subclassCollection]].
addSubclasses value: topClasses.
layoutOrder add: solitaryClasses.
xStart := 20.
x := xStart.
y := 50.
yMax := 0.
layoutOrder
  do:
    [:lineLayout |
    lineLayout
      do:
        [:class |
        | anEntity anExtent |
        anEntity := entitiesDictionary at: class.
        anExtent := anEntity extent.
        anEntity origin: x @ y.
        x := x + anExtent x.
        yMax := yMax max: anExtent y.
        x := x + 30].
    x := xStart.
    y := y + yMax + 30.
    yMax := 0].
classes
  do:
    [:class |
    class superclass
      ifNotNil:
        [(entitiesDictionary includesKey: class superclass)
          ifTrue:
            [(aDiagram
              connect: (entitiesDictionary at: class)
              to: (entitiesDictionary at: class superclass)) kind:
#is_a_kind_of]]].
aDiagram openIn: (0 @ 0 extent: 1260 @ 740)


-- hirowadenden







SML メーリングリストの案内