سؤال

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

لاحظ أنه لن يكون هناك سوى فئة واحدة فقط من هذه الفئات الكبيرة - ولن يتم استخدام i/f مطلقًا لكائن مختلف.هذا فقط لإخفاء تنفيذ كائن ما.

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

مثال:

public interface class IVeryLargeClass
{
    void DoSomething();
    ...
};

public ref class VeryLargeClass : public IVeryLargeClass
{
public:
    virtual void DoSomething() { ... }
    ...
};

public ref class AnotherClass
{
public:
    AnotherClass(VeryLargeClass^ vlc)  { vlc->DoSomething(); }
 // OR
    AnotherClass(IVeryLargeClass^ vlc) { vlc->DoSomething(); }
};
هل كانت مفيدة؟

المحلول

واحدة من المبادئ الأولى تتعلم في التنمية OO:

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

والبرنامج إلى واجهة، وليس   التنفيذ.

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

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

وببساطة، توفر واجهات وسيلة لإدارة اقتران بين العملاء ومقدمي الخدمات.

نصائح أخرى

التبعية عكس مبدأ يمكن تلخيصها على النحو التالي: من الأفضل أن تعتمد على التجريد من التحجير.

وانها أفضل دائما تقريبا لتمرير واجهة مما هو عليه لتمرير فئة محددة.

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

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

.

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

يتم إبقاء واجهة وحدة البرنامج A منفصلة عن عمد عن تنفيذ تلك الوحدة.يحتوي الأخير على الكود الفعلي للإجراءات والأساليب الموضحة في الواجهة ، وكذلك المتغيرات "الخاصة" الأخرى ، وما إلى ذلك ..أي وحدة برامج أخرى B (والتي يمكن الإشارة إليها كعميل إلى أ) يتفاعل مع A يجبر على القيام بذلك فقط من خلال الواجهة.تتمثل إحدى الميزات العملية لهذا الترتيب في أن استبدال تنفيذ A من قبل آخر يفي بالمواصفات نفسها للواجهة لا ينبغي أن يتسبب في فشل B - طالما أن استخدامه يتوافق مع مواصفات الواجهة (انظر أيضًا Liskov Bublication مبدأ).

http://en.wikipedia.org/wiki/Interface_(computer_science)

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

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