هو واجهة مثل تسميات سوء الممارسة في جافا OO?

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

  •  08-07-2019
  •  | 
  •  

سؤال

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

ثم تتعثر في هذه الصفحة: http://xahlee.org/java-a-day/interface.html (يرجى البحث عن "واجهة التسميات"الدورة.).يقول:

جوهر المشكلة هو أن قطعة الرياضية في عدم الاعتداد اللغة.كما وصفها آلية في اللغة ممكن الاستفادة من هندسة البرمجيات وجهة نظر, فإنه لا ينبغي أن يكون تم تصميم جزء من الدرجة واجهة منذ مفهوم العلامات و مفهوم برمجة واجهة ، لغويا المتباينة.

لذلك هو واجهة مثل تسميات بالضرورة الممارسة السيئة ؟ كما مبرمج جافا, لدينا بعض بدائل أخرى ؟

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

المحلول

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

نصائح أخرى

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

أما المادة أذكر لكم, أنا لا أرى فائدة في الجدال أنه إذا كان الصف نحويا/هيكليا "يفي" واجهة ، واجهة مايو/ينبغي أن تطبق تلقائيا إلى فئة ("أي فئة يمكن أن نعلن ذلك [RandomAccess] باعتباره واجهة...").هذا إلى الوراء والتفكير في رأيي.

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

نلاحظ أيضا أن هذه ميتة-تغلب حجة فارغة واجهة دائما قابلة للتطبيق يمكن أن تطبق أيضا على الشروح.

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

@interface ContainableTag{}

@ContainableTag public class Foo {}

// ... elsewhere...

/**
 * Adds obj as a child element.
 * @throws IllegalArgumentException if obj is not tagged with 
 *         the ContainableTag annotation.
 */
public void addElement(Object obj){
    if (!obj.getClass().isAnnotationPresent(ContainableTag.class))
        throw new IllegalArgumentException("obj is not a ContainableTag");
    // add the containable tag as an element
}

ثم النظر في ما إذا كنت حقا لا أعتقد أن هذا يبدو أفضل:

interface ContainableTag {}

public class Foo implements ContainableTag {}

// ... elsewhere...

public void addElement(ContainableTag ct){
    // add the containable tag as an element
}

بالتأكيد, علامات واجهة لا توفر أي معلومات حول ما هو السلوك نوع نفسها ، ولكنها لا تسمح أنواع أخرى لتطبيق هذا غير السلوكية الملكية.أنا بالتأكيد كان يدخر الكثير من الحشرات المزعجة إذا ObjectOutputStream كان writeObject(Serializable) الطريقة بدلا من writeObject(Object).

تحرير: لدي لا يستهان الدعم هنا

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