الأصناف والكائنات والخصائص والدوال في OOP

الأصناف والكائنات والخصائص والدوال هي أساس البرمجة كائنية التوجه. تساعد هذه المفاهيم المطورين على تنظيم الكود حول مفاهيم حقيقية، وإبقاء البيانات والسلوك المرتبطين معاً، وبناء تطبيقات أسهل في الفهم وإعادة الاستخدام والاختبار والصيانة.

في هذا المقال، نشرح هذه المفاهيم الأساسية في OOP بطريقة واضحة وعملية. ستتعلم ما هو class، وما هو object، وكيف تخزن properties البيانات، وكيف تحدد methods السلوك، وكيف تعمل هذه الأجزاء معاً داخل أنظمة البرمجيات الحديثة.

مقدمة

البرمجة كائنية التوجه، وغالباً تسمى OOP، هي أسلوب برمجة يعتمد على فكرة تمثيل البرنامج كمجموعة من الكائنات. كل كائن يمثل شيئاً ذا معنى داخل التطبيق، مثل مستخدم أو منتج أو طلب أو فاتورة أو طالب أو موظف أو ملف أو خدمة.

بدلاً من كتابة كل المنطق كدوال ومتغيرات منفصلة، تجمع OOP المعلومات والإجراءات المرتبطة داخل وحدات منظمة. هذا يجعل الكود أكثر تنظيماً وأقرب إلى طريقة تفكيرنا بالأنظمة الواقعية.

أهم وحدات البناء في OOP هي classes وobjects وproperties وmethods. فهم هذه المفاهيم هو الخطوة الأولى قبل تعلم موضوعات أكثر تقدماً مثل inheritance وencapsulation وabstraction وpolymorphism وinterfaces وdesign patterns.

ما هو Class في OOP؟

الـ class هو مخطط أو قالب يُستخدم لإنشاء الكائنات. يحدد البيانات التي يمكن أن يملكها الكائن والإجراءات التي يمكنه تنفيذها. الـ class نفسه ليس الكائن الحقيقي، بل يصف البنية التي ستتبعها الكائنات لاحقاً.

على سبيل المثال، إذا كنا نبني نظاماً لمتجر إلكتروني، يمكن أن ننشئ class باسم Product. يصف هذا class البنية المشتركة لكل منتج في النظام. قد يملك كل منتج اسماً وسعراً ووصفاً وكمية مخزون، ودوال لحساب الخصومات أو فحص التوفر.

يساعد class المطورين على تجنب تكرار البنية نفسها مرات كثيرة. بدلاً من إنشاء متغيرات منفصلة لكل منتج يدوياً، نعرّف class واحداً ثم ننشئ منه كائنات كثيرة.

بكلمات بسيطة، يجيب class عن السؤال: كيف يجب أن يبدو هذا النوع من الأشياء، وماذا يستطيع أن يفعل؟

مثال واقعي على Class

تخيل نموذجاً يُستخدم لتسجيل الطلاب في نظام مدرسة. كل طالب يملك معلومات متشابهة مثل الاسم والعمر والبريد الإلكتروني والقسم ورقم الطالب. بدلاً من التعامل مع كل طالب كبيانات غير مرتبطة، يمكننا تعريف Student class.

يمكن أن يحتوي Student class على البنية المشتركة لكل الطلاب:

  • اسم الطالب.

  • بريد الطالب الإلكتروني.

  • رقم الطالب.

  • اسم القسم.

  • حالة التسجيل.

يمكن أن يحتوي class نفسه أيضاً على إجراءات مرتبطة بالطالب، مثل عرض معلومات الملف الشخصي، أو تحديث بيانات التواصل، أو التسجيل في دورة، أو فحص ما إذا كان الطالب نشطاً.

هذا يجعل الكود أسهل في القراءة لأن كل ما يتعلق بالطلاب موجود في مكان منطقي واحد.

ما هو Object في OOP؟

الـ object هو نسخة حقيقية يتم إنشاؤها من class. إذا كان class هو المخطط، فإن object هو العنصر الفعلي المبني من ذلك المخطط.

على سبيل المثال، قد يكون Product هو class، لكن الحاسوب المحمول والهاتف ولوحة المفاتيح والشاشة يمكن أن تكون كائنات مختلفة منشأة من Product class. كل كائن يتبع البنية العامة نفسها، لكنه يستطيع امتلاك قيم مختلفة.

قد يكون لدى product object اسم “Laptop” وسعر “1200”. وقد يكون لدى product object آخر اسم “Keyboard” وسعر “50”. كلاهما منشأ من class نفسه، لكن كل كائن يخزن بياناته الخاصة.

