سؤال

لنفترض أنك تريد رسم مخطط أ 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 في الرسم التخطيطي الخاص بك لأنك في الواقع الشخص الذي يقوم بإنشاء الفصل.

أنت على حق بشأن مخطط الكائن:ليس من الضروري في هذه الحالة.الشيء نفسه مع بناء الجملة الذي اقترحته.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top