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) 行をMapto からSet-- と ごとに 1 つずつ@nodes描画します@edges。次に、 to からの has-many(1:0..*) 行とSettoからNodeの別の行。しかし今、私は各セットが と を任意に組み合わせて使用できると言っていますが、これは正しくありません。また、図に 2 つの要素 (対応する 2 つの Composed-Of(1:1) 行) を配置しても、それらは同じオブジェクトであるため役に立ちません。SetEdgeNodeEdgeSet
だから私は考えました:まあ、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 のソリューションとの類推は、Firewalland をActiveDirectory直接接続し、実装を残すことです (Router) 決定するクラスに。しかし、UML を使用して実際にシステムを構築する場合は、抽象化が漏れる必要があります。