ما هو ثبات و لماذا يجب أن تقلق بشأن ذلك ؟

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

  •  05-07-2019
  •  | 
  •  

سؤال

لقد قرأت عدة مقالات عن ثبات ولكن لا يزال لا تتبع مفهوم بشكل جيد جدا.

أنا قدمت موضوع هنا في الآونة الأخيرة والتي ذكر ثبات, ولكن هذا هو الموضوع في حد ذاته, وأنا على صنع مخصص الموضوع الآن.

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

ما هو بالضبط تعريف الدولة في حالة من هذا المثال ؟ الدولة هو المفهوم الذي لم استوعب.

من التصميم التوجيهي منظور غير قابل للتغيير الدرجة يجب أن يكون واحدا لا يقبل إدخال المستخدم حقا سيعود القيم ؟

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

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

المحلول

ما هو ثبات?

  • ثبات يتم تطبيقها في المقام الأول إلى الكائنات (سلاسل ، المصفوفات ، مخصص الحيوان فئة)
  • عادة ما إذا كان هناك ثابتة نسخة من فئة ، قابلة للتغيير الإصدار هو متاح أيضا.على سبيل المثال, Objective-C و الكاكاو تحديد كل NSString فئة (ثابتة) و NSMutableString الدرجة.
  • إذا هو كائن ثابتة لا يمكن تغييرها بعد ذلك يتم إنشاؤه (أساسا للقراءة فقط).يمكنك التفكير في الأمر على النحو "فقط منشئ يمكن تغيير وجوه".

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

String myString = new ImmutableString("hello");
myString.appendString(" world"); // Can't do this
myString.setValue("hello world"); // Can't do this
myString = new ImmutableString("hello world"); // OK

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

فوائد Immutabilty

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

    String myString = "HeLLo WoRLd";
    String lowercasedString = lowercase(myString);
    print myString + " was converted to " + lowercasedString;
    

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

  • أنه من الأسهل لجعل كائن غير قابل للتغيير مؤشر الترابط-الآمن

  • فإنه يحتمل أن يبسط تنفيذ فئة (لطيفة إذا كنت واحد كتابة الصف)

الدولة

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

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

نصائح أخرى

ثبات

ببساطة, الذاكرة غير قابل للتغيير عندما لا يتم تعديل بعد أن تم تفعيلها

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

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

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

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

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

العديد من لغات البرمجة الوظيفية ، مثل Lisp, هاسكل, إرلانج ، و# و Clojure ، وتشجيع ثابتة هياكل البيانات بطبيعتها.وهذا هو السبب في أنهم يتمتعون تجدد الاهتمام ونحن نتحرك نحو متزايد معقدة متعددة الخيوط تطوير التطبيقات والعديد من الكمبيوتر وهندسة الكمبيوتر.

الدولة

الدولة من تطبيق يمكن ببساطة اعتبار محتويات كل ذاكرة سجلات وحدة المعالجة المركزية عند نقطة معينة في الوقت.

منطقيا, برنامج الدولة يمكن تقسيمها إلى قسمين:

  1. الدولة كومة الذاكرة المؤقتة
  2. دولة كومة من كل المنفذة الموضوع

في البيئات المدارة مثل C# و Java, موضوع واحد لا يمكن الوصول إلى ذاكرة أخرى.ولذلك كل موضوع 'يملك' الدولة من المكدس.كومة يمكن اعتبار عقد المتغيرات المحلية و المعلمات من نوع القيمة (struct) مراجع إلى الكائنات.هذه القيم هي معزولة عن الخارج المواضيع.

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

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

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

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

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

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

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

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

ويساعد هذا الأمل.

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

على سبيل المثال هنا هو الخريطة في Clojure

(def imap {1 "1" 2 "2"})
(conj imap [3 "3"])
(println imap)

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

{3 "3", 1 "1", 2 "2"}

ثبات يساعد على الحفاظ على رمز نظيفة و آمنة.هذه وغيرها من الأسباب هو السبب في لغات البرمجة الوظيفية تميل إلى الانكفاء نحو ثبات أقل statefulness.

وسؤال جيد.

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

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

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

