سؤال

بعد قراء بضعة أسابيع في هذا المنتدى اعتقدت أنه كان الوقت المناسب لي للقيام بنظاري الأولى.

أنا حاليا إعادة قراءة التعليمات البرمجية كاملة. أعتقد أنه من العمر 15 عاما منذ آخر مرة، وأجد أنني ما زلت لا أستطيع كتابة التعليمات البرمجية ؛-)

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

class Emplyee {
public: 
 FullName GetName() const;
 Address GetAddress() const;
 PhoneNumber GetWorkPhone() const;
 ...

 bool IsZipCodeValid( Address address);
 ...

private: 
   ...
}

ما يفكر ستيف به هو أن الوظائف مرتبطة فضفاضة. أو لديه يكتب "لا يوجد اتصال منطقي بين الموظفين والروتين الذين تحقق من الرموز البريدية وأرقام الهواتف أو تصنيفات الوظيفة"

حسنا أنا أتفق تماما معه. ربما شيء مثل المثال أدناه هو أفضل.

class ZipCode
{
public:
 bool IsValid() const;
    ...
}

class Address {
public:
   ZipCode GetZipCode() const;
   ...
}

class Employee {
public: 
 Address GetAddress() const;
    ...
}

عند التحقق مما إذا كان الرمز البريدي صالح، ستحتاج إلى فعل شيء من هذا القبيل.

employee.GetAddress().GetZipCode().IsValid();

وهذا ليس جيدا فيما يتعلق قانون demeter..

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

class ZipCode
{
public:
 bool IsValid();
}

class Address {
public:
   ZipCode GetZipCode() const;
   bool IsZipCodeValid() {return GetZipCode()->IsValid());
}

class Employee {
public: 
 FullName GetName() const;
 Address GetAddress() const;
 bool IsZipCodeValid() {return GetAddress()->IsZipCodeValid());
 PhoneNumber GetWorkPhone() const;
}

employee.IsZipCodeValid();

ولكن مرة أخرى لديك إجراءات لا تحتوي على اتصال منطقي.

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

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

المحلول

انها تدفع الآن مقابل الدفع لاحقا.

يمكنك كتابة وظائف الوفد والمجلة الواجب (الدفع الآن) ثم يكون لديك عمل أقل لتغيير Insidents of Employee.iszipcodevalid () لاحقا. أو، يمكنك أن نفق إلى iszipcodevalid عن طريق الكتابة

الموظف. getzipcode (). isvalid ()؛
في كل مكان تحتاجه في التعليمات البرمجية، ولكن الدفع لاحقا إذا قررت تغيير تصميم الفصل الخاص بك بطريقة يكسر هذا الرمز.

تحصل على اختيار السم الخاص بك. ؛)

نصائح أخرى

أنت تفتقد الاتصال المنطقي:

class ZipCode
{
public:
 bool IsValid();
}

class Address {
public:
   ZipCode GetZipCode() const;
   bool IsAddressValid();
   bool IsValid() {return GetZipCode()->IsValid() && IsAddressValid());
}

class Employee {
public: 
 FullName GetName() const;
 Address GetAddress() const;
 bool IsEmployeeValid();
 bool IsValid() {return GetAddress()->IseValid() && IsEmployeeValid());
 PhoneNumber GetWorkPhone() const;
}

employee.IsValid();

نظرا لعدم وجود اتصال منطقي بين فئة الموظف وصحة رمز الرمز البريدي، يمكنك وضع صحة الرمز البريدي في فئة العنوان حيث ينتمي بشكل منطقيا. ثم يمكنك طرح فئة العنوان للتحقق من صحة الرمز البريدي لك.

class Address
{
    public:
        static IsZipValid(ZipCode zip) { return zip.isValid(); }
};

ثم أنت تفعل

Address::IsZipValid(employee.GetAddress().GetZipCode());

أعتقد أن هذا مرض تحت قيود الرابطة المنطقية وقانون demeter.

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