بكلمات بسيطة، يجيب object عن السؤال: ما العنصر الفعلي الذي تم إنشاؤه من هذا class؟

Class مقابل Object

الفرق بين class وobject من أهم الأفكار في البرمجة كائنية التوجه. الـ class هو تعريف، بينما object هو نسخة حقيقية مبنية على ذلك التعريف.

يمكنك التفكير بالعلاقة بهذا الشكل:

  • الـ class مثل مخطط منزل، بينما object هو منزل حقيقي مبني من ذلك المخطط.

  • الـ class مثل تصميم سيارة، بينما object هو سيارة محددة على الطريق.

  • الـ class مثل قالب مستخدم، بينما object هو حساب مستخدم محدد.

  • الـ class مثل بنية منتج، بينما object هو منتج حقيقي داخل المتجر.

هذا الفصل يسمح للمطورين بإنشاء كود قابل لإعادة الاستخدام. بعد تعريف class، يمكن إنشاء كائنات كثيرة منه دون إعادة كتابة المنطق نفسه.

ما هي Properties في OOP؟

Properties هي متغيرات تنتمي إلى class أو object. تخزن بيانات الكائن أو حالته. في بعض لغات البرمجة قد تسمى أيضاً attributes أو fields أو member variables.

على سبيل المثال، قد يملك User object خصائص مثل name وemail وpassword وrole وstatus. وقد يملك Product object خصائص مثل title وprice وstock وcategory وimage.

تصف properties ما يملكه الكائن. وهي تمثل المعلومات التي تجعل كل كائن مختلفاً عن كائن آخر منشأ من class نفسه.

على سبيل المثال، يمكن إنشاء مستخدمين من User class نفسه، لكن لكل منهما اسم وبريد مختلف. تُخزن هذه القيم داخل خصائص الكائن.

أمثلة على Properties

هذه أمثلة شائعة على الخصائص في أنظمة برمجية مختلفة:

  • قد يملك User class خصائص name وemail وpassword وrole.

  • قد يملك Product class خصائص title وprice وstock وcategory.

  • قد يملك Order class خصائص رقم الطلب والمبلغ الإجمالي وحالة الدفع وعنوان التسليم.

  • قد يملك BlogPost class خصائص title وslug وcontent وauthor وتاريخ النشر.

  • قد يملك Car class خصائص brand وmodel وyear وcolor وspeed.

هذه الخصائص تجعل الكائن ذا معنى. بدون properties، لن تملك الكائنات معلومات تمثل حالتها الحالية.

ما هي Methods في OOP؟

Methods هي دوال تنتمي إلى class أو object. تحدد ما يستطيع الكائن فعله. بينما تخزن properties البيانات، تنفذ methods إجراءات باستخدام تلك البيانات.

على سبيل المثال، قد يملك User class دوال لتسجيل الدخول، وتغيير كلمة المرور، وتحديث الملف الشخصي، أو فحص الصلاحيات. وقد يملك Product class دوال لحساب الخصم، وفحص المخزون، أو عرض تفاصيل المنتج.

تساعد methods على إبقاء السلوك قريباً من البيانات التي ينتمي إليها. وهذا أحد أسباب جعل OOP للكود أسهل في التنظيم. بدلاً من كتابة دوال غير مرتبطة في كل مكان داخل التطبيق، نضع السلوك داخل class الذي يملك المسؤولية.

بكلمات بسيطة، تصف methods ما يستطيع الكائن فعله.

أمثلة على Methods

هذه أمثلة شائعة على methods في التطبيقات الحقيقية:

  • يمكن لـ User object تحديث معلومات الملف الشخصي.

  • يمكن لـ Product object حساب السعر النهائي بعد الخصم.

  • يمكن لـ Order object حساب المبلغ الإجمالي.

  • يمكن لـ Cart object إضافة المنتجات أو إزالتها.

  • يمكن لـ BlogPost object النشر أو إلغاء النشر أو إنشاء URL slug.

methods مهمة لأنها تجعل الكائنات أجزاء نشطة في التطبيق. فالكائن ليس مجرد حاوية بيانات، بل يمكنه أيضاً توفير سلوك مرتبط بهذه البيانات.

كيف تعمل Properties وMethods معاً؟

تعمل properties وmethods معاً لإنشاء كائنات مفيدة. تمثل properties الحالة الحالية للكائن، بينما تستخدم methods هذه الحالة أو تغيرها.

على سبيل المثال، قد يملك كائن حساب بنكي خصائص مثل رقم الحساب والرصيد. وقد يملك دوال مثل deposit وwithdraw وget balance. تخزن خاصية balance المبلغ الحالي، بينما تتحكم الدوال بكيفية تغير ذلك المبلغ.

