أين الحل الأوسط بين Class و Object في UML؟
-
22-08-2019 - |
سؤال
لنفترض أنك تريد رسم مخطط أ Map
الفئة (النوع الرياضي، وليس النوع الخرائطي).في روبي، قد يكون لديك شيء مثل:
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
فصل.بخير.الآن سأرسم خطًا مكونًا من (1:2) من Map
ل Set
-- واحد لكل @nodes
و @edges
.ثم سطر يحتوي على العديد (1:0..*) من Set
ل Node
وواحد آخر من Set
ل Edge
.لكنني الآن أقول أن كل مجموعة يمكن أن تحتوي على أي مزيج من Node
رمل Edge
س، وهذا غير صحيح.ولا يساعد على إخماد اثنين Set
العناصر الموجودة في الرسم التخطيطي (مع سطرين متطابقين مكونين من (1:1)) لأنهما نفس الكائن.
لذلك فكرت:حسنًا، ربما يريدني UML أن أكون أكثر C++/Java-ey.قالب Set<Node>
و Set<Edge>
غير ممكنة في UML، ولكن يمكنني إنشاء فئات فرعية: NodeSet
و EdgeSet
.
وأخيرا فكرت في رسم تخطيطي للكائن، ولكن هذا ليس صحيحا.أنا أتحدث عن Set
فئة وليست فردية Set
الحالات.
هل هناك إجابة أفضل؟أو هل وجدت بالفعل "الأقل سوءًا"؟
لاحقاً
الإجابات التي مارك دبليو و بيت كيركهام رائعة بالنسبة للسؤال كما قمت بصياغته لأول مرة.المشكلة هي أنني كنت أحاول استخدام تشبيه بسيط لمشكلتي الحقيقية لأنني لا أستطيع الكشف عن المشكلة كما هي.لقد كنت حقًا فقط بعد قليل من الحديث عن كيفية الحصول على اثنين من نفس الفئة لهما علاقات مختلفة، لكنهما يتصرفان بنفس الطريقة ولهما نفس السمات (على الرغم من عدم وجود قيم السمات).
دعونا نحاول مرة أخرى مع بعض النماذج المختلفة:ان ActiveDirectory
, ، أ Firewall
, ، و اثنان Router
س.يحتوي أحد أجهزة التوجيه (جهاز LAN) على إشارات إلى ActiveDirectory
و ال Firewall
;الآخر (WAN) لديه إشارات إلى Firewall
وعدد من الخوادم العامة (سنتجاهلها في هذا المخطط).ومن المتصور تماما أن كليهما Router
هي من نفس النوع والطراز وما إلى ذلك.سيكون لديهم أرقام تسلسلية مختلفة (الكائنات مختلفة)، لكنهما بالتأكيد كلاهما Router
س.ومع ذلك، لكي أضع كليهما في مخطط الفصل، لا بد لي من تصنيف فئة فرعية Router
داخل LANRouter
و WANRouter
.القياس على حل مارك دبليو هو توصيل Firewall
و ActiveDirectory
مباشرة، وترك التنفيذ (Router
) إلى الفصل لتحديد.ولكن يجب أن يتسرب التجريد إذا كان UML سيتم استخدامه لبناء النظام فعليًا.
المحلول
إذا كنت تقوم بنمذجة المجال، بدلاً من التنفيذ، فإن لغة UML توفر صورًا نمطية للعلاقات.في هذه الحالة، يمكنك وضع علامة على العقد والحواف على أنها {غير مرتبة}، والتي تتعلق بحقيبة أو مجموعة، و{فريدة} مما يضيقها لتصبح مجموعة.لا أستطيع رؤية أي قيود على نوع العقدة أو الحافة، لذا إذا لم تكن موجودة فلا تحاول إضافتها:
class Map
+nodes : { unordered, unique } object[0..*]
+edges : { unordered, unique } object[0..*]
+minimum_spanning_tree(mst_algorithm:callable)
من شأن أداة إنشاء الأكواد/الهندسة العكسية الجيدة تعيين مجموعات UML {غير مرتبة وفريدة} من/إلى المجموعات في كود المصدر.
قد ترغب في جعل الخريطة نوعًا معلميًا في نموذج المجال الخاص بك، إذا كانت هذه المعلومات مفيدة لك.ولكن نظرًا لعدم استخدام المعلومات في التنفيذ، فمن الصعب قليلاً فهم النقطة، كما أن جعل الأمور بسيطة قدر الإمكان دون فقدان المنفعة هو دائمًا هدف في النمذجة.
إذا كنت تريد توثيق تنفيذ فئة معينة باستخدام المجموعات، فيمكنك القيام بذلك باستخدام الارتباطات.أنت على حق في أن لغة C++ أو Java تسمح لك بإعلان نوع العنصر في المجموعة، وأن هذه الخرائط ترتبط بالأنواع المعلمية في UML.لا يمتلك AFAIK Ruby آلية لتنفيذ مثل هذه القيود النوعية، لذا لتوثيق تنفيذ Ruby لخريطتك، قم بتوثيق ما هو موجود في التنفيذ فقط - تحتوي الخريطة على ارتباطين للتعيين، ولا تضع أي قيود على ما هو موجود في المجموعة.(قد ترغب في توثيقه كقيد ثابت، ثم يتم اختبار الوحدة بدلاً من قيد النوع، ولكن مرة أخرى من الصعب بعض الشيء معرفة سبب عملك في روبي إذا كنت تريد التحقق من النوع الثابت المقيد)
نصائح أخرى
لا ترسم أي خط من Map
ل Set
.في هذه الحالة، Set
هي مجرد بنية بيانات مقدمة لك من خلال روبي التي تحمل الأشياء المهمة حقًا.سواء كان أ Set
, ، أ HashMap
, ، ان Array
, ، وما إلى ذلك خاص بالتنفيذ ولا يهم بالنسبة لـ UML.ما عليك سوى إنشاء سطر مكون من (1:0..*) من Map
ل Node
و من Map
ل Edge
.بعد كل شيء، باللغة الإنجليزية، الخاص بك Map
حقا يتكون من العقد والحواف، أليس كذلك؟السبب الذي قمت بتضمينه Map
في الرسم التخطيطي الخاص بك لأنك في الواقع الشخص الذي يقوم بإنشاء الفصل.
أنت على حق بشأن مخطط الكائن:ليس من الضروري في هذه الحالة.الشيء نفسه مع بناء الجملة الذي اقترحته.