سؤال

وأنا أحب مفهوم ثبات لكن في بعض الأحيان أتساءل، عندما لا يقصد تطبيق لتكون موازية، ينبغي للمرء تجنب جعل الأمور غير قابل للتغيير؟

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

وأم أن ثبات مفهوم مثل OOP أنك إما استخدام كل وسيلة أم لا؟ باستثناء الحالات عندما يكون هناك شيء لا ينبغي أن ثابت يقوم على استخدام / الأداء، وما إلى ذلك.

وأنا واجهت هذا السؤال عند كتابة طلب لنفسي، وهذا هو كبير نسبيا (ربما مثل 1-2k خطوط).

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

المحلول

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

عند تمرير كائن خارج لعنصر آخر مثل List<T>، وأنت تحت رحمة ما يفعله هذا المكون. هذا مهم بشكل خاص عند العودة مجموعات من الخصائص.

public class Foo { 
  private List<Bar> _barList;
  public ICollection<Bar> BarList { get return _barList; } 
}

وهناك شيء وقف المستهلك من هذه الفئة من تطهير جمع من تحت لي. حتى تبديل نوع العودة إلى IEnumerable<Bar> ليست آمنة تماما. لا يوجد شيء وقف بعض قطعة من قانون مكتوب بشكل سيئ من الإدلاء هذا إلى List<T> والدعوة .Clear ().

ولكن إذا أريد حقا جمع البقاء متسقة أتمكن من إعادة كتابتها كما followis

public class Foo {
  private ImmutableCollection<Bar> _barList;
  public ImmutableCollection<Bar> BarList { get { return _barList; } }
}

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

نصائح أخرى

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

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

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

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