How do we Develop Applications?

الـ OOP دي استراتيجية بتقدم مجموعة مبادئ عشان نطور بيها البرامج والتطبيقات. هي تعتبر methodology زيها زي منهجيات تانية زي الـ Structured Programming، أو الـ Procedural Programming، أو الـ Modular Programming. بس حاليًا، الـ Object Orientation هو أشهر وأهم أسلوب شغالين بيه.

تقريبًا كل لغات البرمجة الحديثة بتدعم الـ Object Orientation. الأسلوب ده بيركز أكتر على الـ internal design بتاع البرنامج، مش الـ external design. يعني من الآخر، هو ملوش دعوة بالمستخدم النهائي للبرنامج، ده يخص المبرمجين اللي بيكتبوا الكود.

بمساعدة الـ Object Orientation، الشغل بيبقى منظم ومترتب أكتر، وبنقدر نمشي على خطوات واضحة وإحنا بنبني البرنامج. زي ما بيحصل في أي هندسة تانية.

لو ضربنا مثال بالهندسة في مجالات تانية، زي المهندس المدني اللي بيبني عمارة، أول حاجة بيعملها هي التصميم أو الـ blueprint. وهو بيصمم، بيبقى قدامه اختيارات كتير، بس في الآخر بيستقر على تصميم واحد. بعد ما التصميم ده يخلص على الورق، بيبدأ يبني. نفس الكلام مع مهندس الإلكترونيات، لما بييجي يصنع أي جهاز، بيعمل تصميم للدايرة الكهربية على الورق الأول، ولما يعتمد التصميم، بيبدأ يصنع الجهاز.

عشان كده، الـ Object Orientation كلها قايمة على إزاي إحنا بنفهم وبنبص للـ internal system. لو فهمت النظام صح وكانت رؤيتك واضحة، هتقدر تبني نظام أحسن بكتير.

Object-Oriented vs Modular Programming

دلوقتي، هفهمك الـ Object Orientation عن طريق إني أقارنها بالـ Modular Programming. السبب في كده إن معظم الناس اللي بتتعلم C# بيبقوا جايين من خلفية لغة C، ولغة C دي شغالة بأسلوب الـ Modular Programming أو الـ Procedural Programming. فمن هنا أقدر أوضحلك الفرق وإزاي الـ Object Orientation بتختلف. خلينا نضرب شوية أمثلة.

هناخد مثال البنك. لو إنت بتعمل برنامج لبنك باستخدام الـ Modular Programming، هتبص للنظام إزاي؟ هتشوف طريقة الشغل إزاي وتصميمك هيكون عامل إيه؟ ده بيعتمد على وجهة نظرك. خلينا نشوف البنك من منظور الـ Modular Programming.

في البنك، إنت تقدر تفتح حساب، تعمل إيداع، تسحب فلوس، تستعلم عن الرصيد، أو تاخد قرض. دي الحاجات اللي ممكن تعملها هناك.

كل العمليات دي (فتح الحساب، الإيداع، السحب، الاستعلام، القرض) عبارة عن functions. وكل عملية من دول تقدر تنفذها لما تنادي على الـ function بتاعتها. فلو بتعمل برنامج للبنك، مش هيكون أكتر من شوية functions ملمومين مع بعض. البرنامج هيكون مبني على الـ functions دي، والمستخدم هيستدعيها عشان يعمل اللي هو عايزه. يعني في الـ Modular Programming، إنت بتبني البرنامج على إنه مجموعة من الـ functions.

دلوقتي بقى، تعال نبص على الـ Object Orientation بأمثلة مختلفة شوية. الحكومة بتقدم خدمات كتير زي الكهربا، المية، التعليم، المواصلات، وممكن كمان يكون عندها بنوك. دي كلها إدارات تبع الحكومة. إنت كمستخدم، هتعمل إيه في إدارة الكهربا؟ ممكن تقدم على عداد جديد، أو تلغي اشتراكك، أو تدفع الفاتورة. إيه دول؟ دول functions تبع إدارة الكهربا.

وبنفس الطريقة، البنك موجود. ونفس الـ functions زي فتح الحساب والإيداع والسحب والاستعلام موجودة برضه، ودي functions تبع البنك.

