سيئة OO مشكلة تصميم - أحتاج إلى بعض الوظائف العامة في جافا ولكن لا أعرف كيفية تنفيذ ذلك

StackOverflow https://stackoverflow.com/questions/125463

  •  02-07-2019
  •  | 
  •  

سؤال

أنا و صغير UML صف محرر في جاوة ، أساسا مشروع شخصي ، فإنه قد ينتهي على سورس إذا كنت تجد الوقت لإنشاء المشروع على ذلك.

المشروع هو متقدمة جدا :أنا يمكن أن تخلق الطبقات ، تحريكها ، إنشاء واجهات إنشاء روابط, الخ.

ما أعمل عليه هو مربع الحوار تحديد فئة/واجهة خصائص خلق فئات جديدة/واجهات.

على سبيل المثال لدي الدرجة التي تمتد JDialog.هذا هو الرئيسي "نافذة" تحرير فئات و واجهات (حسنا, هناك فئة لكل).أنه يحتوي على JTabbedPane والتي بدورها تحتوي على JPanels.

هذا JPanel هي في الواقع تلك المخصصة.أنا خلقت فئة مجردة يمتد JPanel.هذه الفئة تستخدم مكونات (التي يحددها فرعية) و إضافة قيم إلى JTable (كما ورد في JPanel).

على سبيل المثال ، إذا كنت ترغب في تعديل فئة' الصفات ، JPanel سوف تحتوي على JTextField إدخال اسم السمة وكذلك آخر واحد من أجل إدخال نوع.وهناك أيضا مجموعة من زر معالجة البيانات المدخلة في هذه المجالات.عند النقر فوق "حفظ" ، البيانات دخلت في JTextFields تضاف إلى JTable (à la المؤسسة المهندس المعماري).على بالخرسانة الطبقة التي تمتد مجردة واحدة هي المسؤولة عن تحديد ومراقبة اتخاذ قرار ما فعله مع البيانات عندما يكون خط إضافتها أو حذفها من JTable.على JTable بيد أن الإدارة والمسئولية من فئة مجردة.

هنا مشكلتي :في OO, فئة لديها أساليب واجهة الأساليب أيضا.قلت لنفسي :يمكنني استخدام نفس ملموسة مخصص JPanel (AttributesPanel (الذي يمتد مجردة JPanel الدرجة أنا خلقت)) لتخزين أساليب فئة أو واجهة.

ومع ذلك ، فإن الطبقة يحتاج إلى الاحتفاظ بنسخة (كسمة) من فئة أو واجهة أنا أعمل على.أن الأسلوب إضافة إلى ذلك, يمكن أن أدعو editedClass.addMethod() (أو editedInterface.addMethod()).المشكلة هي أن ليس لدي أي طريقة لمعرفة ما إذا كان العمل على فئة أو واجهة.

الحل وجدته هو القبيح :تبقى سمة editedClass و سمة editedInterface في AttributesPanel الدرجة.وفقا لما إذا أنا التحرير فئة أو واجهة واحدة من هذه الصفات سوف تكون فارغة في حين أن الآخر سوف لا.

فمن قبيحة جدا إذا سألتني.في الواقع, أنا يمكن أن أسمع هندسة البرمجيات المعلمين في رأسي يصرخ في العذاب حين حرق (حسنا, في الواقع, تجميد) في الدائرة التاسعة من الجحيم.

طريقة سريعة لإصلاح هذا التصميم المشكلة إنشاء واجهة تسمى "ObjectWithMethods" الذي صفي واجهة الطبقات سوف تنفذ.بهذه الطريقة, سوف يكون لديك فقط لوضع ObjectWithMethods المعلمة في AttributesPanel الدرجة.

ولكن هل هذا يعني أنني يجب أن بإنشاء فئة تسمى "ObjectWithAttributes" ، أو "ObjectWithBlahBlah" ?أرى بعض جيدة "TheDailyWTF" المحتملة هنا...كما أنني لا أعتقد أنني يجب أن تعديل نطاقي الكائنات (فئة, واجهة, مذكرة, العلاقة (على بلدي محرر UML)) أو إنشاء واجهة جديدة فقط من أجل بعض UI النظر....

