يجب عليك استخدام أي وقت مضى محمية الأعضاء المتغيرات ؟

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

  •  09-06-2019
  •  | 
  •  

سؤال

يجب عليك استخدام أي وقت مضى محمية الأعضاء المتغيرات ؟ ما هي مزايا و ما هي القضايا يمكن هذا السبب ؟

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

المحلول

يجب عليك استخدام أي وقت مضى محمية الأعضاء المتغيرات ؟

يعتمد على كيفية كنت من الصعب إرضاءه حول إخفاء الدولة.

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

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

نصائح أخرى

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

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

عموما, إذا كان هناك شيء لا عمدا تصور العامة ، أنا تجعل من القطاع الخاص.

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

هذا نادرا ما يحدث - أنا لست مروحة في كل من الميراث ، كما أنها ليست وسيلة جيدة للغاية إلى نموذج معظم الحالات.على أي حال, تحمل, لا تقلق.

أود أن أقول هذا هو غرامة (وربما أفضل طريقة للذهاب نحو ذلك) على الغالبية العظمى من المطورين.

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

الحقيقي الوحيد ويستثنى من ذلك إذا كنت في الأعمال التجارية من شحن الثنائية dll في الصندوق الأسود شكل إلى أطراف ثالثة.هذا يتكون في الأساس من مايكروسوفت ، تلك 'مخصص تحكم DataGrid' البائعين, و ربما قليل من أخرى كبيرة من التطبيقات التي تأتي مع التمدد المكتبات.إلا إذا كنت في هذه الفئة, الأمر لا يستحق إنفاق الوقت/الجهد للقلق حول هذا النوع من الشيء.

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

هنا ما الفائقة لا هل بعد صنع متغير عضو المحمية بدلا من القطاع الخاص-مع-accessors:

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

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

  3. تعيين نقطة توقف أو إضافة إخراج التصحيح عندما متغير قراءة أو كتابة.

  4. إعادة تسمية الأعضاء متغير دون البحث من خلال جميع التعليمات البرمجية التي يمكن استخدامها.

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

على مستوى التصميم قد يكون من المناسب استخدام الممتلكات المحمية ، ولكن التنفيذ لا أرى أي ميزة في تعيين هذا إلى حماية الأعضاء متغير بدلا من accessor/mutator الأساليب.

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

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

Accessor/mutator أساليب العرض إلى حد كبير أكثر API والاستقرار تنفيذ المرونة تحت الصيانة.

أيضا, إذا كنت OO خالصة, الكائنات التعاون/التواصل عن طريق إرسال رسائل لا تقرأ/إعداد الدولة.

في المقابل أنها توفر مزايا قليلة جدا.لكن ليس بالضرورة إزالتها من شخص آخر رمز, ولكن لا تستخدم لهم نفسي.

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

على سبيل المثال ، إذا كان لدي الدرجة التي تحدد العرض والارتفاع من renderable الكائن وأنا جعل تلك المتغيرات المحمية ، ثم أنا يمكن أن تجعل أي افتراضات أكثر (على سبيل المثال) ، نسبة الارتفاع.

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

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

كمثال:

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

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

أكثر من مرة, أنه أمر خطير لاستخدام المحمية بسبب كسر إلى حد ما التغليف من الفئة الخاصة بك, والتي يمكن تقسيمها من قبل سوء تصميم فئة مشتقة.

ولكن لدي واحدة جيدة على سبيل المثال:دعونا نقول لكم أن بعض نوع من عام الحاوية.وقد داخلي وتنفيذ الداخلية accessors.ولكن عليك أن تقدم على الأقل 3 الجمهور الوصول إلى البيانات:خريطة hash_map, ناقلات-مثل.ثم لديك شيء من هذا القبيل:

template <typename T, typename TContainer>
class Base
{
   // etc.
   protected
   TContainer container ;
}

template <typename Key, typename T>
class DerivedMap     : public Base<T, std::map<Key, T> >      { /* etc. */ }

template <typename Key, typename T>
class DerivedHashMap : public Base<T, std::hash_map<Key, T> > { /* etc. */ }

template <typename T>
class DerivedVector  : public Base<T, std::vector<T> >        { /* etc. */ }

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

ملخص وبالتالي يجب حماية البيانات المستخدمة من قبل فئة مشتقة.لا يزال يجب أن تأخذ الباحث o الاعتبار الفئة الأساسية يجب أن تكون مجردة.

باختصار نعم.

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

للعلم فقط في إطار البند 24 من "استثنائية C++" ، في واحدة من الحواشي ، سوتر يذهب "أنت لن أكتب فئة من العامة أو حماية الأعضاء متغير.أليس كذلك ؟ (بغض النظر عن سوء وضع بعض المكتبات.)"

للحصول على معلومات مفصلة عن .صافي معدلات الوصول اذهب هنا

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

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