Map
クラス (地図作成の種類ではなく、数学の種類)を図で示したいとしましょう。Ruby では、次のようなものがあります。
class Map
attr_accessor :nodes, :edges
def initialize
@nodes = Set.new
@edges = Set.new
end
def minimum_spanning_tree(&mst_algorithm)
mst_algorithm.call(@nodes, @edges)
end
...
end
これを図式化し始めると、私の考えは次のようになります。
クラスについて話しているので、クラス図を試してみましょう。クラスを作りますMap
。そしてNode
クラス。そしてEdge
クラス。そしてSet
クラス。罰金。次に、 Composed-Of(1:2) 行をMap
to からSet
-- と ごとに 1 つずつ@nodes
描画します@edges
。次に、 to からの has-many(1:0..*) 行とSet
toからNode
の別の行。しかし今、私は各セットが と を任意に組み合わせて使用できると言っていますが、これは正しくありません。また、図に 2 つの要素 (対応する 2 つの Composed-Of(1:1) 行) を配置しても、それらは同じオブジェクトであるため役に立ちません。Set
Edge
Node
Edge
Set
だから私は考えました:まあ、UMLは私がもっとC++ / Java風になることを望んでいるのかもしれません。テンプレート化されたSet<Node>
とSet<Edge>
は UML では使用できませんが、サブクラスを作成できました:NodeSet
とEdgeSet
.
最後にオブジェクト図について考えましたが、そうではありません。個々のインスタンスSet
ではなく、クラスについて話しています。Set
より良い答えはありますか?または、「最も悪い」ものをすでに見つけましたか?
後で
マーク Wとピート カーカムの答えは、私が最初に述べた質問に対する素晴らしいものです。問題は、存在する問題を明らかにすることができないため、実際の問題に単純な類推を使用しようとしていたことです。私は実際には、異なる関係を持つ同じクラスの 2 つを持つ方法について少し調べただけでしたが、同じように振る舞い、同じ属性 (属性値ではありません) を持っています。
いくつかの異なるモデルでもう一度試してみましょう: an ActiveDirectory
、 a Firewall
、および two Router
。1 つのルータ(LAN のもの)には、 および への参照がActiveDirectory
ありFirewall
ます。もう一方 (WAN のサーバー) には、Firewall
およびいくつかのパブリック サーバーへの参照があります (この図では無視します)。Router
両方の が同じ製造元、モデルなどであることが完全に考えられます。シリアル番号は異なりますが (オブジェクトは異なります)、間違いなく両方とも ですRouter
。両方をクラス図に入れるには、 と にサブクラスRouter
化する必要がLANRouter
ありWANRouter
ます。Marc W のソリューションとの類推は、Firewall
and をActiveDirectory
直接接続し、実装を残すことです (Router
) 決定するクラスに。しかし、UML を使用して実際にシステムを構築する場合は、抽象化が漏れる必要があります。