وأيضا ثبات يقلل من كمية من الاحتمالات في البرنامج مما يقلل من تعقيد المحتملة واحتمالات الخلل.

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

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

اسمحوا لي أن أضيف أكثر من شيء واحد.إلى جانب كل ما ذكر أعلاه تحتاج أيضا ثبات على:

وجعل الأشياء غير قابل للتغيير يمنع عددا كبيرا من الأخطاء الشائعة.

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

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

وجعل الأشياء غير قابل للتغيير يعني أنك لا يجب أن نتذكر (أو تأخذ من الوقت / الذاكرة) لعمل نسخ defencive.

إذا كنت تعمل حقا في ذلك، والتفكير في كل متغير التي تقوم بها، وسوف تجد أن الغالبية العظمى (I وعادة ما يكون 90-95٪) من المتغيرات الخاصة بك مرة واحدة لا تتغير أبدا تعطى قيمة. القيام بذلك يجعل البرامج أسهل لمتابعة ويقلل من عدد من البق.

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

و"... لماذا يجب أن تقلق بشأن ذلك؟"

وهناك مثال عملي هو سلسلة متكررة من السلاسل. في. NET على سبيل المثال:

string SlowStringAppend(string [] files)
{
    // Declare an string
    string result="";

    for (int i=0;i<files.length;i++)
    {
        // result is a completely new string equal to itself plus the content of the new
        // file
        result = result + File.ReadAllText(files[i]);
    }

    return result;
}    

string EfficientStringAppend(string [] files)
{
    // Stringbuilder manages a internal data buffer that will only be expanded when absolutely necessary
    StringBuilder result=new SringBuilder();

    for (int i=0;i<files.length;i++)
    {
        // The pre-allocated buffer (result) is appended to with the new string 
        // and only expands when necessary.  It doubles in size each expansion
        // so need for allocations become less common as it grows in size. 
        result.Append(File.ReadAllText(files[i]));
    }

    return result.ToString();
}

ومما يؤسف له باستخدام نهج الأول (بطيئة) وظيفة لا تزال شائعة الاستخدام. فهم ثبات يجعل من الواضح جدا لماذا تستخدم ب StringBuilder وهذا مهم جدا.

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

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

string mystring = "inital value";
mystring = "new value";
System.Console.WriteLine(mystring); // Outputs "new value";

ووالتفكير لأنفسهم "، ولكن أنا تغييره، تبدو هناك حق، باللونين الأبيض والأسود! mystring" القيمة الجديدة "مخرجات ...... فكرت قلت أنا لا يمكن تغييره؟ !!"

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

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

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

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

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

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

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

لغات أخرى / أنواع سيكون بالمثل الحلول الخاصة بها.

لماذا ثبات?

  1. هم أقل عرضة للخطأ و هي أكثر أمنا.

  2. ثابتة الطبقات هي الأسهل لتصميم وتنفيذ واستخدام قابلة للتغيير من الطبقات.

  3. ثابتة الكائنات مؤشر الترابط-الآمن حتى لا يكون هناك أي مشاكل المزامنة.

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

  5. ثبات يجعل من الأسهل لكتابة واستخدام العقل عن رمز (فئة ثابتة إنشاء مرة واحدة ثم لم يتغير).

  6. ثبات يجعل من الأسهل إلى يوازي البرنامج كما أن هناك أي تعارض بين الكائنات.

  7. الدولة الداخلي من البرنامج سوف تكون متسقة حتى إذا كان لديك استثناءات.

  8. مراجع ثابتة الكائنات يمكن أن يكون مؤقتا كما هي لن تتغير.(أنا.ه في تجزئة تقدم سريع العمليات).

انظر بلدي بلوق عن إجابة أكثر تفصيلا:
http://javaexplorer03.blogspot.in/2015/07/minimize-mutability.html

وانظروا، أنا لم أقرأ الروابط التي قمت بنشرها.

ولكن، وهنا أفهم.
يحمل كل برنامج بعض المعرفة انها بيانات (الدولة)، والتي يمكن تغيير إما عن طريق المستخدم الإدخال / التغيرات الخارجية وغيرها.

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

