What is Encapsulation?

  • لو ترجمناها للعربي هتلاقيها جاية من كلمة كبسولة

  • اني بحط الdata وال functions المتعلقة بالداتا دي او اللي بتشتغل عليها مع بعض جوا class
  • وعايز أخبي تفاصيل ال data دي عن باقي البرنامج بتاعي او عن باقي ال classes ليه؟ عشان مش عايز أي حاجة برا ال class تقدر تتعامل أو تغير في الداتا بشكل مباشر
  • وبيتقال على الفكرة دي برضو ال black box عشان عاملة زي الصندوق الاسود اللي بدخله input وبيطلعلي output من غير ما اعرف التفاصيل اللي جوا واللي بيحصل

  • بنستخدم في الحوار دا setters & Getters من خلالها بقدر أتعامل مع تغيير الdata اللي عندي او اني أشوف ال values

Why we need Encapsulation?

  1. بيساعد المطور انه بيبقا في تحكم كامل للداتا اللي بيشتغل عليها مثال: فاكر مثال الشطرنج؟ لو قولنا اننا عايزين نحرك قطعة من مربع لمربع تاني أول حاجة محتاج أعرف المكان بتاع القطعة الحالي وبتبقا عبارة عن row, column طبعًا بكل بساطة المفروض أغير المكان الحالي اللي انا فيه للمكان الجديد باني أغير الصف والعمود بكل بساطة
    Class Feel:
    	posRow
    	posColumn
    # Main
    feel = new Feel()
    feel.posColumn = newColumn
    feel.posRow = newRow
    دي مش أحسن طريقة وكدا انت مش بتطبق ال encapsulation خالص الطريقة الأحسن اني أعمل methods جوا ال class عن طريقها اقدر أتعامل مع ال attributes اني بعمل setters & getters
    Class Feel:
    	posColumn
    	posRow
     
    	setNewPos():
    		if validate():
    			posColumn = newColum
    			posRow = newRow
    			if newPos == EnemyPos:
    				eatEnemy()
    	getPos:
    		return posRow, posColumn
    طب وليه كل اللفة دي؟ اني اغير على طول دا خطر جدا، لان ممكن مثلًا المكان اللي الفيل عايز يروح له يكون فيه قطعة تانية موجودة ودا هيعملي مشكلة، او ان المكان مش في نطاق حركة الفيل ^fde557
    • فلازم يبقا عندي method بتعمل شوية validation قبل ما أحرك كدا على طول
    • وممكن أعمل عمليات تانية غير تغيير القيم جوا ال setter زي اني أخليه يتحرك لمكان جديد ولو فيه قطعة للعدو ياكلها وعلى نفس المثال دا فيه attributes or values عمرها ما هتتغير زي لون القطعة مثلًا فمش محتاج أعملها setter وهعمله بس getter
    • الخلاصة: اني بتعامل مع ال variables من خلال ال getters و setters
  2. بيساعدني اني اعرف احافظ على القيم اللي في البرنامج اللي ممكن تكون معتمدة على بعض من غير ما ألغبط الدنيا (Keep tracking) مثال: تخيل اني بعمل لعبة عادية جواها class player
    Class Player:
    	currentHealth # variable
    	maxHealth # variable
    والاتنين لو انت عارف بيبقو معتمدين على بعض لما مثلًا بيحصل level up المفروض ال maxHealth تزيد ولو ال currentHealth ناقصة تتملي فبدل ما أنا هعدل على كل واحد منهم لوحده ويحصل لغبطة ممكن أعمل method جوا ال class تعمل كل العملية دي على بعض
    setHealthOnLevelUp(): # function in class
    	maxHealth += 500
    	currentHealth = maxHealth
  3. بيساعدني اني اعمل validation للداتا قبل ما أغيرها مثال: نفس المثال اللي فوق تخيل اني عايز أعمل زي جواهر كدا لما اللاعب بياخدها بتزود ال health فأنا لو معملتش validation ممكن اللاعب ياخد ويبقا ال currentHealth اكبر من ال max فلازم أعمل حاجة بتعمل check قبل ما دا يحصل
    setHealthOnGem(gem):
    	currentHealth += gem
    	if currentHealth > maxHealth:
    		currentHealth = maxHealth
  4. بيساعدني اني أعزل تفاصيل ال implementation عن الطريقة اللي المفروض يتصرف بيها، ودا بيساعدنا في تغيير التفاصيل أو حاجات جوا ال class من غير نضطر نغير في الكود كله او نأثر على البرنامج كله
  5. بيساعدنا في عملية ال testing وبيسهلها علينا لأن ببساطة انت عارف كل class المفروض يتصرف ازاي فأنت بتختبرها

باختصار بيساعدنا في الحفاظ على النظام وتجنب أخطاء كتير وبيديلك control عالي في البرنامج اللي بتكتبه وبيسهل علينا ال testing وتغيير ال data في ال classes لو حبينا بدون التأثير على البرنامج كله أو لو اضطرينا لتغيير الكود كله فبرضو بيسهل علينا عملية تصليح ال bugs اللي هتظهر وبيمنع ان الكتابة تصبح معقدة