ماذا تعتقد ؟

لقد كنت بحاجة الى مزيد من التوضيحات (لأنني متعب جدا الآن و أنا أميل إلى اليمين سيئة جدا (لا سيما في اللغة الإنجليزية - لغتي الأم هي الفرنسية) بينما في هذه الحالة الذهنية...) ، فقط اطلب وسوف تحرير هذه المسألة.

الهتافات ،

غيوم.

هل كانت مفيدة؟

المحلول

عندما قرأت سؤالك يبدو حقا مثل كنت تصف مكان إلى استخدام زائر نمط.

السبب الزائر نمط ينبغي أن العمل هنا هو فكرة المعروف مضاعفة الإرسال.واجهة المستخدم الخاصة بك سوف رمز إجراء مكالمة وتمرير إشارة إلى نفسه ، ثم فئة أو واجهة ينتهي الدعوة الأصلي المتصل.منذ الصف أو واجهة واحدة مما يجعل استدعاء الأسلوب يعرف نوع خاص بها وكيفية القيام بعمل معين إلى نوع.

بالطبع الوصف غير كاف لتنفيذ هذه التقنية لذلك عليك أن ترغب في قراءة ذلك.وأعتقد أنه هو موثقة جيدا.على سبيل المثال, وجدت هذا في حوالي 2 ثانية في جاوة التي يجب الحصول على أنك بدأته: http://www.javaworld.com/javaworld/javatips/jw-javatip98.html

نصائح أخرى

عادة, أنا فقط تفعل الشيء الأكثر مباشرة ، والبدء في التفكير العوملة بها واجهات, عندما تبدأ في رؤية الكثير من if( .. instanceof ..)مثل يبني في قانون بلدي.فإنه لا يكلف لي الكثير مع IDE الحديث رمز إعادة بيع ديون القدرات.

في قضية محددة ، وأود أن تنظر في تنفيذ المخططات المقدمة في UML مواصفات, لأنهم كانوا لطفاء جدا لتحديد UML باستخدام UML-التدوين!

لديك تطبيق.في هذا التطبيق.تمثل الخاص بك ، وتعديل بعض البيانات.

أن البيانات تمثل لغة البرمجة فئة أو لغة برمجة واجهة.

عند إجراء محرر بعض البيانات في بعض الأحيان عليك أن تضيف إضافية / معلومات تكميلية ، على سبيل المثال ، كل فئة الرسم البياني قد يكون مختلف عن لون الخط و لا يجب أن نفعل مع سمات أو أساليب الفئة الخاصة بك.

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

انا اقتراح القيام ببعض الأشياء.

فصل تمثيل البيانات من قانون أو منطق البرنامج الخاص بك:

إذا كان لديك شيء من هذا القبيل:

// all code, classes, mixed up
public class JCustomPanel:  {

    protected ChartClass Charts;
    protected ArrayList<String> MyClassAttributes;
    protected ArrayList<String> MyClassMethods;

    void PanelDoSomeThing();
    void ClassDoSomeThing();
    void InterfaceDoSomeThing();

    // ...
} // class JCustomPanel

تغيير هذا:

// things related to a single class or interface,
// nothing to do with the chart

public class JClassRepresentation:  {

    ArrayList<String> Attributes;
    ArrayList<String> Methods;

    bool IsInterface;

    void ClassDoSomeThing();
    void InterfaceDoSomeThing();

    // ...
} // class JCustomPanel

// things related to the editor,
// contains the classes and interfaces,
// but, as separate stuff
public class JCustomPanel:  {

    ArrayList<JClassRepresentation> Classes;

    int PagesCount;

    void InterfaceDoSomeThing();

    // ...
} // class JCustomPanel

الهتافات.

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