أيهما أكثر ملاءمة:الحروف والمستوطنين أو الوظائف؟

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

سؤال

هل من المناسب على الإطلاق التخلي عن نمط "getMyValue ()" و"setMyValue ()" الخاص بالحروف والمحددات إذا كانت أسماء الوظائف البديلة تجعل واجهة برمجة التطبيقات (API) أكثر وضوحًا؟

على سبيل المثال، تخيل أن لدي هذا الفصل في C++:


public class SomeClass {
private:
    bool mIsVisible;

public:
    void draw();
    void erase();
}

يمكنني إضافة وظائف للحصول على/تعيين "mIsVisible" مثل هذا:


bool getVisible() { return mIsVisible; };

void setVisible (bool visible) {if (! misvisible && visible) {draw () ؛} آخر إذا (misvisible &&! visible) {erase () ؛}

mIsVisible = visible;

}

ومع ذلك، سيكون من الممكن أيضًا استخدام الطرق التالية بدلاً من ذلك:


bool isVisible() { return mIsVisible; };

void show() { 
    if (!mIsVisible) {
        mIsVisible = true;
        draw();
    }
}

void hide() {
    if (mIsVisible) {
        mIsVisible = false;
        erase();
    }
}

باختصار، هل من الأفضل أن يكون لديك أسلوب "setVisible(bool)" واحد، أم زوج من أساليب "show()" و"hide()"؟هل هناك اتفاقية أم أنها شيء ذاتي بحت؟

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

المحلول

إقرأ المقال "أخبر، لا تسأل"في موقع ويب Pragmatic Programmers وأعتقد أنك سترى أن المثال الثاني هو الطريق الصحيح.

في الأساس، لا ينبغي عليك نشر المنطق من خلال الكود الخاص بك والذي تم تضمينه في المثال الأول، وهو:

  1. الحصول على قيمة الرؤية الحالية،
  2. اتخاذ القرار على أساس القيمة،
  3. كائن التحديث.

نصائح أخرى

في المثال الذي قدمته show() و hide() منطقي جدًا، على الأقل بالنسبة لي.

ومن ناحية أخرى، إذا كان لديك عقار skinPigment وقررت إجراء وظائف تسمى tanMe() و makeAlbino() سيكون هذا خيارًا سيئًا وغير واضح حقًا.

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

واود ان اذهب مع isVisible () / العرض () / اخفاء () مجموعة.

وsetVisible () يعني أن كل ما يفعله هو تغيير المتغير الداخلي. عرض () والاختباء () جعل آثار جانبية واضحة.

ومن ناحية أخرى، إذا فعل كل getVisible () / setVisible () <م> كان لتغيير المتغير الداخلي، ثم كنت قد غيرت فقط قليلا بشكل ملحوظ من وجود لهم كحقول العامة.

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

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

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

وأنا أفضل عرض () والاختباء () طرق لأنهم أقول صراحة ما أنت ذاهب. وsetVisible (منطقية) لا أقول لكم إذا كان الأسلوب سوف تظهر / رسم على الفور. بالإضافة إلى عرض () والاختباء () وأفضل تسميتها طريقة لواجهة (IMHO).

وضمنيا، على "عرض" وظائف "اخفاء" لك قائمة على حد سواء اضعي

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

في حالة لديك فعلا لكتابة التعليمات البرمجية مثل

if (shouldBeShowingAccordingToBusinessLogic()) w.show();
else w.hide();

وفي كل مكان، هل يمكن أن يكون أفضل حالا مع

w.showIfAndOnlyIf(shouldBeShowingAccordingToBusinessLogic())

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

w.setPostponedVisibility(shouldBeShowingAccordingToBusinessLogic());
...
w.realizeVisibility();

و(ألم أقول انها عجيبة؟)

وهناك حافزا إضافيا للذهاب من أجل حل عرض / اخفاء هو أن كصانعة،

وطريقة setVisible له "تأثير الجانب"، حيث أنه يعرض أيضا أو يخفي SomeClass. طرق عرض / اخفاء تنقل أفضل القصد من ما يحدث.

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