OOP: Introduction - Arabic
What is OOP?
انا هنا (وفي باقي المقالات) مش بتكلم عن ازاي الكود بيشتغل لكن التركيز على المفاهيم العامة للـ OOP فهتلاقي ان الكود بسيط لكن ده عشان الـ Concept يكون واضح بالتطبيق.
OOP اختصار لـ Object Orienten Programming ,هي عبارة عن نموذج برمجي ( Programming Paradigm) الهدف منه عدم تكرار نفس الكود اكثر من مرة للتعامل مع نفس البيانات او كما يسمى باللغة الانكليزية DRY: Don't Repeat Yourself
مثال انا حابب الكلاب, قررت وانا ماشي بالشارع قابلت كلب مع صاحبه اسئلة على عمرة, لكن صاحبه مش مش فاكر غير تاريخ الميلاد, فأنا كمبرمج كتبت الكود التالي:
* هاخد التاريخ
* احسب الفرق بين الوقت الحالي وتاريخ الميلاد
* اعرف العمر
from datetime import datetime
def dog_1():
birthday = datetime(2017, 2, 1).date()
# Get dog age in years
current_time = datetime.now().date()
days = current_time - birthday
years = round(days.days / 360)
context = {'age': years}
return context
def dog_2():
....
def dog_3():
....
# Get dog 1 age
print(dog_1().get('age'))
# Get dog 2 age
print(dog_1().get('age'))
# Get dog 3 age
print(dog_1().get('age'))
النقط (...) تمثل تكرار نفس الكود الـ فـ dog_1
لاحظ
* استخدام نفس الكود تكرارا.
* طويل, وغير منظم.
* صعب التتبع (Tracking)و لو قررنا اننا نعمل 100 dog.
باستخدام الـ OOP:
* هاكتب نفس الكود مرة واحدة.
* استخدم نفس الكود اكثر من مرة لتخزين بيانات الـ dogs.
class Dog:
def __init__(self, birthday):
# yyyy, mm, d
self.birthday = birthday
def age(self):
birthday = datetime(*self.birthday).date()
# Get its age in years
current_time = datetime.now().date()
days = current_time - birthday
age = round(days.days / 360)
return age
dog_1 = Dog((2017, 2, 1))
print(dog_1.age())
dog_2 = Dog((2015, 12, 1))
print(dog_2.age())
dog_3 = Dog((1994, 2, 3))
print(dog_3.age())
لاحظ هنا اقل شئ وهو فرق عدد الـ Code Lines, وكذلك انت خلال قراة الـ Dog Class تقدر تعرف هو بيعمل ايه بسهولة من غير حتى توفر Comments, طبعا الـ Best Practise انك تكتب Comments لكن هنا للتوضيح فقط.
الـ OOP تعتمد على الـ Classes والـ Objects, حيث ان الـ Object واخد Instance من الـ Class
Classes
* هي مخطط للبيانات (Blueprint) ومخطط لكيفية التعامل معها, يعني لما كتبت Class Dog, الـ Class بيتكتب بواسطة المبرمج الـ بناءا على احتياجات الـ Task بيدا يحدد المدخلات (زي الـ Birthday داخل الـ __init__) والـ Methods المطلوبة الـ بتتعامل مع المدخلات دي(زي الـ age)
Objects
* هي النَسخ (instances) الـ بنعملها من الـ Class, زي الـ dog_1, dog_2, dog_3 مع الاحتفاظ بنفس خصائص الـ Class, بمعنى ان المبرمج صمم الـ Class حيث ان هو ياخد مدخل التاريخ (Birthday) ويت عملية حسابية ويرجع الـ age ... لو لسه مش فاهم, اكيد هتسمع او سمعت ان كل حاجة في الـ Python عبارة عن Object هنا يقصد بيها انك بتتعامل مع نسخة من Class (مخطط أو Blueprint) معين ... مثلآ انت لما تعمل Object اسمه name انت بتاخد Instance من Class اسمه Str
name = 'Mohamed'
print(type(name))
هنا الـ name ده اصبح String Object بعد ما عمل نسخة من الـ String Class الـ مصمم By Default داخل لغة الـ Python, وتقدر تعمل ولوج لكل الـ Methods الخاصة بالـ String Class زي:
* ()name.upper
* ()name.lower
كل الـ عاوزك تطلع بيه من المقال عن الـ OOP هو انه:
* بيعتمد على الـ DRY principle بحيث يتم استخدام نفس الكود أكثر من مرة بدون الحاجة للتكرار.
* الـ Class هو الـ Blueprint بتاع الـ Entity (زي الـ Dog او شئ اخر تقدر تجمع عنه بيانات في الحياة الواقعية Car, Bulding, Person).
* الـ Object عبارة عن نسخة (Instance) من الـ Class.
المقال التالي: Inheritance