إحنا بقى بنسمي الحاجات دي إيه؟ بنسميها objects. فالنظام بتاع الحكومة كله أو البرنامج بتاعها عبارة عن مجموعة من الـ objects. وكل object له الـ functions الخاصة بيه. يعني البرنامج الكامل هو شوية objects جواها data و functions مرتبطة بيها.

في الـ Modular Programming، النظام كان شوية functions. لو قارنا دلوقتي، هنلاقي إن في الـ Modular Programming إحنا بنبص على تفاصيل قريبة أوي، لكن في الـ Object-Oriented Programming إحنا بنبص من فوق وبناخد الصورة الكبيرة.

Why Object Orientation?

خلينا نتكلم عن شركة بتصنع عربيات أو مركبات. لو بصيت على الشركة دي، هتلاقيها متقسمة إدارات، زي إدارة الـ inventory اللي بتابع المواد الخام، وإدارة الـ manufacturing اللي بتصنع، وإدارة الـ sales، وإدارة الـ marketing، وقسم للـ payroll، وقسم للـ accounts، وإدارات تانية كتير.

لو افترضنا إنك بتعمل برنامج لقسم الـ payroll أو الـ inventory بس، ساعتها ممكن تمشيها بأسلوب الـ modular approach، وتعمل شوية functions زي placing an order أو checking the item in stock. دي مهام ممكن تتلم في functions، ويبقى برنامج الـ inventory عبارة عن شوية functions. بس لما تيجي تعمل برنامج للشركة كلها، لازم تبص للموضوع على إنه objects.

فالـ inventory item ده يعتبر object، والـ employee يعتبر object، والـ account يعتبر object، والمنتج اللي بيتصنع object، والماكينات اللي شغالة في الإنتاج object. كل دي objects. هنا إنت محتاج تشوف الدنيا في شكل objects وتحدد الـ data بتاعتها والـ functions اللي بتعملها. إحنا هنا بنبص للنظام من مستوى أعلى، وعشان كده بنحتاج نستخدم الـ Object Orientation.

What are the Problems of Modular Programming?

الـ Modular Programming فيها شوية مشاكل بتضايقنا وإحنا شغالين، وهي:

  • الـ Reusability
  • الـ Extensibility
  • الـ Simplicity
  • الـ Maintainability
graph TD
    A[Modular Programming Problems] --> B(Reusability)
    A --> C(Extensibility)
    A --> D(Simplicity)
    A --> E(Maintainability)

Reusability

في الـ Modular Programming، بنضطر نكتب نفس الكود أو الـ logic في أماكن كتير، وده بيعمل تكرار للكود. ولو عوزنا نغير الـ logic ده بعدين، هنلف على كل الأماكن دي ونغيرها واحد واحد.

Extensibility

مفيش طريقة توسع بيها خصائص function معينة في الـ Modular Programming. لو عندك function وعايز تزود عليها حاجة، مش هينفع. هتضطر تكتب function تانية جديدة خالص وتعدل فيها براحتك.

Simplicity

بما إن مفيش Reusability ولا Extensibility، فبينتهي بينا الحال إننا كاتبين functions كتير جداً والكود متبعتر في كل حتة، فالدنيا بتتعقد وبتفقد بساطتها.

Maintainability

وطالما مفيش Reusability ولا Extensibility ولا Simplicity، بيبقى صعب جداً تدير الكود ده وتعمله صيانة بعد كده.

How Can We Overcome Modular Programming Problems?

نقدر نحل كل مشاكل الـ Modular Programming دي (زي الـ Reusability, الـ Extensibility, الـ Simplicity, والـ Maintainability) باستخدام الـ Object-Oriented Programming. الـ OOPs بتقدم مبادئ معينة، ولما بنستخدم المبادئ دي بنقدر نتجاوز كل عيوب الـ Modular Programming ونطلع بشغل محترم.

What Is Object-Oriented Programming?

