RenderableVertex
グラフ理論的な意味のVertexはほとんど何も持たない、単体としてクラスにする価値のあまりない概念です。java.lang.Objectみたいなもの。位置や速度の情報を持ったMassPoint(質点)クラスがあり、それを継承したVertexクラスがあるわけです。しかし、今のVertexクラスは箱状の見かけのレンダリングと密結合になってしまっています。Graphが持つのはVertexなのですが、グラフのレイアウト機能を使いたい人は必ずしも今のVertexの外見までは欲しくはないはずです。また、GraphがVertexというConcreteなレンダリング機能を持っているクラスと密結合なせいで、このままでは見かけの違う(たとえば丸い)頂点を追加することができません。
一歩下がって考えると、レンダリング機能が根幹のGraphやEdgeやVertexにあるのがおかしいわけです。というわけでGraphとRenderableGraph、VertexとRenderableVertex、EdgeとRenderableEdgeは分離します。
分離しました。ふむ、Edge.renderの中でVertexのbound(箱のふち)を取得して、矢印がくっつく位置を計算していますね…。しかしVertexが丸かったり四角かったりできるようにするためには辺の中でそんな計算をしていてはダメですね。この部分は辺の方向ベクトルndirを与えて、頂点の中心からのずれoffsetを求めているので…これをRenderableVertexにcalcOffsetをつけてそっちに任せてしまえばいいですね。
あー。Selectionクラスが辺のselected属性にアクセスしているけども、この属性はRenderableEdgeに属すべきか、それともその子のLinearEdgeに属するべきか。RenderableEdgeに属するか、さもなくばどこか別の方法で保持するべきでしょうなぁ…、少なくともLinearEdgeなんていうConcreteなクラスにSelectionクラスの中でキャストするのはあり得ない設計だし。ただ、他の場所に保存すると1回の描画のたびにRenderableEdgeがみんなでそこへアクセスするので、なんだかなぁ…という感じ。辺が「選択されているかどうか」という属性を自分で持つのは自然。ただRenderableEdgeという名前にはそぐわないですね。ただこれだけのためにSelectableEdgeなんてのを作る気もあまり起きませんが。