John Squirrels
مستوى
San Francisco

مبادئ OOP

نشرت في المجموعة
أهلاً! في درس اليوم، سنتحدث عن مبادئ البرمجة الشيئية. هل تساءلت يومًا لماذا تم تصميم Java تمامًا كما هي؟ أعني أنك تعلن عن فئات وتنشئ كائنات بناءً على الفئات، والفئات لها طرق، وما إلى ذلك. ولكن لماذا يتم تنظيم اللغة بحيث تتكون البرامج من فئات وكائنات، وليس شيئًا آخر؟ لماذا تم اختراع مفهوم "الكائن" ووضعه في المقدمة؟ هل كل اللغات مصممة بهذه الطريقة؟ إذا لم يكن الأمر كذلك، ما هي المزايا التي تقدمها لجافا؟ كما ترون، هناك الكثير من الأسئلة :) دعونا نحاول الإجابة على كل منها في درس اليوم.

ما هي البرمجة الشيئية (OOP)؟

بالطبع، Java لا تتكون من كائنات وفئات للمتعة فقط. إنها ليست نزوة لمبدعي Java، ولا حتى اختراعهم. هناك العديد من اللغات الأخرى القائمة على الأشياء. أول لغة من هذا القبيل كانت تسمى "Simula". تم اختراعه في الستينيات في النرويج. والأكثر من ذلك، أن مفاهيم "الطبقة" و"الطريقة" ظهرت في سيمولا. وفقًا لمعايير تطوير البرمجيات، تبدو "Simula" وكأنها لغة قديمة، ولكن يمكن لأي شخص أن يرى "تشابهها العائلي" مع لغة Java. مبادئ البرمجة الشيئية - 1ربما يمكنك بسهولة قراءة الكود المكتوب بهذه اللغة وشرح ما يفعله بشكل عام :)

Begin
	Class Rectangle (Width, Height); Real Width, Height;
			           
	 Begin
	    Real Area, Perimeter;  
	 
	    Procedure Update;      
	    Begin
	      Area := Width * Height;
              OutText("Rectangle is updating, Area = "); OutFix(Area,2,8); OutImage;
	      Perimeter := 2*(Width + Height);
              OutText("Rectangle is updating, Perimeter = "); OutFix(Perimeter,2,8); OutImage;
	    End of Update;
	 
	    Update;               
	    OutText("Rectangle created: "); OutFix(Width,2,6);
	    OutFix(Height,2,6); OutImage;
	 End of Rectangle;

       Rectangle Class ColouredRectangle (Color); Text Color;
			           
	Begin   	  
	    OutText("ColouredRectangle created, color = "); OutText(Color);
	    OutImage;
        End of ColouredRectangle;

 
      	 Ref(Rectangle) Cr;            
	 Cr :- New ColouredRectangle(10, 20, "Green"); 
End;
تم أخذ نموذج التعليمات البرمجية هذا من "Simula - 50 year of OOP" بواسطة Weekly-geekly. كما ترون، Java لا تختلف كثيرًا عن جدها :) ويرجع ذلك إلى حقيقة أن ظهور Simula كان بمثابة ولادة مفهوم جديد: البرمجة الشيئية. تعرف ويكيبيديا OOP على النحو التالي: "البرمجة كائنية التوجه (OOP) هي نموذج برمجة يعتمد على مفهوم "الكائنات"، والتي يمكن أن تحتوي على بيانات، في شكل حقول (غالبًا ما تُعرف باسم السمات)، ورمز، في النموذج من الإجراءات (المعروفة غالبًا بالطرق)." في رأيي، هذا تعريف جيد حقًا. لم يمض وقت طويل حتى بدأت في تعلم Java، ولكن هذا التعريف ربما لا يحتوي على أي كلمات لا تعرفها :) اليوم OOP هي منهجية البرمجة الأكثر شيوعًا. بالإضافة إلى Java، تُستخدم مبادئ OOP في العديد من اللغات الشائعة التي ربما سمعت عنها. على سبيل المثال، C++ (المستخدم بشكل نشط في تطوير الألعاب)، Objective-C وSwift (المستخدم لكتابة برامج لأجهزة Apple)، Python (الأكثر شيوعًا في التعلم الآلي)، PHP (إحدى لغات تطوير الويب الأكثر شيوعًا)، JavaScript ( فمن الأسهل أن نقول ما لا يتم استخدامه من أجله) وغيرها الكثير. إذًا، ما هي مبادئ OOP على أي حال؟ سنخبرك بالتفصيل.

