باستخدام صديق الطبقة مقابلمضيفا accessors لاختبار وحدة في C++?

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

  •  18-09-2019
  •  | 
  •  

سؤال

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

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

المحلول

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

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

و كما قال بحق, التبعثر العامة سطح الطبقة مع الأشياء غير المستعملة هو أيضا غير مرغوب فيه لأسباب خاصة.

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

نصائح أخرى

سوف أوافق على الإجابة المقبولة وتوصي بدلا من استخدام فئة الصداقة.

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

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

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

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

فئة الصديق myclasstest؛

والآن يمكنك اختبار صفك بأي طريقة تريده!

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

أوصي باستخدام مسافر بدلا من السماح بالوصول عبر الطبقات العامة أو فصول الأصدقاء.

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

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

ماذا عن جعل الحالة الداخلية "محمية"؟ ثم قم بتثبيته باستخدام فئة مشتقة.

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

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

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

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