التغليف (Encapsulation)

المفهوم الثاني في البرمجة الكائنية..

التغليف (Encapsulation): وقاية حال الكائن بمنع الوصول إليها مباشرةً أو تعيينها إلا من طرق محددة.

فهذا يتحقق من جهتين:

  1. طرائق الوصول (getters) هي الإجراءات التي يتم بها حال الكائن.
  2. طرائق التعيين (setters) هي الإجراءات التي يتم بها حال الكائن.

طرائق الوصول (getters)

نمثل لذلك بحالات الماء الفيزيائيَّة:

  1. الغازية
  2. الصلبة
  3. المائعة

حالات الماء من الأعلى حرارة إلى الأدنى: غاز وسائل وصلب، مع توضيح ترتيب الجزيئات في كل حالة.

نعرّف الحالات الثلاث في WaterState بهذه القطعة البرمجية:

ثم عند تعريف الماء صِنفًا من خواصه درجة الحرارة، يتم تعريف خاصيَّة state كدالة تعطينا الحالة بحسب درجة الحرارة؛ بحيث لا تخرج الحالة عما تم تعريفه مسبقًا، كما هو موضح:

وبهذا نكون قد منعنا من تغيير حال الماء state وأبقينا temperature بلا قيود.

صنف Water: الحرارة في الدائرة الداخلية، والخاصيّة state تحسب الحالة منها.

ثم ننشئ منه كائنًا ونجرب (لاحظ عدم وجود قوسي الاستدعاء عند state؛ لأنَّها @property):

نجرب تغيير درجة الحرارة لنرى كيف ينعكس ذلك على الحال:

طرائق التعيين (setters)

لاحظ أننا غيرنا درجة الحرارة مباشرة في المثال السابق. أما في هذا المثال سنضع طريقة خاصَّة لتغيير درجة الحرارة. لمراعاة الظروف الفيزيائية بحسب معادلة رياضية.

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

أسطوانتان بقطع أمامي: غاز حجمه لتران وضغطه ٥٠ كيلوباسكال، وغاز مضغوط إلى لتر واحد وضغطه ١٠٠ كيلوباسكال.

فالمعادلة بالنسبة للحجم:

حيث ثابت. سنختار أن يكون 100 في هذا المثال.

صنف Piston: الحجم المحفوظ في _volume داخل الدائرة، والخاصيّتان volume وpressure حوله.

في الداخل الحجم المحفوظ، وحوله الخاصيّتان اللتان نتعامل بهما مع الكائن: volume للقراءة والتعيين، وpressure لقراءة الضغط المحسوب.

نجرّب ضغط الغاز بتقليل حجمه إلى النصف:

أما محاولة تعيين حجم غير صالح، فتُظهر سبب الرفض وتُبقي الحجم السابق:

مكبسان من الصنف نفسه

الصنف Piston يعرّف كيفية عمل المكبس، ويمكننا إنشاء كائنات كثيرة منه. ننشئ مكبسين، لكل منهما حجمه:

 الدائرتان تمثلان كائنين مستقلين من الصنف نفسه، لكل منهما قيمة محفوظة تخصّه.