مبادئ OOP

هذه هي أساس الأساس. الميزات الأربعة الرئيسية التي تشكل معًا نموذج البرمجة الشيئية. فهمهم ضروري لتصبح مبرمجًا ناجحًا.

المبدأ 1. الميراث

الخبر السار: أنت تعرف بالفعل بعض مبادئ OOP! :) لقد واجهنا الميراث بالفعل عدة مرات في الدروس، وتمكنا من استخدامه. الوراثة هي آلية تتيح لك وصف فئة جديدة بناءً على فئة (أصلية) موجودة. ومن خلال القيام بذلك، تستعير الفئة الجديدة خصائص ووظائف الفئة الأصلية. ما هو الميراث وما هي المزايا التي يوفرها؟ قبل كل شيء، إعادة استخدام التعليمات البرمجية. يمكن استخدام الحقول والأساليب المعلنة في الفئات الأصلية في الفئات التابعة. إذا كانت جميع أنواع السيارات تحتوي على 10 حقول مشتركة و5 طرق متطابقة، فأنت تحتاج فقط إلى نقلها إلى فئة الأصل التلقائي . يمكنك استخدامها في الفئات التابعة دون أي مشاكل. المزايا القوية: كمية (رمز أقل)، ونتيجة لذلك، نوعية (تصبح الفصول الدراسية أبسط بكثير). علاوة على ذلك، فإن التوريث مرن للغاية - يمكنك إضافة وظيفة كتابة منفصلة يفتقدها المتحدرون (بعض الحقول أو السلوك الخاص بفئة معينة). بشكل عام، كما هو الحال في الحياة الواقعية، نحن جميعًا متشابهون إلى حد ما مع والدينا، ولكننا أيضًا مختلفون عنهم إلى حدٍ ما :)

المبدأ 2. التجريد

هذا مبدأ بسيط للغاية. التجريد يعني تحديد الخصائص الرئيسية والأكثر أهمية لشيء ما، مع التخلص في الوقت نفسه من أي شيء بسيط وغير مهم. لا حاجة إلى إعادة اختراع العجلة. لنتذكر مثالاً من درس قديم حول الفصول الدراسية. لنفترض أننا نقوم بإنشاء نظام حفظ الملفات لموظفي الشركة. لإنشاء كائنات "الموظف"، قمنا بكتابة فئة الموظف . ما هي الخصائص المهمة لوصفها في نظام حفظ الملفات الخاص بالشركة؟ الاسم وتاريخ الميلاد ورقم الضمان الاجتماعي ومعرف الموظف. لكن من غير المرجح أن نحتاج إلى طول الموظف أو لون عينيه أو لون شعره لهذا النوع من السجلات. الشركة ليست بحاجة لمثل هذه المعلومات عن الموظف. لذا، في فئة الموظف ، نعلن عن المتغيرات التالية: String name و int age و int socialSecurityNumber و int memberId . ونقوم بتجريد المعلومات غير الضرورية مثل لون العين. ومع ذلك، إذا كنا نقوم بإنشاء نظام ملفات لوكالة عرض الأزياء، فإن الوضع يتغير بشكل كبير. يعد طول العارضة ولون عينيها ولون شعرها من الخصائص المهمة، لكن رقم التأمين الاجتماعي (SSN) الخاص بها لا يهمنا على الإطلاق. لذلك، في فئة النموذج ، نقوم بإنشاء المتغيرات التالية: ارتفاع السلسلة ، سلسلة الشعر ، سلسلة العيون .

