OOP: Encapsulation - Arabic
Encapsulation
كبسولة الدواء الـ في الصيدلية, عبارة عن تركيبة داخلية من العناصر وغلاف خارجي, للوصول للدواء الداخلي من قبل المريض يتم التعامل معها باستخدام الفم, عندنا هنا نقط للوصول للكبسولة النهاية:
* الغرض من الكبسولة
* المختص مصمم التركيب الداخلي للكبسولة
* طريقة التعامل مع الكبسولة
* المريض
قبل اي عمل يتم على الكبسولة لازم يتم تحديد الغرض منها, بتعالج ايه, بيبدأ المختص أو مجموعة العلماء أنهم بخبرتهم في المجال الطبي والمعلومات عن المرض انهم يقومون بتصميم التركيب الداخلي للكبسولة من حيث الصيغ الكيميائية وكذلك الطريقة الأمثل للتعامل مع الكبسولة من قبل المريض للوصول للتركيب الداخلي الـ في الغالب بواسطة الفم.
الطريقة المتفق عليها للوصول للتركيب الداخلي للكبسولة من قبل الباحثين غير مضمونة بحيث ان ممكن يكون في مريض عبثي مش يتبع التعليمات او الكبسولة تقع بيد طفل.
خلينا, فرضا, نقول إن الكبسولة الطريقة الوحيدة للوصول للمركب الداخلي هو عن طريق الفم, وان الباحثين توصلوا لطريقة ان لو المستخدم حاول استخدام الكبسولة بعيدا عن الفم يتحول لونها للون الأحمر دون تلفها.
الـ Encapsulation بيتم لما, يتم الحفاظ على التركيب الداخل الداخلي للـ Object (الكبسولة) ولايمكن تغيير قيم التركيب الداخلي من قبل أي Object خارجي (المستخدم) أو الوصول للتركيب الداخلي الا عن طريق الوسيلة (الفم) الـ يوفرها الـ Object ده.
Encapsulation in OOP
في البرمجة الـ Encapsulation يعتمد على الـ Variables والـ Methods المتوفرة داخل الـ Class, بحيث لاستدعاء الـ Method يتم تغير الـ Variables دي.
بالكود التالي:
* هاعمل Class اسمه Cat
* User يظهر رسالة باسم الـ Cat
* عشان يعمل كده لازم يتسدعي الـ cat_name
class Cat:
def __init__(self, name_input):
self.name = name_input
def cat_name(self):
n = self.name
if n != '':
print(f'My cat name is {n}')
else:
print('Have no cat!!')
هاعمل Access للـ Cat name
# Get cat name
cute = Cat("Fluffy")
cute.cat_name()
يبقى كده عشان اوصل لرسالة باسم الـ Cat محتاج استخدم الـ cat_name Method.
بس هنا انا اقدر اغير قيمة الـ name واعمل تاثير على الـ Method الداخلية:
cute = Cat("Fluffy")
cute.name = 'Dog'
cute.cat_name()
وبكده شرط الـ Encapsulation متحققش, وهو عدم امكانية الوصول للـ Attribute (او الـ Date او الـ Assets) بدون استخدام Method داخلية الـ يوفرها الـ Object, وهنا مش بس عملت Access لا ده انا غيرت القيمة تمامآ, الـ Attribute في الحالة دي تسمي Public Attribute
عشان امنع الوصول الخارجي للـ name محتاج اخليه Private باني استخدم الـ (__) قبل الـ Attribute:
class Cat():
def __init__(self, name=''):
self.__name = name
# Rest of the code
باستخدام نفس الكود
cute = Cat("Fluffy")
cute.__name = 'Dog'
cute.cat_name()
الـ Output هيفضل الاسم الـ انت ادخلته وهو Fluffy, في الحالة دي تسمي Private Attribute, لاحظ حاجة مهمة ولولوجك للـ Attribute بشكل مباشر وتغير قيمتة لا يعني شئ في الـ Encapsulation زي كده
cute = Cat("Fluffy")
cute.__name = 'Dog'
print(cute.__name)
لان المهم عدم الامكانية بالتاثير على الـ Behaviour (الـ Method), في الاخر الـ Attribute مجرد Variable
كذلك الأمر بيتم على الـ Method ممكن اخليها Private ومقدرش اتعامل معاها الا من داخل الـ Class فقط, الكود التالي هاحاول اعمل نفس الـ Access للـ cat_name لكن بعد ما تبقي Private
class Cat():
def __init__(self, name=''):
self.__name = name
def __cat_name(self):
# rest of code
هنا محاولة الوصول المباشر, هتتعامل مع الـ Method زي الغير معروفة اصلآ
cute = Cat("Fluffy")
cute.__cat_name()
لكن ممكن الولوج للـ cat_name__ من داخل الـ Class نفسه, لاحظ الـ ()test:
class Cat():
def __init__(self, name=''):
self.__name = name
def __cat_name(self):
n = self.__name
if n != '':
print(f'My cat name is {n}')
else:
print('Have no cat!!')
def test(self):
self.__cat_name()
لاحظ كمان ان هنا أن الولوج للـ cat_name__ داخل الـ ()test لازم من الـ self, لانها اصبحت منتسبة للـ Class
دلوقتي عشان اعمل Access للـ cat_name__
cute = Cat("Fluffy")
cute.test()