خلينا نفهم الـ OOPs في الـ C#. الـ Object-Oriented Programming في C# دي design approach بيخلينا نفكر في الكود على إنه real-world objects بدل ما نفكر فيه كـ functions أو methods. على عكس اللغات الـ procedural، في الـ OOPs البرامج بتتنظم حوالين الـ objects والـ data بدل ما تتنظم حوالين الأفعال والـ logic.

graph LR
    OOP[OOP Principles] --> R[Classes & Objects] --> Re(Solves Reusability)
    OOP --> E[Inheritance & Composition] --> Ex(Solves Extensibility)
    OOP --> S[Abstraction & Encapsulation] --> Si(Solves Simplicity)
    Re & Ex & Si --> M(High Maintainability)

Reusability

عشان نحل مشكلة إعادة الاستخدام، الـ OOPs بتقدم حاجة اسمها Classes و Objects. فبدل ما تقعد تعمل copy و paste لنفس الكود في كذا مكان، إنت بتعمل Class وتاخد منه نسخة (اللي هي الـ Object) وتستخدمها وقت ما تحب.

Extensibility

لو عندك function وعايز تزود عليها، ده كان مستحيل في الـ procedural programming وكنت بتضطر تعمل function جديدة. في الـ OOPs المشكلة دي بتتحل بمفاهيم زي الـ Inheritance والـ Aggregation والـ Composition. (هنشرحهم بالتفصيل بعدين).

Simplicity

في الـ Modular Programming الكود بيبقى متبعتر ومفيش security لأن أي حد ممكن يوصل للـ functions من أي حتة. في الـ OOPs المشكلة دي بتتحل عن طريق مفاهيم زي الـ Abstraction والـ Encapsulation والـ Polymorphism.

Maintainability

بما إن الـ OOPs حلت مشاكل الـ Reusability والـ Extensibility والـ Simplicity، ففي الآخر بيطلع لنا كود نضيف ومترتب وسهل نعمله صيانة، وده بيعلي من الـ maintainability بتاعة البرنامج.

What are the OOPs Principles or OOPs Concepts in C#?

الـ OOPs قايمة على 4 مبادئ أساسية:

  • الـ Encapsulation
  • الـ Inheritance
  • الـ Polymorphism
  • الـ Abstraction

ملحوظة مهمة

إوعى تعتبر الـ Class والـ Object من مبادئ الـ OOPs. دول مجرد أدوات بنستخدمهم عشان نطبق بيهم المبادئ دي مش أكتر.

خلينا ناخد فكرة سريعة عن تعريفات المبادئ دي هنا، وفي المقالات الجاية هنشرحهم بالتفصيل بأمثلة من الواقع.

What are Abstraction and Encapsulation?

الـ Abstraction: هو إنك تعرض الخصائص الأساسية وتخفي التفاصيل اللي بتحصل في الخلفية. بالبلدي كده، هو إنك تعمل Class بيقدم الحاجات الضرورية بس للعالم الخارجي، وبيشيل أو بيخفي أي دوشة ملهاش لازمة.

الـ Encapsulation: هو إنك تلم الـ data والـ functions وتربطهم مع بعض في وحدة واحدة (اللي هي الـ Class). يعني بتعمل Class بيخفي الـ internal data members عن أي حد بره، ومبيسمحش بالوصول للـ data دي إلا عن طريق publicly exposed methods أو properties. وعشان كده بنسمي العملية دي data hiding، لأننا بنخفي بيها البيانات عن العالم الخارجي.

الـ Abstraction والـ Encapsulation الاتنين مرتبطين ببعض جداً. نقدر نقول إن الـ Abstraction هو الفكرة المنطقية اللي في دماغك، والـ Encapsulation هو التنفيذ الفعلي للفكرة دي في الكود.

Understanding Abstraction and Encapsulation with an Example

خلينا نفهم المبدأين دول بمثال. لو عايز تعمل Class عشان يمسك الـ register functionality (تسجيل مستخدم جديد). أول حاجة هتحتاجها إنك تاخد الـ data وتعملها validate، بعدين تجيب الـ connection string بتاع الداتا بيز، وفي الآخر تعمل SaveUser في الداتا بيز. فعشان تعمل الليلة دي، عندك 3 methods:

  • Validate
  • GetConnectionString
  • SaveUser