المبدأ 3. التغليف

لقد واجهنا هذا بالفعل. في Java، يعني التغليف تقييد القدرة على قراءة البيانات وتغييرها. كما ترون، يعتمد المصطلح على كلمة "كبسولة". سنستخدم "الكبسولة" لإخفاء بعض البيانات المهمة التي لا نريد أن يغيرها الآخرون. إليك مثال بسيط من الحياة الواقعية. لديك الاسم الأول واسم العائلة. كل أصدقائك يعرفونهم. لكن ليس لديهم القدرة على تغيير اسمك الأول أو الأخير. قد نقول إن عملية القيام بذلك "ملخصة" من قبل نظام المحكمة: لا يمكنك تغيير اسمك الأخير إلا من خلال كاتب المحكمة، وأنت وحدك من يستطيع القيام بذلك. "المستخدمون" الآخرون لديهم حق الوصول "للقراءة فقط" لاسمك الأول والأخير :) مثال توضيحي آخر هو الأموال النقدية المحتفظ بها في المنزل. إن تركها على مرأى من الجميع في منتصف غرفتك ليس فكرة جيدة. سيتمكن أي "مستخدم" (الشخص الذي يأتي إلى منزلك) من تغيير مبلغ أموالك، أي يمكنه أخذ أموالك. سيكون من الأفضل تغليفها في خزنة. وبعد ذلك سيكون الوصول متاحًا لك فقط وفقط باستخدام رمز خاص. من الأمثلة الواضحة على التغليف الذي عملت معه بالفعل هي معدّلات الوصول (خاصة وعامة وما إلى ذلك)، بالإضافة إلى أدوات الضبط والحروف. إذا لم تقم بتغليف حقل العمر الخاص بفئة Cat ، فيمكن لأي شخص كتابة:

Cat.age = -1000;
تتيح لنا آلية التغليف حماية حقل العمر باستخدام طريقة الضبط، حيث يمكننا التأكد من عدم إمكانية تعيين العمر على رقم سالب.

المبدأ 4. تعدد الأشكال

تعدد الأشكال هو القدرة على العمل مع عدة أنواع كما لو كانت من نفس النوع. علاوة على ذلك، فإن سلوك الأشياء سيكون مختلفًا اعتمادًا على نوعها. هل يبدو ذلك معقدا؟ دعونا نفهم ذلك الآن. خذ أبسط مثال: الحيوانات. قم بإنشاء فئة Animal باستخدام طريقة talk() واحدة وفئتين فرعيتين — Cat و Dog .

public class Animal {

   public void speak() {
      
       System.out.println("Hello!");
   }
}

public class Dog extends Animal {
  
   @Override
   public void speak() {
       System.out.println ("Woof-woof!");
   }
}

public class Cat extends Animal {

   @Override
   public void speak() {
       System.out.println("Meow!");
   }
}
سنحاول الآن الإعلان عن متغير مرجعي لـ Animal وتعيين كائن Dog له.

public class Main {

   public static void main(String[] args) {

       Animal dog = new Dog();
       dog.speak();
   }
}
ما هي الطريقة التي تعتقد أنه سيتم استدعاؤها؟ Animal.speak() أو Dog.speak() ؟ سيتم استدعاء الطريقة الموجودة في فئة Dog : Woof-woof! لقد أنشأنا مرجعًا حيوانيًا ، لكن الكائن يتصرف مثل Dog . إذا لزم الأمر، يمكن أن يتصرف مثل قطة أو حصان أو أي حيوان آخر. الشيء المهم هو تعيين فئة فرعية محددة للمتغير المرجعي العام للحيوان . وهذا منطقي، لأن كل الكلاب حيوانات. هذا ما كان يدور في أذهاننا عندما قلنا "سيختلف سلوك الأشياء حسب نوعها". إذا أنشأنا كائن Cat ...

