كيف يمكنك الوصول إلى خصائص الكائن من كائن الأسلوب ؟ [مغلقة]

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

  •  08-06-2019
  •  | 
  •  

سؤال

ما هو "الأصولي" أو "الصحيح" الطريق إلى الوصول إلى كائن خصائص من داخل كائن الأسلوب الذي لا جالبة/اضع الطريقة ؟

وأنا أعلم أن من خارج الكائن يجب عليك استخدام جالبة/اضع لكن من داخل هل يمكنك القيام به:

جافا:

String property = this.property;

PHP:

$property = $this->property;

أو يمكنك أن تفعل:

جافا:

String property = this.getProperty();

PHP:

$property = $this->getProperty();

يغفر لي إذا جافا قليلا قبالة ، انها كانت في السنة منذ أن كنت مبرمجة بلغة جافا...

تحرير:

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

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

المحلول

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

نصائح أخرى

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

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

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

أساسا, إذا كان لديك getters و setters لكل حقل خاص, كنت جعل تلك الحقول جيدة العامة.سوف يكون من الصعب جدا-الضغط لتغيير نوع خاص الحقل دون آثار تموج على كل فئة أن المكالمات التي getter.

وعلاوة على ذلك, من صارم OO وجهة نظر الكائنات يجب أن تكون الاستجابة إلى رسائل (الأساليب) التي تتطابق مع (أمل) مسؤولية واحدة.الغالبية العظمى من getters و setters لا معنى التأسيسية الكائنات ؛ Pen.dispenseInkOnto(Surface) من المنطقي بالنسبة لي من Pen.getColor().

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

حاصل على واضعي بيد أن من الضروري الشرور في حدود طبقات -- واجهة المستخدم, استمرار, وهكذا دواليك.تقييد الوصول إلى الطبقة الداخلية ، مثل C++'ق صديق الكلمة, جافا حزمة protected access .صافي الوصول الداخلي ، صديق فئة نمط يمكن أن تساعدك على الحد من الرؤية getters واضعي فقط لأولئك الذين في حاجة إليها.

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

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

PHP يقدم عدد لا يحصى من الطرق للتعامل مع هذا ، بما في ذلك طرق السحر __get و __set, لكن أنا أفضل صريحة حاصل على واضعي.هنا لماذا:

  1. التحقق من الصحة يمكن وضعها في المحددات (و حاصل هذا الشأن)
  2. التحسس الذكي يعمل مع صريح طرق
  3. أي مسألة ما إذا كان العقار هو قراءة فقط أو للكتابة فقط أو للقراءة والكتابة
  4. استرجاع الظاهري خصائص (أي القيم المحسوبة) تبدو نفس خصائص العادية
  5. يمكنك بسهولة تعيين كائن الممتلكات التي هي في الحقيقة لم يعرف في أي مكان ، ثم يذهب غير الشرعيين

أنا مجرد الذهاب إلى البحر هنا ؟

ربما ;)

وثمة نهج آخر هو استخدام خاص/محمية طريقة فعلا الحصول على (التخزين المؤقت/db/الخ) العامة من المجمع عليه أن الزيادات العد:

PHP:

public function getName() {
    $this->incrementNameCalled();
    return $this->_getName();
}

protected function _getName() {
    return $this->name;
}

ثم من داخل الكائن نفسه:

PHP:

$name = $this->_getName();

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

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

أخذ هذا إلى استنتاج جالبة يجب استدعاء جالبة التي يجب استدعاء حاصل.

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

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

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

1) ينبغي أن يتم ذلك في مصلحة الحفاظ على الاتساق مع بالوصول إلى خارج الجسم.

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

أوضح OO طريقة لتجنب كل واتبع القانون ديميتر باستخدام اقول لا تسأل النهج.

بدلا من الحصول على قيمة الكائن الملكية ، بإحكام الأزواج اثنين من الدرجة استخدام الكائن كمعلمة مثلا

  doSomethingWithProperty() {
     doSomethingWith( this.property ) ;
  }

حيث كان مكان الإقامة الأصلي نوع مثلالباحث استخدام أسلوب الوصول اسم هو المشكلة المجال لا البرمجة المجال.

  doSomethingWithProperty( this.daysPerWeek() ) ;

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

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

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

.صافي يمكن للمطورين استخدام التلقائي خصائص لتطبيق هذا منذ كنت لا يمكن أن نرى حتى النسخ المتغيرات في وقت التصميم.

إذا لن تعديل الخاصية سوف تستخدم get_property() الطريقة العامة إلا إنها مناسبة خاصة مثل MySQLi داخل الكائن كائن آخر في هذه الحالة فقط سوف العامة العقار تشير إلى أنها $obj->object_property.

داخل الكائن دائما $this->مكان الإقامة بالنسبة لي.

ذلك يعتمد.انها أكثر من مشكلة النمط من أي شيء آخر ، وليس هناك أي القاعدة الصلبة.

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

حسنا, يبدو مع C# 3.0 الخصائص الافتراضية التنفيذ اتخاذ القرار بالنسبة لك ؛ يجب عليك تعيين الخاصية باستخدام (ربما خاص) الملكية واضع.

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

أود الإجابة من قبل cmcculloh, لكن يبدو أن الراجح هو الجواب من قبل جريج Hurlman.استخدام جالبة/واضعي كل وقت إذا كنت قد بدأت باستخدام لهم من getgo و/أو تستخدم للعمل معهم.

بوصفها جانبا, أنا شخصيا أجد أن استخدام جالبة/واضعي يجعل رمز أسهل للقراءة و التصحيح في وقت لاحق.

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

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

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