لو إنت خليت الناس اللي بتستخدم الـ Class ده يوصلوا للـ 3 methods دول، ممكن يتلخبطوا وينادوا عليهم بترتيب غلط، أو ينسوا ينادوا على واحدة فيهم أصلاً.

هنا بقى إنت محتاج تعمل method واحدة تسميها Register، وجواها إنت تنادي على الـ 3 methods دول (Validate, GetConnectionString, SaveUser) بالترتيب الصح. وتدي للمستخدم صلاحية إنه ينادي على الـ Register بس. التفكير وتحديد المطلوب ده هو الـ Abstraction. طب هتعمله إزاي في الكود؟ هو ده الـ Encapsulation.

هتخلي الـ methods اللي اسمها Validate و GetConnectionString و SaveUser من نوع private عشان محدش من بره يشوفهم. وتخلي الـ method اللي اسمها Register من نوع public عشان المستخدم يقدر ينادي عليها بسهولة وأمان.

بالمناسبة دي، إحنا بنوصل لـ Code Simplicity وبنبسط الكود عن طريق الـ Encapsulation والـ Abstraction.

What is Inheritance?

الـ Inheritance: هو العملية اللي من خلالها class بيورث خصائص وأعضاء class تاني. الـ Class الأساسي اللي بناخد منه بنسميه Parent أو Base أو Superclass. والـ Class الجديد اللي بيورث الحاجات دي بنسميه Derived أو Child أو Subclass. ومن خلال المبدأ ده بنقدر نحقق الـ code extensibility في شغلنا.

What is Polymorphism?

الـ Polymorphism: الكلمة دي أصلها يوناني، Poly يعني كتير، و morph يعني أشكال أو سلوكيات. يعني الكلمة على بعضها معناها القدرة على اتخاذ أكتر من شكل. في الكود، معناها إن نفس الـ function أو الـ operator بيبقى ليه سلوك مختلف على حسب نوع أو عدد الـ values اللي بياخدها.

وليه نوعين أساسيين:

  • الـ Static polymorphism / compile-time polymorphism / Early binding: وده بنعمله بالـ function overloading والـ operator overloading.
  • الـ Dynamic polymorphism / Run time polymorphism / Late binding: وده بنعمله بالـ function overriding.

Why do we need Object-Oriented Programming (OOPs) in C#?

لو عايز تنقل الـ real-world objects للغة برمجة عشان تعمل automating للـ business بتاعك، وفي نفس الوقت تكسب مميزات زي الـ Reusability والـ Extensibility والـ Simplicity والـ Maintainability، يبقى إنت محتاج الـ OOPs وش. الـ OOPs بتديلك المبادئ اللي بتخليك تبني الكائنات الحقيقية دي جوه الكود وتاخد كل الفوايد دي.

أي حاجة حية أو غير حية بنعتبرها objects. فالـ real-world objects زي الأشخاص، الحيوانات، العجل، الكمبيوترات، كل ده نقدر نبرمجه في اللغات دي باستخدام مفهوم الـ OOPs.

Why do we need real-world objects in a Project?

إحنا بنحتاج الـ real-world objects في المشاريع بتاعتنا لأنها جزء أساسي من الـ business. وبما إننا بنعمل برامج عشان تعمل automating للـ business ده، فلازم نكريت الـ objects دي في المشروع بتاعنا عشان تعكس الواقع.

يعني مثلاً، عشان نعمل سيستم لبنك، لازم نكريت objects للـ Customers، الـ Managers، الـ Clerks، الـ Office Assistants، الـ Marketing Executives، الكمبيوترات، الطابعات، الكراسي، المكاتب، وكل حاجة بنستخدمها. غير الـ Bank object طبعاً، لازم نكريت كل الحاجات دي عشان من غيرهم مش هنعرف ندير البنك برمجياً. في الكود، بنسمي الـ objects دي business objects.

What types of programming languages come under the OOP system?

أي لغة برمجة بتطبق الـ 4 مبادئ بتوع الـ OOPs اللي اتكلمنا عنهم، بتعتبر Object-Oriented Programming language، زي Java و C# و C++ وغيرهم.

