توجد المنشأة بدائل ISomething / ISomethingable الواجهات?

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

  •  03-07-2019
  •  | 
  •  

سؤال

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

لذا فإن السؤال هو, هل هناك طريقة بديلة تدل على أن شيئا ما هو واجهة بدلا من فئة هناك أي حاجة للدلالة بها على أي حال.أو هو حالة تصبح معيار لذا يجب أن نتقبل ذلك و التوقف عن محاولة لإثارة "الحروب الدينية" من قبل مما يشير إلى أنه يمكن القيام به بشكل مختلف ؟

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

المحلول

ومن كتاب إرشادات تصميم الإطار:

<اقتباس فقرة>   

واجهات تمثل جذور التسلسل الهرمي (على سبيل المثال IList) ينبغي أيضا استخدام الأسماء أو جمل اسمية. واجهات تمثل قدرات يجب استخدام الصفات والعبارات الصفة (مثل IComparable، IFormattable).

وأيضا، من شروح على واجهة التسمية:

<اقتباس فقرة>   

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

     

وBRAD أبرامز: من ناحية أخرى، فإن "I" بادئة على واجهات غير واضح   تقديرا لتأثير COM   (وجاوة) على .NET Framework. COM   شعبية، حتى إضفاء الطابع المؤسسي،   تدوين التي تبدأ اجهات   مع "أولا" على الرغم من أن ناقشنا   متباينة من هذا النمط التاريخي   قررنا المضي قدما في   كان نمط كما الكثير من المستخدمين لدينا   مألوفة بالفعل مع COM.

     

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

     

وBRENT رئيس الجامعة ملاحظة:   هذا هو حقا تطبيق آخر من   التأشير الهنغارية (على الرغم من واحدة من دون   مساوئ التدوين ل   استخدام في أسماء المتغيرات).

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

نصائح أخرى

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

ومع حقن التبعية يجري في رواج، وغالبا ما أجد أنا في نهاية المطاف مع واجهة وتنفيذ إنتاج واحد. انها في متناول اليد لجعلها تمييزها بسهولة فقط مع البادئة I.

ونقطة واحدة القليل من البيانات: أعمل مع كل من جافا و C # قدر لا بأس به، وأنا أجد نفسي بانتظام الحاجة إلى مراجعة أي نوع من أنواع بلغة جافا هي في الواقع واجهات، وخصوصا حول إطار المجموعة. . NET فقط يجعل هذا بسيط. ربما لا يزعج الآخرين، لكنه يزعجني.

و+1 لIFoo مني.

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

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

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

كل شيء عن نمط و القراءة.التقديم واجهات مع "أنا" هو مجرد اصطلاح تسمية وأسلوب التوجيهي التي اشتعلت.المجمعين أنفسهم لا يمكن أن الرعاية أقل.

والمعيار الترميز لسيمبيان واجهات (الطبقات نقية مجردة C ++) تدل مع M بدلا من أنا.

وخلاف ذلك، فإن الطريقة الوحيدة الأخرى التي رأيتها من واجهات تدل هي من خلال السياق.

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

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

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

public class CustomerImpl implements Customer

طلبت بديل, حتى هنا هو واحد لقد واجهت:

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

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

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

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

  • إذا كان لديك واحدة سلوك واحد ممكن التنفيذ ، ثم لا إنشاء واجهة:

    الطبقة العامة StackOverflowAnswerGenerator { }

  • إذا كان لديك واحدة سلوك العديد من تطبيقات ممكنة, ثم لا يوجد أي مشكلة و يمكنك مجرد قطرة "أنا"،:

    واجهة عامة StackOverflowAnswerGenerator {}

    الطبقة العامة StupidStackOverflowAnswerGenerator :StackOverflowAnswerGenerator {}

    الطبقة العامة RandomStackOverflowAnswerGenerator :StackOverflowAnswerGenerator {}

    الطبقة العامة GoogleSearchStackoverflowAnswerGenerator :StackOverflowAnswerGenerator {}

    //...

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

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

    ب) استخدام مساحة واجهة:

    مساحة StackOverflowAnswerMachine.واجهات { واجهة عامة StackOverflowAnswerGenerator {} }

    مساحة StackOverflowAnswerMachine { الطبقة العامة StackOverflowAnswerGenerator :الواجهات.StackOverflowAnswerGenerator {} }

    ج) استخدام مساحة الاسم التنفيذ:

    مساحة StackOverflowAnswerMachine { واجهة عامة StackOverflowAnswerGenerator {} }

    مساحة StackOverflowAnswerMachine.تطبيقات { الطبقة العامة StackOverflowAnswerGenerator :StackOverflowAnswerMachine.StackOverflowAnswerGenerator {} }

حاليا أنا تجريب مع الاحتمال الأخير.علما أنه في تنفيذ الملف المصدر يمكن أن يكون لا يزال "باستخدام StackOverflowAnswerMachine" ؛ سهولة الوصول إلى كائنات المجال.

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

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

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