سؤال

وكمتابعة على بلدي سابقة السؤال وجود وظيفة مع حدود العامة جنبا إلى جنب مثل:

<T extends Foo & Bar> void doStuff(T argument) {
  //do stuff wich should only be done if arguments is both foo and bar
}

ولأن هذا ليس castable من كائن غير محدد، تحتاج إلى أن يكون معرفة وجوه بعض الذي ينفذ في الواقع هذه الواجهات. يبدو لي أن الحاجة إلى معرفة نوع معين من ذي الحجة الكائن لتمريرها إلى doStuff(T a) هو انتهاك للقانون ديميتر.

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

ويتم استخدام هذه الحدود لمكافحة نمط؟ وإذا كان الأمر كذلك كيف ينبغي للمرء أن الأفضل تجنب ذلك؟

وسيناريو الحالة تشارك واجهة واحدة تحديد الكائن هي الثابتة والكائن المحدد الآخرين التي لها كيان ذات الصلة. وظيفة doStuff(T a) في هذه الحالة استمرت حدة ذات صلة عندما أصر عليه. ومع الكيانات غير المستديم يمكن أن يكون أيضا وحدة ذات صلة، ولكن لا ينبغي أن تتم معالجتها بواسطة الدالة doStuff(T a)

لا يوجد حل صحيح

نصائح أخرى

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

<T extends Number & Comparable<T>> T max(Collection<T> numbers)
<اقتباس فقرة>   

ويبدو لي أن الحاجة إلى معرفة نوع معين من ذي الحجة الكائن لتمريرها إلى doStuff (T أ) هو انتهاك للقانون ديميتر

وانا اختلف. أنا لا أرى كيف

T<? extends Foo & Bar> void doStuff(T argument) 

ويتطلب أي معرفة المزيد من حجة لتمرير ثم

T<? extends Foo> void doStuff(T argument) 

وأو أكثر حتى ذلك الحين فقط

void doStuff(T argument) 

في كل الأحوال عليك أن تعرف شيئا عن حجة، وأنا لا أعتقد أن الحالات الأولى يطالب أي معرفة المزيد ثم الآخرين لأنه فقد اثنين من معرفات.

وهذا نموذج مضاد يلقي.

ولكن، قد تكون الأدوية يتوهم الملعب مربكة للمبرمجين غير متقدمة. يجب أن يكون استخدام مثل هذه الأنواع وطريقة أسهل بكثير من تنفيذها.

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