تصميم الطبقة مقابلIDE:هي غير عضو nonfriend وظائف حقا يستحق كل هذا العناء ؟

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

سؤال

في (وإلا) كتاب ممتاز C++ معايير الترميز, البند 44 بعنوان "تفضل الكتابة غير عضو nonfriend وظائف", سوتر و Alexandrescu نوصي فقط المهام التي تحتاج حقا الوصول إلى أعضاء من فئة أنفسهم أعضاء تلك الفئة.جميع العمليات الأخرى التي يمكن أن تكون مكتوبة باستخدام فقط الأعضاء الوظائف لا ينبغي أن تكون جزءا من الدرجة.ينبغي أن تكون لغير الأعضاء nonfriends.الحجج هي:

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

على الرغم من أن أرى قيمة في هذه الحجة ، أرى العيب كبير: بلدي IDE لا يمكن أن تساعدني في العثور على هذه الوظائف! كلما لدي كائن من نوع ما ، وأريد أن أرى ما هي العمليات المتاحة على ذلك, لا أستطيع أن اكتب فقط "pMysteriousObject->"والحصول على قائمة من وظائف الأعضاء بعد الآن.

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

لذلك أنا أتساءل عما إذا كان حقا يستحق كل هذا العناء. كيف يمكنك التعامل مع هذا ؟

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

المحلول

انا ذاهب الى أن نختلف مع سوتر و Alexandrescu على هذا واحد.أعتقد إذا كان سلوك الدالة foo() يندرج ضمن نطاق فئة Bar's المسؤوليات ، ثم foo() ينبغي أن تكون جزءا من bar().

حقيقة أن foo() لا تحتاج إلى الوصول المباشر إلى Bar's الأعضاء البيانات لا يعني أنه ليس من الناحية النظرية جزء من Bar.فإنه يمكن أن يعني أيضا أن رمز جيدا الحسبان.فإنه ليس من غير المألوف أن يكون وظائف الأعضاء التي تؤدي جميع سلوكهم طريق أخرى وظائف الأعضاء, و أنا لا أرى لماذا ينبغي أن يكون.

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

أما بالنسبة لهذه نقاط محددة:

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

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

يجعل الكتابة وظيفة قوالب أسهل لأنك لا تضطر إلى تخمين كل مرة ما إذا كان بعض من وظيفة عضو أو لا.

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

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

.بالتأكيد ، كما يخلق الكثير من إضافية, وظائف الخارجية اختبار وصيانة.لا أرى قيمة في هذا.

نصائح أخرى

سكوت مايرز لديه رأي مماثل إلى ساتر ترى هنا.

كما ينص بوضوح على ما يلي:

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

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

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

أنا لا أعتقد أنه سيكون من الخطأ أن نقول أن بينهما ساتر Alexandrescu ، مايرز قد فعلت أكثر جودة من C++ من أي شخص آخر.

سؤال واحد بسيط يسألون هي:

إذا كانت وظيفة الأداة اثنين المستقلة الطبقات كما parameteres الذي فئة "الخاصة" عضو وظيفة ؟

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

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

بالنظر إلى أن الأكثر تأثيرا C++ الخبراء في العالم يعتبرون أن عدم وظائف الأعضاء مع فئة المعلمة هي جزء من الطبقات واجهة, هذا هو أكثر من قضية مع IDE الخاص بك بدلا من أسلوب الترميز.

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

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

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

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

على سبيل المثال:إنشاء فئة نقطة ، ثم إضافة فئة PointDrawer لاستدراجه إلى صورة نقطية ، PointSerializer لحفظه ، إلخ.

إذا كنت تعطي لهم البادئة المشتركة ، ثم ربما IDE الخاص بك سوف يساعد إذا كنت نوع

::prefix

أو

namespace::prefix

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

وأود أن يكون الفكر IDE كان يساعد أنت خارجا.

على IDE هو إخفاء حماية وظائف من القائمة لأنها ليست متاحة العامة كما أن المصمم من الدرجة المقصودة.

إذا كنت قد تم في نطاق فئة كتبته هذا-> ثم المحمية الوظائف سيتم عرضها في القائمة.

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