Advantages of OOP in C#

دي الخلاصة لأهم مميزات استخدام الـ OOP في الـ C#:

  • الـ Modularity: الـ OOP بتخليك تكتب كود متقسم عن طريق إنك بتعمل Encapsulation للـ data والـ behavior جوه Classes. ده بيسهل إدارة المشاريع الكبيرة لأنك شغال على كل class لوحده وكأنه قطعة بازل.
  • الـ Code Reusability: الـ Inheritance بيخليك تعمل classes جديدة وتستفيد من الأكواد اللي مكتوبة في الـ base classes الموجودة. ده بيقلل التكرار وبيمشي بمبدأ “اكتبه مرة واستخدمه كتير”.
  • الـ Abstraction: بيخليك تعمل abstract classes و interfaces بتحدد الـ contract من غير ما تدخل المبرمج في تفاصيل التنفيذ، وده بيبسط الأنظمة المعقدة وبيخفي الدوشة.
  • الـ Polymorphism: بيخليك تكتب كود يشتغل مع objects من classes مختلفة من خلال interface واحد أو base class مشترك، وده بيدي مرونة كبيرة للكود ويسهل توسيعه.
  • الـ Encapsulation: بيحمي الـ internal state بتاعة الـ objects، وده بيعلي الأمان لسلامة الداتا. بتقدر تتحكم مين يشوف إيه باستخدام access modifiers زي public و private و protected و internal.
  • الـ Maintenance and Debugging: التنظيم بتاع الـ OOP بيسهل جداً إنك تلاقي البجات وتعمل صيانة. التعديل في class معين بيبقى تأثيره محدود ومش بيبوظ باقي الكود.
  • الـ Scalability: مبادئ الـ OOP بتساعدك تبني سيستم يكبر معاك. وتقدر تضيف features جديدة بإنك تعمل classes جديدة وتوسع الموجودة من غير ما تكسر الكود القديم.
  • الـ Readability: الـ OOP بتخلي الكود يتقري ويتفهم بسرعة، لأن الـ Classes والـ Objects بتمثل حاجات حقيقية، فالمبرمجين بيفهموا الكود بيعمل إيه بسهولة.

Points to Remember

  • مبادئ الـ OOP في C# دي design principles بتنصحنا إزاي نكتب البرنامج عشان نقدر نستخدمه تاني ونكبره بسهولة (عشان نحقق الـ Reusability والـ Scalability).
  • الـ Scalability معناها إن المشروع يكون جاهز يستقبل أي تغييرات في المستقبل من غير ما نهد الكود ونبنيه من تاني. التغييرات البسيطة المفروض تيجي من ملفات خارجية زي properties أو XML وخلافه. وده بنعمله لما نكتب classes ونربطها ببعض بـ loosely coupled design.
  • لازم وإنت بتكتب المشروع تعمل حسابك على الـ Scalability عشان الـ business دايماً بيكبر. ولما يكبر، هنعوز نضيف المتطلبات الجديدة بأقل تعديلات في الكود.
  • كمبرمجين، لازم نبقى عارفين إن في بداية أي business، العميل مش بيدفع استثمارات كبيرة. بس لما الشغل يكبر، العميل بيزود استثماراته عشان يضيف متطلبات ومميزات جديدة. فعشان نضيف الحاجات دي، مش المفروض نهد السيستم ونبنيه من الصفر.
  • وعشان كده، لازم نصمم المشروع صح ونمشي على مبادئ الـ OOP بصرامة، حتى لو مش محتاجينها في المرحلة الأولية، عشان نبقى جاهزين ومأمنين نفسنا لأي تعديلات قدام.

Note

  • عشان تفرق دايماً بين الـ Abstraction والـ Encapsulation ببساطة: الـ Abstraction هو إنك “بتخفي التعقيد” (Hiding Complexity) وبتركز على الـ Object بيعمل إيه، إنما الـ Encapsulation هو إنك “بتخفي البيانات والتنفيذ” (Hiding Data & State) وبتركز على الـ Object بيعملها إزاي من غير ما حد يبوظ الـ state بتاعته من بره.