هذا أفضل من تغيير القيم مباشرة من أي مكان في البرنامج. يمكن أن تحتوي methods على قواعد وتحقق. مثلاً، يمكن لدالة withdraw منع الرصيد من أن يصبح سالباً. هذا يجعل البرنامج أكثر أماناً وتوقعاً.

في كود OOP المصمم جيداً، يجب أن تكون properties وmethods مرتبطة بوضوح. يجب أن يحتوي class على بيانات وسلوك ينتميان إلى المفهوم نفسه.

مثال بسيط: User Class

لفهم العلاقة بين classes وobjects وproperties وmethods، تخيل User class بسيطاً. يحدد هذا class البنية العامة للمستخدم داخل التطبيق.

قد يحتوي User class على خصائص مثل:

  • الاسم.

  • البريد الإلكتروني.

  • كلمة المرور.

  • الدور.

  • الحالة.

وقد يحتوي class نفسه على دوال مثل:

  • تسجيل الدخول.

  • تسجيل الخروج.

  • تغيير كلمة المرور.

  • تحديث الملف الشخصي.

  • فحص الصلاحية.

عندما ينشئ التطبيق مستخدماً محدداً، يصبح ذلك المستخدم object. كل user object يملك قيم properties خاصة به، لكن كل كائنات المستخدمين تتبع البنية نفسها التي يحددها class.

مثال بسيط: Product Class

مثال عملي آخر هو Product class في تطبيق تجارة إلكترونية. يمكن أن يحدد Product class كيف يتم تمثيل المنتجات داخل النظام.

قد تتضمن خصائص المنتج:

  • اسم المنتج.

  • سعر المنتج.

  • وصف المنتج.

  • كمية المخزون.

  • التصنيف.

وقد تتضمن دوال المنتج:

  • حساب الخصم.

  • فحص التوفر.

  • تحديث المخزون.

  • عرض تفاصيل المنتج.

  • حساب الضريبة أو السعر النهائي.

عند جمع هذا المنطق داخل Product class، يصبح التطبيق أسهل في الصيانة. إذا تغير منطق الخصم لاحقاً، يعرف المطورون أين يجب تعديله.

لماذا Classes مهمة في تطوير البرمجيات؟

classes مهمة لأنها تمنح مشاريع البرمجيات بنية واضحة. كلما كبرت التطبيقات، يصبح الكود صعب الإدارة إذا كُتب كله كمتغيرات ودوال غير مترابطة.

تساعد classes المطورين على تقسيم التطبيق إلى أجزاء منطقية أصغر. يمكن لكل class أن يمثل مسؤولية محددة، مثل إدارة المستخدمين أو المنتجات أو الطلبات أو المدفوعات أو الإشعارات أو التقارير.

هذا التنظيم يحسن قابلية القراءة ويقلل الالتباس. عندما يفتح المطور class، يستطيع بسرعة فهم أي جزء من النظام يمثله وما السلوك الموجود داخله.

لماذا Objects مهمة في تطوير البرمجيات؟

objects مهمة لأنها تسمح للتطبيق بالعمل مع بيانات حقيقية بناءً على تعريفات classes قابلة لإعادة الاستخدام. يعطي class البنية، لكن objects تحمل القيم الفعلية أثناء تشغيل البرنامج.

على سبيل المثال، قد يحتوي التطبيق على User class واحد، لكن آلاف user objects. كل object يمثل حساب مستخدم مختلفاً ببيانات فريدة. هذا يجعل OOP مفيدة للأنظمة التي تدير كيانات كثيرة متشابهة.

كما تسمح objects للمطورين بتمثيل سلوك التطبيق بطريقة طبيعية. بدلاً من التفكير بالإجراءات فقط، يستطيع المطورون التفكير بالكيانات ومسؤولياتها.

كيف تحسن Properties وMethods تنظيم الكود؟

تحسن properties وmethods تنظيم الكود لأنها تبقي المعلومات والإجراءات المرتبطة معاً. هذا يقلل التكرار ويجعل الكود أسهل في الفهم.

على سبيل المثال، إذا كان منطق سعر المنتج والخصم والمخزون موزعاً على ملفات كثيرة غير مرتبطة، يصبح التطبيق أصعب في الصيانة. لكن إذا نُظم هذا المنطق داخل Product class، يستطيع المطورون العثور عليه وتحديثه بسهولة أكبر.

يدعم هذا الأسلوب أيضاً اختباراً أفضل. يمكن اختبار class بخصائص ودوال واضحة بشكل مستقل، مما يساعد المطورين على اكتشاف الأخطاء مبكراً وتحسين جودة البرمجيات.

أخطاء شائعة عند المبتدئين

