عمر الكائن

في البرمجة كائنية التوجه (OOP)، يُعرف عمر الكائن بأنه الفترة الزمنية بين إنشائه وتدميره. في بعض سياقات البرمجة، يتزامن عمر الكائن مع عمر المتغير الذي يُمثله. أما في سياقات أخرى - حيث يتم الوصول إلى الكائن عن طريق المرجع - فلا يتحدد عمر الكائن بعمر المتغير. على سبيل المثال، قد يؤدي تدمير المتغير إلى تدمير المرجع فقط، وليس الكائن المُشار إليه. [ 1 ]

الحتمية

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

تختلف صيغة إنشاء الكائنات وتدميرها باختلاف سياق البرمجة. في العديد من السياقات، بما في ذلك C++ وC# وJava، يتم إنشاء الكائن باستخدام صيغة خاصة مثل `create` . في C++، التي توفر إدارة يدوية للذاكرة ، يتم تدمير الكائن باستخدام الكلمة المفتاحية `destruction`. أما في C# وJava، حيث لا توجد صيغة تدمير صريحة، يقوم جامع البيانات المهملة بتدمير الكائنات غير المستخدمة تلقائيًا. [ 1 ]new typename()delete

يتمثل أحد الأساليب البديلة والحتمية للتدمير التلقائي في تدمير الكائن عندما يقوم الكود بإنقاص عدد مراجع الكائن إلى الصفر. [ 2 ]

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

تتمتع الكائنات ذات تخصيص الذاكرة الثابتة بعمر افتراضي يتزامن مع تشغيل البرنامج، ولكن ترتيب إنشاء وتدمير الكائنات الثابتة المختلفة يكون غير حتمي بشكل عام.

دورة الحياة

تشير دورة حياة الشيء إلى الأحداث التي يمر بها الشيء، بما في ذلك ما بين إنشائه وتدميره. [ 3 ] [ 4 ]

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

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

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

الخلق

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

دمار

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

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

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

مع خاصية جمع البيانات المهملة ، يمكن حذف الكائنات عندما يتعذر على البرنامج الوصول إليها. يستدعي جامع البيانات المهملة دالة الإنهاء قبل تحرير الذاكرة. [ 2 ]

يؤدي تدمير كائن ما إلى إبطال جميع المراجع المتعلقة به. في إدارة الذاكرة اليدوية، يصبح أي مرجع موجود مرجعًا معلقًا . أما في عملية جمع البيانات المهملة، فلا تُدمر الكائنات إلا عند عدم وجود أي مراجع لها.

تناسق

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

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

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

البرمجة القائمة على الفصول الدراسية

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

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

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

إدارة الموارد

في اللغات التي تستخدم كائنات ذات دورة حياة محددة، يمكن استخدام دورة الحياة لتضمين إدارة الموارد . يُعرف هذا بنمط " اكتساب الموارد هو التهيئة" (RAII). تُكتسب الموارد أثناء التهيئة، وتُحرر أثناء الإنهاء. [ 4 ] [ 5 ] أما في اللغات التي تستخدم كائنات ذات دورة حياة غير محددة (أي التي تُجمع بياناتها بواسطة جامع البيانات المهملة)، فعادةً ما تُفصل إدارة الذاكرة عن إدارة الموارد الأخرى.

أمثلة

لغة سي++

يمكن تعريف فئة C++ بقيم افتراضية على النحو التالي : [ 4 ]

class Foo { // ... };

عند تعريف الكائن في سياق تلقائي، يتم تدميره عند إغلاق الكتلة التي تم تعريفه فيها. [ 4 ]

int bar () { Foo foo ; // يتم تدمير foo هنا }

عند إنشائها ديناميكيًا، فإنها تبقى حتى يتم تدميرها صراحةً. [ 4 ]

int bar () { Foo * foo = new Foo (); delete foo ; }

عند استخدام المؤشرات الذكية ، يتم التحكم في دلالات تدميرها بناءً على النطاق أو المراجع المشتركة.

جافا

يمكن تعريف فئة جافا بقيم افتراضية كما يلي :

class Foo { // ... }

بعد إنشاء مثيل (أي new Foo())، يبقى موجودًا حتى لا يكون له أي مراجع، ثم يقوم جامع البيانات المهملة بحذفه. [ 6 ]

الصدأ

تستخدم لغة Rust تعليقات تعريفية لتحديد مدة صلاحية الوسائط المُمرَّرة إلى دالة. تُعرَّف مدة الصلاحية في توقيع الدالة بين قوسين زاويين. في هذا المثال، يتم تمرير مرجع إلى بنية File إلى دالة المثال مع التعليق التعريفي 'a' . [ 7 ]

fn example <' a > ( file : & ' a File ) { // ... }

مراجع

  1. 1 2 3 سكوت، مايكل (23 مارس 2009). براغماتية لغات البرمجة (  الطبعة الثالثة). مورغان كوفمان . الصفحات 114-115 ، 120-121 ، 356-359 . ISBN  978-0-08-092299-7.
  2. 1 2 جونز، ريتشارد؛ هوسكينغ، أنتوني؛ موس، إليوت (1 يونيو 2023). دليل جمع البيانات المهملة: فن إدارة الذاكرة التلقائية ( الطبعة الثانية). مطبعة سي آر سي . الصفحات 61، 312. doi : 10.1201/9781003276142 . ISBN   978-1-000-88368-8.
  3. كامبل، ماثيو (22 سبتمبر 2012). وصفات أوبجكتيف-سي: منهج حل المشكلات . أبريس. ص 262. ISBN  978-1-4302-4372-4.
  4. 1 2 3 4 5 غريغوار، مارك (24 فبراير 2021). لغة C++ الاحترافية . جون وايلي وأولاده . الصفحات 41-45 ، 211-213 ، 258-259 ، 1091-1093 . ISBN  978-1-119-69540-0.
  5. ماليا، أنطونيو؛ زوفولي، فرانشيسكو (15 مارس 2019). أساسيات لغة C++: انطلق بقوة مع لغة C++، اللغة التي تدعم عمالقة التكنولوجيا عالميًا . دار نشر Packt المحدودة . رقم ISBN 978-1-78980-390-7.
  6. شيلدت، هربرت (12 نوفمبر 2021). جافا: المرجع الكامل ( الطبعة الثانية عشرة). ماكجرو هيل . ISBN  978-1-260-46342-2.
  7. جينجسيت، جون (21 ديسمبر 2021). Rust for Rustaceans: Idiomatic Programming for Experienced Developers . No Starch Press . ص 14-15 . ISBN  978-1-7185-0186-7.