public static void main(String[] args) {

   Animal cat = new Cat();
   cat.speak();
}
ستعرض طريقة التحدث () "Meow ! " ولكن ماذا نعني بـ "القدرة على العمل مع عدة أنواع كما لو كانت نفس النوع"؟ وهذا أيضًا واضح جدًا. لنتخيل أننا نقوم بإنشاء محل حلاقة للحيوانات. يجب أن يكون صالون الحلاقة الخاص بنا قادرًا على قص شعر أي حيوان، لذلك قمنا بإنشاء طريقة القطع () باستخدام معلمة الحيوان (الحيوان الذي يتم قص شعره).

public class AnimalBarbershop {

   public void trim(Animal animal) {

       System.out.println("The haircut is done!"); 
   }
}
والآن يمكننا تمرير كائنات Cat و Dog إلى طريقة القطع () !

public static void main(String[] args) {

   Cat cat = new Cat();
   Dog dog = new Dog();

   AnimalBarbershop barbershop = new AnimalBarbershop();

   barbershop.trim(cat);
   barbershop.trim(dog);
}
وإليك المثال الواضح: تعمل فئة AnimalBarbershop مع نوعي Cat و Dog كما لو كانا من نفس النوع. في الوقت نفسه، لدى القط والكلب سلوكيات مختلفة: كل منهما يتحدث بشكل مختلف .

لماذا نحتاج OOP؟

لماذا ظهرت OOP كمفهوم برمجة جديد؟ كان لدى المبرمجين أدوات فعالة، مثل اللغات الإجرائية. ما الذي دفعهم إلى اختراع شيء جديد بشكل أساسي؟ والأهم من ذلك كله هو مدى تعقيد المهام التي واجهوها. إذا كانت مهمة المبرمج قبل 60 عامًا شيئًا مثل "تقييم بعض التعبيرات الرياضية"، فقد تكون الآن شيئًا مثل "تنفيذ 7 نهايات مختلفة للعبة STALKER، اعتمادًا على مجموعات من قرارات اللاعب المتخذة عند النقاط A وB وC وDE". و F في اللعبة." وكما ترون، فمن الواضح أن المهام أصبحت أكثر تعقيدا على مدى العقود الماضية. ونتيجة لذلك، أصبحت أنواع البيانات أكثر تعقيدًا. وهذا سبب آخر لظهور OOP. يمكن تقييم التعبير الرياضي بسهولة باستخدام الأوليات العادية. ليست هناك حاجة للكائنات هنا. ولكن سيكون من الصعب حتى وصف مهمة نهايات اللعبة دون استخدام فئات مخصصة. ومع ذلك، فمن السهل جدًا وصفها باستخدام الفئات والكائنات. من الواضح أننا سنحتاج إلى عدة فئات: Game، وStalker، وEnding، وPlayerDecision، وGameEvent، وما إلى ذلك. بمعنى آخر، حتى بدون البدء في حل المشكلة، يمكننا بسهولة "رسم" حل في أذهاننا. أجبر التعقيد المتزايد للمهام المبرمجين على تقسيمها إلى أجزاء. ولكن لم يكن من السهل القيام بذلك في البرمجة الإجرائية. وفي كثير من الأحيان كان البرنامج يشبه شجرة بها الكثير من الفروع التي تمثل جميع مسارات التنفيذ الممكنة. اعتمادا على شروط معينة، تم تنفيذ فرع واحد من البرنامج أو آخر. بالنسبة للبرامج الصغيرة، كان هذا مناسبًا، لكن كان من الصعب جدًا تقسيم المشكلة الكبيرة إلى أجزاء. وكان هذا سببًا آخر لظهور OOP. أعطى هذا النموذج للمبرمجين القدرة على تقسيم البرنامج إلى مجموعة من "الوحدات" (الفئات)، كل منها يقوم بالجزء الخاص به من العمل. ومن خلال التفاعل مع بعضها البعض، تنجز جميع الكائنات عمل برنامجنا. بالإضافة إلى ذلك، يمكننا إعادة استخدام الكود الخاص بنا في مكان آخر من البرنامج، مما يوفر أيضًا الكثير من الوقت.
تعليقات
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION