اني بحط الdata وال functions المتعلقة بالداتا دي او اللي بتشتغل عليها مع بعض جوا class
وعايز أخبي تفاصيل ال data دي عن باقي البرنامج بتاعي او عن باقي ال classes
ليه؟ عشان مش عايز أي حاجة برا ال class تقدر تتعامل أو تغير في الداتا بشكل مباشر
وبيتقال على الفكرة دي برضو ال black box عشان عاملة زي الصندوق الاسود اللي بدخله input وبيطلعلي output من غير ما اعرف التفاصيل اللي جوا واللي بيحصل
بنستخدم في الحوار دا setters & Getters
من خلالها بقدر أتعامل مع تغيير الdata اللي عندي او اني أشوف ال values
Why we need Encapsulation?
بيساعد المطور انه بيبقا في تحكم كامل للداتا اللي بيشتغل عليها
مثال: فاكر مثال الشطرنج؟
لو قولنا اننا عايزين نحرك قطعة من مربع لمربع تاني
أول حاجة محتاج أعرف المكان بتاع القطعة الحالي وبتبقا عبارة عن row, column
طبعًا بكل بساطة المفروض أغير المكان الحالي اللي انا فيه للمكان الجديد باني أغير الصف والعمود بكل بساطة
Class Feel: posRow posColumn# Mainfeel = new Feel()feel.posColumn = newColumnfeel.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
بيساعدني اني اعرف احافظ على القيم اللي في البرنامج اللي ممكن تكون معتمدة على بعض من غير ما ألغبط الدنيا (Keep tracking)
مثال: تخيل اني بعمل لعبة عادية
جواها class player
Class Player: currentHealth # variable maxHealth # variable
والاتنين لو انت عارف بيبقو معتمدين على بعض
لما مثلًا بيحصل level up المفروض ال maxHealth تزيد ولو ال currentHealth ناقصة تتملي فبدل ما أنا هعدل على كل واحد منهم لوحده ويحصل لغبطة
ممكن أعمل method جوا ال class تعمل كل العملية دي على بعض
setHealthOnLevelUp(): # function in class maxHealth += 500 currentHealth = maxHealth
بيساعدني اني اعمل validation للداتا قبل ما أغيرها
مثال: نفس المثال اللي فوق
تخيل اني عايز أعمل زي جواهر كدا لما اللاعب بياخدها بتزود ال health فأنا لو معملتش validation ممكن اللاعب ياخد ويبقا ال currentHealth اكبر من ال max
فلازم أعمل حاجة بتعمل check قبل ما دا يحصل
بيساعدني اني أعزل تفاصيل ال implementation عن الطريقة اللي المفروض يتصرف بيها، ودا بيساعدنا في تغيير التفاصيل أو حاجات جوا ال class من غير نضطر نغير في الكود كله او نأثر على البرنامج كله
بيساعدنا في عملية ال testing وبيسهلها علينا
لأن ببساطة انت عارف كل class المفروض يتصرف ازاي فأنت بتختبرها
باختصار بيساعدنا في الحفاظ على النظام وتجنب أخطاء كتير وبيديلك control عالي في البرنامج اللي بتكتبه وبيسهل علينا ال testing وتغيير ال data في ال classes لو حبينا بدون التأثير على البرنامج كله أو لو اضطرينا لتغيير الكود كله فبرضو بيسهل علينا عملية تصليح ال bugs اللي هتظهر وبيمنع ان الكتابة تصبح معقدة