عند تعلم classes وobjects وproperties وmethods، يقع المبتدئون أحياناً في أخطاء شائعة. أحدها إنشاء classes كبيرة جداً تحتوي على مسؤوليات كثيرة. يجب أن يمثل class عادة مفهوماً واحداً واضحاً.

خطأ آخر هو جعل كل properties عامة والسماح لأي جزء من البرنامج بتغييرها مباشرة. هذا قد يجعل حالة الكائن غير آمنة وصعبة التحكم. لاحقاً في OOP، تساعد مفاهيم مثل encapsulation على حل هذه المشكلة.

قد ينشئ المبتدئون أيضاً methods لا تنتمي فعلاً إلى class. على سبيل المثال، لا يجب وضع منطق الدفع داخل User class إذا كان ينتمي إلى Order أو Payment class. يعتمد تصميم OOP الجيد على وضع المسؤوليات في المكان الصحيح.

أفضل ممارسات Classes وObjects وProperties وMethods

لكتابة كود OOP أفضل، يجب على المطورين اتباع ممارسات بسيطة. يجب أن يكون لكل class هدف واضح، وأن يصف اسمه ما يمثله. يجب أن تصف properties حالة الكائن، وأن تصف methods الإجراءات المرتبطة بذلك الكائن.

من الممارسات المفيدة:

  • استخدم أسماء classes واضحة وذات معنى.

  • اجعل كل class مركزاً على مسؤولية رئيسية واحدة.

  • استخدم properties لتخزين البيانات المرتبطة فقط.

  • استخدم methods لحماية وإدارة سلوك الكائن.

  • تجنب classes ضخمة تحتوي على منطق غير مرتبط.

  • أبقِ قواعد العمل قريبة من البيانات التي تتحكم بها.

  • استخدم تسمية متسقة للـ methods وproperties.

هذه الممارسات تجعل الكود أسهل في القراءة والتحديث وإعادة الاستخدام في مشاريع مستقبلية.

Classes وObjects في المشاريع الحقيقية

في المشاريع البرمجية الحقيقية، تُستخدم classes وobjects في كل مكان. في مشروع Laravel مثلاً، تمثل models مثل User وPost وProduct وOrder وInvoice سجلات قاعدة البيانات ككائنات. وقد تمثل services عمليات العمل، وتتعامل controllers مع طلبات المستخدم.

في تطبيق Symfony أو Java، تُستخدم classes أيضاً لتنظيم entities وservices وrepositories وforms وcommands وأجزاء كثيرة أخرى من النظام. هذا يوضح أن OOP ليست فكرة نظرية فقط، بل تُستخدم يومياً في تطوير البرمجيات الاحترافي.

فهم classes وobjects وproperties وmethods يساعد المطورين على قراءة كود الأطر، وكتابة ميزات أنظف، وفهم design patterns بسهولة أكبر.

العلاقة بين OOP وDesign Patterns

Design patterns هي حلول قابلة لإعادة الاستخدام لمشكلات شائعة في تصميم البرمجيات. تعتمد معظم design patterns بشكل كبير على مفاهيم OOP. قبل تعلم أنماط مثل Factory وSingleton وStrategy وObserver وRepository وDependency Injection، يجب على المطور فهم classes وobjects بوضوح.

على سبيل المثال، ينشئ Factory Pattern الكائنات بطريقة مضبوطة. ويسمح Strategy Pattern لأصناف مختلفة بتمثيل سلوكيات مختلفة. وغالباً يستخدم Repository Pattern أصنافاً لفصل منطق قاعدة البيانات عن منطق العمل.

لهذا السبب، تعلم classes وobjects وproperties وmethods خطوة مهمة قبل دراسة معمارية البرمجيات وأنماط التصميم المتقدمة.

الخلاصة

classes وobjects وproperties وmethods هي وحدات البناء الأساسية للبرمجة كائنية التوجه. يحدد class البنية، وobject هو نسخة حقيقية من تلك البنية، وتخزن properties بيانات الكائن، وتحدد methods سلوك الكائن.

تساعد هذه المفاهيم المطورين على تنظيم الكود بطريقة نظيفة وقابلة لإعادة الاستخدام والصيانة. كما تجعل تمثيل الأنظمة الواقعية داخل التطبيقات البرمجية أسهل.

بعد فهم هذه الأساسيات، ستكون جاهزاً لتعلم موضوعات OOP أكثر تقدماً مثل encapsulation وinheritance وpolymorphism وabstraction وinterfaces وdesign patterns. المعرفة القوية بهذه الأسس ضرورية لبناء أنظمة برمجية احترافية وكتابة كود أفضل في لغات البرمجة الحديثة.