فحص بنية البرامج الموجهة للكائنات
تستخدم البرمجة الموجهة للكائنات (OOP) كائنات لنمذجة كيانات العالم الحقيقي.
بالنسبة للمطورين الذين هم على دراية بالبرمجة المنظمة، يمكن أن تساعد المقارنة بين البرمجة المنظمة والبرمجة الموجهة للكائنات في توضيح الاختلافات بين النهجين. بالإضافة إلى ذلك، يمكن أن يساعدك فهمك المتزايد للتغليف ودورة حياة الفئة على تطوير حلول آمنة وقوية.
مقارنة البرمجة Object-Oriented مع البرمجة المنظمة
البرمجة المنظمة والبرمجة الموجهة نحو الكائنات (OOP) هما نهجان متميزان لتطوير البرمجيات، ولكل منهما مجموعته الخاصة من المبادئ والمنهجيات. تعتمد البرمجة المنظمة على نهج من أعلى لأسفل حيث يتم تقسيم البرنامج إلى وظائف أو إجراءات أصغر وقابلة للإدارة. يؤكد هذا الأسلوب على تدفق واضح ومنطقي للتحكم باستخدام التكرارات الحلقية و الشرطية و الفرعية. تنظم البرمجة الموجهة للكائنات تصميم البرامج حول العناصر التي تغلف كل من البيانات والسلوك، ما يعزز بنية تعليمات برمجية أكثر نمطية وقابلة لإعادة الاستخدام. بينما تركز البرمجة المنظمة على تسلسل الإجراءات التي سيتم تنفيذها، تؤكد البرمجة الموجهة للكائنات على العناصر المتضمنة في الإجراءات.
يمكننا استخدام أمثلة واقعية لمشاريع البناء كمجازات لتوضيح الاختلافات بين البرمجة المنظمة والبرمجة الموجهة نحو الكائنات.
مثال برمجة Object-Oriented
تخيل البرمجة الموجهة للكائنات على أنها تصميم وبناء مدينة. في هذا الاستعارة، يمثل كل مبنى فصلا دراسيا، وتمثل غرف كل مبنى ومرافقه خصائص وأساليب تلك الفئة. وكما تتكون المدينة من مبان مختلفة، كل منها يخدم غرضا محددا (سكنية وتجارية وصناعية)، يتكون برنامج OOP من فئات مختلفة، كل منها مصمم للتعامل مع مهام محددة. يتم إنشاء المباني (الفئات) استنادا إلى المخططات (تعريفات الفئة)، ويمكن أن يكون لكل مبنى مثيلات متعددة (كائنات) تشترك في نفس البنية ولكن يمكن أن يكون لها حالات مختلفة (بيانات).
في هذه المدينة، التغليف يشبه جدران المبنى الذي يحمي بنيته الداخلية ويسمح فقط بالوصول من خلال الأبواب والنوافذ المعينة (أساليب). يضمن التغليف أن العمل الداخلي لمبنى (فئة) مخفي عن العالم الخارجي، ويتم التحكم في التفاعلات مع المبنى وأمانه.
يسلط هذا الاستعارة لبناء المدينة الضوء على الطبيعة المعيارية والقابلة لإعادة الاستخدام ل OOP، حيث يمكن تطوير كل فئة (مبنى) واختبارها وصيانتها بشكل مستقل، ومع ذلك فهي تعمل معا لتشكيل مدينة متماسكة ووظائف (برنامج). وكما تسمح مدينة جيدة التخطيط بإدارة فعالة وقابلية التوسع، فإن برنامج OOP المصمم جيدا يعزز قابلية الصيانة والمرونة وقابلية التوسع.
مثال على البرمجة المنظمة
تخيل البرمجة المنظمة كصنع لحاف. في هذا الاستعارة، يمثل كل قطعة من النسيج وظيفة أو إجراء في برنامجك. تماما كما يتكون اللحاف من العديد من التصحيحات الفردية التي تم خياطتها معا، يتكون البرنامج المنظم من وظائف مختلفة مصممة لأداء مهام محددة. كل وظيفة تشبه التصحيح الذي يمكن تطويره واختباره وصيانته بشكل مستقل. عند خياطة هذه التصحيحات معا بترتيب معين، يمكنك إنشاء لحاف كامل، تماما كما تقوم بدمج الوظائف لتشكيل برنامج كامل.
في البرمجة المنظمة، يكون التركيز على التدفق المنطقي للتحكم، مثل كيفية تخطيط وتسلسل التصحيحات لإنشاء تصميم متماسك. تضمن الكوايلة أن كل تصحيح يتناسب تماما مع الآخرين، مع الحفاظ على نمط واضح ومنظم. وبالمثل، يضمن المبرمج المنظم أن كل دالة تتناسب بسلاسة مع البرنامج العام، مع الحفاظ على تدفق واضح ومنطقي للتحكم من خلال استخدام الحلقات و الشرطيات و subroutines.
يسلط هذا الاستعارة الكئيب الضوء على الطبيعة النمطية للبرمجة المنظمة، حيث يمكن إعادة استخدام كل وظيفة (أو تصحيح) وإعادة ترتيبها حسب الحاجة. تماما كما يمكن للمبرمج استبدال أو تعديل التصحيحات الفردية دون تعطيل اللحاف بأكمله، يمكن للمبرمج تحديث أو تحسين الوظائف الفردية دون التأثير على البرنامج بأكمله. تجعل هذه الوحدة النمطية البرمجة المنظمة نهجا فعالا لإنشاء تعليمات برمجية واضحة وقابلة للصيانة وقابلة لإعادة الاستخدام. ومع ذلك، مع نمو البرنامج في الحجم والتعقيد، يمكن أن تصبح إدارة التفاعلات بين الوظائف أكثر تحديا. تماما كما لحاف مع عدد كبير جدا من بقع يمكن أن تصبح غير عملية ويصعب إدارتها، برنامج منظم مع العديد من الوظائف والإجراءات يمكن أن تصبح مرهقة ويصعب الحفاظ عليها. مع زيادة عدد التصحيحات (الوظائف)، يصبح من الصعب تتبع كيفية احتوائها معا والتفاعل معها. يؤدي هذا إلى مشكلات مثل تكرار التعليمات البرمجية، وصعوبة تصحيح الأخطاء، وعدم التماسك. في التطبيقات الكبيرة، يمكن أن يؤدي النهج الخطي والأعلى لأسفل للبرمجة المنظمة إلى شبكة متشابكة من الوظائف المترابطة، ما يجعل من الصعب فهم قاعدة التعليمات البرمجية وتعديلها. يمكن أن يعوق هذا التعقيد قابلية التوسع وقابلية الصيانة، مما يؤثر في النهاية على الجودة والأداء العامين للبرنامج.
فحص استخدام الفئات في برمجة Object-Oriented
الفئات هي اللبنات الأساسية للبرمجة الموجهة للكائنات (OOP) وتستخدم لتحديد بنية وسلوك العناصر في البرنامج. يساعدك فهم الفوائد التي يوفرها التغليف ودورة حياة الفئات على فهم كيفية عمل البرمجة الموجهة للكائنات.
التغليف
التغليف هو أحد المبادئ الأساسية للبرمجة الموجهة للكائنات (OOP). يشير إلى تجميع البيانات (الحقول) والأساليب (السلوكيات) التي تعمل على البيانات في وحدة واحدة، عادة ما تكون فئة. يقيد التغليف الوصول المباشر إلى بعض مكونات العنصر، مما يمكن أن يمنع التعديل العرضي للبيانات.
يوفر التغليف المزايا التالية:
إخفاء البيانات: يسمح التغليف بإخفاء الحالة الداخلية للكائن من الخارج. وهذا يعني أنه يمكن تغيير التمثيل الداخلي لكائن دون التأثير على التعليمات البرمجية الخارجية التي تستخدم الكائن. على سبيل المثال، باستخدام الحقول الخاصة وتوفير أساليب المحصل والمحدد العامة، يمكنك التحكم في كيفية الوصول إلى البيانات وتعديلها.
إمكانية الصيانة المحسنة: يسهل التغليف صيانة التعليمات البرمجية وتعديلها. لا تؤثر التغييرات على التنفيذ الداخلي لفئة على التعليمات البرمجية التي تستخدم الفئة، طالما أن الواجهة العامة تظل كما هي. يسمح فصل المخاوف هذا للمطورين بالتركيز على أجزاء محددة من التعليمات البرمجية دون القلق بشأن الآثار الجانبية غير المقصودة.
زيادة المرونة: يسمح التغليف برمز أكثر مرونة ونمطية. من خلال تحديد واجهات واضحة، يمكنك بسهولة استبدال أجزاء من التعليمات البرمجية أو تحديثها دون التأثير على الأجزاء الأخرى. تسهل هذه الوحدة النمطية إعادة استخدام التعليمات البرمجية وإنشاء أنظمة معقدة من مكونات أبسط.
الأمان المحسن: يساعد التغليف على حماية تكامل بيانات العنصر عن طريق منع الوصول غير المصرح به والتعديل. من خلال التحكم في الوصول إلى البيانات من خلال الأساليب، يمكنك فرض القواعد والقيود على كيفية استخدام البيانات. يساعد هذا التنفيذ على منع الأخطاء والتأكد من بقاء الكائن في حالة صالحة.
التجريد: يدعم التغليف مفهوم التجريد من خلال الكشف فقط عن التفاصيل الضرورية لعنصر ما للعالم الخارجي. وهذا يبسط الواجهة ويسهل فهم الكائن واستخدامه. لا يحتاج مستخدمو الكائن إلى معرفة التنفيذ الداخلي، ما يقلل من تعقيد التعليمات البرمجية ويحسن قابلية القراءة.
ملاحظه
يتعلق التغليف بإخفاء أعضاء البيانات التي لا يحتاجها مستخدمو الفئة. يتم تغليف أعضاء البيانات أو إخفاؤها باستخدام الكلمة الأساسية private الملحق. يتم التحكم في الوصول إلى متغيرات الحقول المخفية باستخدام الخصائص والأساليب. لا يمكن الوصول إلى أعضاء البيانات المخفية مباشرة.
public class Person
{
// Private fields
private string firstName;
private string lastName;
private int age;
// Public properties with getters and setters
public string FirstName
{
get { return firstName; }
set { firstName = value; }
}
public string LastName
{
get { return lastName; }
set { lastName = value; }
}
public int Age
{
get { return age; }
set
{
if (value >= 0)
{
age = value;
}
else
{
throw new ArgumentException("Age can't be negative");
}
}
}
// Public method
public void Introduce()
{
Console.WriteLine($"Hi, I'm {FirstName} {LastName}, and I'm {Age} years old.");
}
}
في هذا المثال:
- يتم
firstNameالحقولlastNameageprivate، مما يعني أنه لا يمكن الوصول إليها مباشرة من خارج الفئة. - توفر الخصائص العامة
FirstNameLastNameAgeالوصول المتحكم به إلى الحقول الخاصة. - تتضمن خاصية
Ageمنطق التحقق من الصحة للتأكد من أنه لا يمكن تعيين العمر إلى قيمة سالبة. - يوفر أسلوب
Introduceطريقة للتفاعل مع بيانات الكائن دون الكشف عن تفاصيل التنفيذ الداخلية.
دورة حياة الفصل الدراسي
في تطبيق C#، تتضمن دورة حياة الفئة عدة مراحل من تعريفها إلى تدميرها النهائي. تتضمن دورة حياة الفئة الخطوات التالية:
- تعريف الفئة: تعريف الفئة مع أعضائها.
- التحويل البرمجي: تحويل الفئة برمجيا إلى التعليمات البرمجية ل IL.
- التحميل: تحميل التجميع في الذاكرة.
- إنشاء مثيل: إنشاء مثيل للفئة.
- التهيئة: تهيئة حقول الكائن وخصائصه.
- الاستخدام: استخدم الكائن في التطبيق.
- تجميع البيانات المهملة: استعادة ذاكرة الكائن عندما لا تكون هناك حاجة إليها.
- التدمير: تنفيذ منطق التنظيف وذاكرة الإصدار.
فيما يلي مثال يتضمن كشرح لكل خطوة في دورة حياة فئة:
تعريف الفئة
التعريف: يتم تعريف فئة في التعليمات البرمجية المصدر بخصائصها وأساليبها وأعضاء آخرين.
على سبيل المثال:
public class Person { // auto-implemented properties for name and age public string FirstName { get; set; } public string LastName { get; set; } public int Age { get; set; } // method to introduce the person public void Introduce() { Console.WriteLine($"Hi, I'm {FirstName} {LastName}, and I'm {Age} years old."); } }مجموعة
التحويل البرمجي: يتم تحويل التعليمات البرمجية المصدر برمجيا إلى لغة وسيطة (IL) بواسطة المحول البرمجي C#. يتم تخزين رمز IL في تجميع (DLL أو ملف EXE).
على سبيل المثال: يتم تحويل فئة
Personبرمجيا إلى التعليمات البرمجية IL وتضمينها في التجميع.تحميل
التحميل: عند تشغيل التطبيق، يقوم وقت تشغيل اللغة العامة (CLR) بتحميل التجميع في الذاكرة.
على سبيل المثال: يتم تحميل التجميع الذي يحتوي على فئة
Personفي الذاكرة بواسطة CLR.مثيل
إنشاء مثيل: يتم إنشاء مثيل للفئة باستخدام الكلمة الأساسية
new. يتم استدعاء الدالة الإنشائية للفئة لتهيئة الكائن.على سبيل المثال:
Person person1 = new Person { FirstName = "Tim", LastName = "Shao", Age = 25 };التهيئه
التهيئة: تهيئ الدالة الإنشائية حقول الكائن وخصائصه. يتم تنفيذ أي منطق تهيئة معرف في الدالة الإنشائية.
مثال: تتم تهيئة
Personالعنصرperson1بالقيم المحددةFirstNameLastNameAge.استخدام
الاستخدام: يتم استخدام الكائن في التطبيق. يتم الوصول إلى أساليب وخصائص الكائن وتعديلها حسب الحاجة.
على سبيل المثال:
person1.Introduce();مجموعة البيانات المهملة
تجميع البيانات المهملة: عندما لا تكون هناك حاجة إلى الكائن ولا توجد مراجع إليه، يقوم جامع البيانات المهملة (GC) باستعادة الذاكرة المستخدمة من قبل الكائن. يتم استدعاء destructor (الإنهاء) إذا تم تعريفه.
مثال: إذا لم يعد تتم الإشارة إلى
person1في أي مكان في التعليمات البرمجية، فستستعيد GC ذاكرتها في النهاية.تدمير
التدمير: يتم تحرير ذاكرة الكائن، ويتم تنفيذ أي منطق تنظيف محدد في destructor (المنهي إذا تم تحديد واحد).
مثال: يتم إتلاف
Personالكائنperson1، ويتم استعادة ذاكرته بواسطة GC.