سؤال

(وإذا نحينا جانبا مسألة يجب أن يكون لهم في كل شيء.)

كان دائما يفضل أن مجرد استخدام وظيفة الحمولة الزائدة تعطيك نفس اسم لكل جالبة واضعي.

int rate() { return _rate; }      
void rate(int value) { _rate = value; }

// instead of     
int getRate() { return _rate; }      
void setRate(int value) { _rate = value; }

// mainly because it allows me to write the much cleaner     
total( period() * rate() );    
// instead of      
setTotal( getPeriod() * getRate() );

بطبيعة الحال أنا الصحيح, ولكن كنت أتساءل إذا كان مكتبة الكتاب أي سبب وجيه ؟

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

المحلول

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

وأيضا، كما أشار آخرون، البعض يفضل حذف "الحصول على" وترك "مجموعة"، أي بمعنى.

int Rate( );
void SetRate( int value );

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

نصائح أخرى

ولقد فضلت دائما بحذف "الحصول" على حاصل بلدي، كما تفعل مع rate() بدلا من getRate(). ولكن الحمولة الزائدة للواضع لا يبدو وكأنه فكرة جيدة جدا بالنسبة لي، منذ rate اسم لا ينقل أن الكائن يتم تحور. النظر فيما يلي:

total(period() * rate()); // awesome, very clear

rate(20); // Looks like it computes a rate, using '20'...but for what?  And why ignore the return value?

وماذا عن int rate(); وvoid setRate(int value);؟ وهذا له بحكم عدم وجود وظيفتين الذي يحمل نفس الاسم القيام بأشياء مختلفة، ولا يزال يسمح period() * rate().

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

وعلى سبيل المثال:

struct A
{
   void Foo(int);
   int Foo()const;
};

std::vector<A> v = ....;
std::vector<int> foos;
// Extract Foo
std::transform(
   v.begin(), v.end(), 
   std::back_inserter(foos), 
   //Ambiguous
   // std::tr1::bind(&A::Foo)
   //must write this instead. Yuck!
   std::tr1::bind(static_cast<int(Foo::*)()>(&A::Foo));
);

وإذا نحينا جانبا مسألة يجب أن يكون لهم على الإطلاق؛ -)

سأمضي ذكر هذا ينبغي أن يكون مجتمع ويكي السؤال.

عندما بدأت تعلم C++ بحثت عن نمط أدلة, جوجل كانت جيدة للحصول على بعض النقاط:

  • أساليب في أحرف كبيرة (إنها أجمل).
  • حاصل بوضوح و lowecase (rate).
  • واضعي صراحة والصغيرة (setRate).

ويجري موجزة هو المهم، ولكن ليس على حساب من كونها ناقصة أو مضللة. لهذا السبب، أنا أفضل GetFoo () وSetFoo () لفو () وفو (الباحث فو).

هناك عدة مستويات من أجل "الحصول على" و "إعداد"

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

حتى الحصول على/مجموعة يمكن أن يعزى مفيدة معنى ، وأن تكون جزءا من مجموعة أكبر ، بما يتفق استراتيجية التسمية.

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

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

وعلاوة على ذلك، فإنه يجعل إنجاز قانون أسهل.

وobj.set (control shift space) لواضعي
obj.get (control shift space) للحاصل

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

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

وربما يكون هناك استثناءات ولكن أنا أكره مجرد النظر في فئة وإيجاد "getX / setX، غيتي / سيتي، الخ الخ." يبدو فقط لم يكن هناك ما يكفي من الفكر وضعت في كيفية الطبقة ينبغي أن تستخدم وبدلا جعلت المؤلف الطبقة EASY للحصول على البيانات بحيث أنه لن يكون للنظر في الكيفية التي ينبغي أن تستخدم الطبقة.

وبطبيعة الحال أنا صحيح.

وثمة مسألة أخرى قد ذكر دون سواه هو الحال في وظيفة الحمولة الزائدة. أغتنم هذه (مفتعلة وغير مكتمل) مثال:

class Employee {
    virtual int salary() { return salary_; }
    virtual void salary(int newSalary) { salary_ = newSalary; }
};

class Contractor : public Employee {
    virtual void salary(int newSalary) {
        validateSalaryCap(newSalary);
        Employee::salary(newSalary);
    }
    using Employee::salary; // Most developers will forget this
};

وبدون ذلك الشرط using، مستخدمي Contractor لا يمكن الاستعلام عن الراتب بسبب الحمل الزائد. I مؤخرا بإضافة -Woverloaded-virtual إلى مجموعة التحذير من مشروع أعمل على، ولو ولمح، وهذا ظهر في كل مكان.

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

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

ويمكن أن يكون القضايا:

class Stuff {
  void widget( int something ); // 'special' setter
  const Widget& widget( int somethingelse ) const; // getter
}
Stuff a; 
a.widget(1); // compiler won't know which widget you mean, not enough info

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

وهذا هو شخصي واضح، وهذا يحدث لمجرد أن يكون لي تفضيل شخصي.

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