وAFAIK والبرمجة وظيفية لديها أشياء ثابتة (أي لا يمكنك استخدام تخصيصات لمتغير عقد قيمة ما يمكنك القيام به هو إنشاء متغير آخر التي يمكن أن تعقد القيمة الأصلية + تغييرات).

وصافي ديه الدرجة سلسلة الذي هو مثال على ذلك.
أي لا يمكنك تعديل سلسلة في مكانها

وسلسلة ق = "مرحبا". أستطيع أن أكتب s.Replace ( "ايل"، "أ")؛ ولكن هذا لن تعديل محتويات الصورة متغير.

وماذا يمكنني القيام به هو الصورة = s.Replace ( "ايل"، "أ")؛
هذا سيخلق متغير جديد وتعيين قيمته إلى الصورة (الكتابة محتوى الصورة).

ويمكن أن الخبراء تصحيح الأخطاء إذا كان لدي، في فهمي.

وتحرير: (؟ ربما) ثابتة = Unassignable مرة واحدة أنها تحتجز بعض القيمة ولا يمكن استبدالها في المكان

ومثال على مزايا الأداء المحتملة المقدمة من قبل كائنات ثابتة متوفر في API WPF. وهناك فئة قاعدة مشتركة للعديد من أنواع WPF هي Freezable.

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

وشخصيا أتمنى أن مفهوم ثبات الأسهل للتعبير باللغة I تستخدم في معظم الأحيان، C #. هناك معدل readonly متاح للحقول. أود أن أرى معدل readonly على أنواع كذلك أنه سيسمح فقط لأنواع التي لديها فقط الحقول للقراءة فقط التي هي من أنواع للقراءة فقط. أساسا هذا يعني أن كل دولة سوف تحتاج ليتم حقنه في وقت الإنشاء، وسوف يتم تجميد ذلك والرسم البياني الكائن بأكمله. أتصور أن كان هذا التعريف جوهري إلى CLR ثم يمكن استخدامه بسهولة لتحسين تحليل القمامة لGC.

عذرا، لماذا لا ثبات منع حالات السباق (في هذا المثال، والكتابة بعد قراءة المخاطر)؟

shared v = Integer(3)
v = Integer(v.value() + 1) # in parallel

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

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

Book bookPotter =  new Book();
bookPotter.setAuthor('J.K Rowling');
bookPotter.setTitle('Harry Potter');

هذا المثال لديه بعض المجالات مثل المؤلف والعنوان.كل شيء على ما يرام, ولكن في بعض جزء من التعليمات البرمجية مرة أخرى واضعي تستخدم.

Book bookLor =  bookPotter; // only reference pass
bookLor.setAuthor('J.R.R Tolkien');
bookLor.setTitle('Lords of The Rings');

لا يكون خدع من قبل مختلف متغير اسم حقا هو نفس سبيل المثال.التعليمات البرمجية باستخدام المحددات على نفس الدرجة مرة أخرى.فهذا يعني أن bookPotter لم يكن هاري بوتر الكتاب ، bookPotter هو إلا مؤشر إلى مكان غير معروف الكتاب يقع.وقال يبدو أكثر الرف ثم الكتاب.ما أثق بك يمكن أن يكون هذا الكائن ؟ هو كتاب هاري بوتر أو لور الكتاب أو لا ؟

قابلة للتغيير مثيل فئة ليست سوى مؤشر إلى حالة غير معروفة مع الطبقة الخصائص.

ثم كيف تجنب الطفرة ؟ فمن السهل جدا في القواعد:

  • بناء الكائن مع أرادت الدولة عن طريق منشئ أو البناء
  • لا إنشاء واضعي على مغلف الدولة من وجوه
  • لا تغير أي مغلفة الدولة الكائن في أي من أساليب

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

Book bookPotter =  new Book('J.K Rowling', 'Harry Potter');
Book bookLor = new Book('J.R.R Tolkien', 'Lord of The Rings');

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

إذا كنت مهتما في أوسع نطاق من ثبات في هذه المادة متوسطة أكثر حول هذا الموضوع فيما يتعلق جافا سكريبت https://medium.com/@macsikora/the-state-of-immutability-169d2cd11310.

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