1- مفهوم البرمجة الشيئية Oop في جافا:
البرمجة كائنية التوجه (Oop) هي نموذج برمجة يعتمد على مفهوم الكائنات، والتي يمكن أن تحتوي على بيانات في شكل حقول (سمات أو خصائص) ورمز في شكل إجراءات (طرق أو وظائف). في Java تتضمن مفاهيم Oop التغليف والميراث وتعدد الأشكال والتجريد.
كما يوحي الاسم، يشير مفهوم البرمجة كائنية التوجه أو Java Oop إلى اللغات التي تستخدم الكائنات في البرمجة، فهي تستخدم الكائنات كمصدر أساسي لتنفيذ ما سيحدث في التعليمات البرمجية. يتم رؤية الكائنات من قبل المشاهد أو المستخدم، وهو يؤدي المهام التي تقوم بتعيينها.
تهدف البرمجة الموجهة للكائنات إلى تنفيذ كيانات العالم الحقيقي مثل الميراث، والاختباء، وتعدد الأشكال، وما إلى ذلك في البرمجة. الهدف الرئيسي لـ Oop هو ربط البيانات والوظائف التي تعمل عليها بحيث لا يتمكن أي جزء آخر من الكود من الوصول إلى هذه البيانات باستثناء تلك الوظيفة.
2- ماهي أهمية Oop في جافا
تساعد Oop في تنظيم وهيكلة التعليمات البرمجية بطريقة أكثر قابلية للإدارة، مما يسهل صيانة تطبيقات Java وتوسيع نطاقها. كما أنه يعزز إمكانية إعادة استخدام التعليمات البرمجية، والنمطية، والمرونة، مما يؤدي إلى تطوير برمجيات فعالة وقوية.
3- مزايا استخدام Oop في جافا
تتضمن بعض مزايا استخدام Oop في Java إمكانية إعادة استخدام التعليمات البرمجية والنمطية والمرونة وقابلية التوسع وسهولة الصيانة. تمكن Oop المطورين من تصميم كيانات العالم الحقيقي ككائنات، مما يؤدي إلى تعليمات برمجية أكثر سهولة وتنظيماً. كما أنه يدعم ميزات مثل الميراث وتعدد الأشكال، مما يعزز قابلية التوسع وسهولة القراءة لتطبيقات Java.
4- ماهي المبادئ الأساسية ل Oop في جافا
المبادئ الأساسية لـ Oop في Java هي التغليف والميراث وتعدد الأشكال والتجريد. يضمن التغليف إخفاء الحالة الداخلية للكائن ولا يمكن الوصول إليها إلا من خلال الطرق العامة. يسمح الوراثة لفئة واحدة بوراثة الخصائص والسلوك من فئة أخرى. يتيح تعدد الأشكال إمكانية التعامل مع الكائنات كمثيلات لفئتها الأصلية. يركز التجريد على إخفاء تفاصيل التنفيذ وإظهار المعلومات الضرورية فقط للعالم الخارجي.
– دعونا نناقش المتطلبات الأساسية التي تتكون من:
1- إعلان الطريقة: وهي تتكون من ست مكونات:
- معدل الوصول: يُحدد نوع الوصول للطريقة، أي من حيث يمكن الوصول إليها في التطبيق الخاص بك، هناك أربع أنواع من محددات الوصول Java:
- عام: يمكن الوصول اليه في جميع الفئات في تطبيقك.
- محمي: يمكن الوصول اليه داخل الحزمة التي تم تعريفه فيها وفي فئتها (فئاتها) الفرعية (بما في ذلك الفئات الفرعية المعلنة خارج الحزمة).
- خاص: يمكن الوصول اليه فقط داخل الفئة التي تم تعريفه فيها.
- الافتراضي (المعلن/المحدد دون استخدام أي معدل): يمكن الوصول إليه داخل نفس الفئة والحزمة التي تم تعريف فئتها فيها.
- نوع الإرجاع: نوع بيانات القيمة التي يتم ارجاعها بواسطة الطريقة أو تكون فارغة إذا لم ترجع قيمة.
- اسم الطريقة: تنطبق قواعد اسماء الحقول على اسماء الطرق أيضاً ولكن الاصطلاح مختلف قليلاً.
- قائمة المعلمات: قائمة مفصولة بفواصل لمعلمات الادخال المحددة مسبوقة بنوع البيانات الخاصة بها داخل الاقواس المرفقة إذا لم تكن هناك معلمات فيجب عليك استخدام الأقواس الفارغة ().
- قائمة الاستثناءات: الاستثناءات التي تتوقع أن ترميها الطريقة. يمكنك تحديد هذه الاستثناءات.
- نص الطريقة: عبارة عن كتلة من التعليمات البرمجية، محاطة بين قوسين، والتي تحتاج إلى تنفيذها لتنفيذ العمليات المقصودة.
2- تمرير الرسائل: تتواصل الكائنات مع بعضها البعض عن طريق إرسال واستقبال المعلومات لبعضها البعض. رسالة كائن ما هي طلب لتنفيذ إجراء ما، وبالتالي ستستدعي وظيفة في الكائن المتلقي تولد النتائج المرجوة. يتضمن تمرير الرسالة تحديد اسم الكائن واسم الوظيفة والمعلومات التي سيتم إرسالها.
الآن بعد أن قمنا بتغطية المتطلبات الأساسية، سننتقل إلى الركائز الأربع لـ Oop. ولكن، دعونا نبدأ بالتعرف على الخصائص المختلفة للغة البرمجة الشيئية.
5- مفاهيم oops هي كما يلي:
- Class
- Object
- Method and method passing
- :Pillars of oops
- Abstraction
- Encapsulation
- Inheritance
- Polymorphism
Class: عبارة عن مخطط أو نموذج أولي محدد من قبل المستخدم يتم إنشاء الكائنات منه. وهو يمثل مجموعة الخصائص أو الأساليب المشتركة بين جميع الكائنات من نوع واحد. باستخدام الفئات، يمكنك إنشاء كائنات متعددة بنفس السلوك بدلاً من كتابة التعليمات البرمجية الخاصة بها عدة مرات. يتضمن ذلك فئات للكائنات التي تحدث أكثر من مرة في التعليمات البرمجية الخاصة بك. بشكل عام، يمكن أن تتضمن إعلانات الفئة هذه المكونات بالترتيب:
Modifiers: يمكن أن يكون الفصل عاماً أو يتمتع بحق الوصول الافتراضي.
Class name: يجب أن يبدأ اسم الفئة بالحرف الأول الكبير.
Superclass (if any): اسم أصل الفئة (الفئة الفائقة) إن وجدت مسبوقاً بالكلمة الأساسية الممتدة يمكن للفئة فقط توسيع أحد الوالدين (فئة فرعية).
Interface (if any): قائمة مفصولة بفواصل من الواجهات التي يتم تنفيذها بواسطة الفئة، إن وجدت مسبوقة بالكلمة الاساسية التي يتم تنفيذها يمكن للفئة تنفيذ أكثر من واجهة واحدة.
Body: جسم ال class محاطا بالأقواس {}.
An object: الوحدة الأساسية للبرمجة الشيئية التي تمثل كيانات الحياة الواقعية. يقوم برنامج Java النموذجي بإنشاء العديد من الكائنات، والتي كما تعلم، تتفاعل عن طريق استدعاء الأساليب. الكائنات هي التي تقوم بتنفيذ التعليمات البرمجية الخاصة بك، وهي جزء من التعليمات البرمجية المرئية للمشاهد/المستخدم. يتكون الكائن بشكل أساسي من:
State: يتم تمثيلها بخصائص الكائن كما أنه يعكس خصائص الكائن.
Behavior: يتم تمثيله بطرق الكائن كما أنه يعكس استجابة الكائن لأشياء أخرى.
Idetity: هو اسم فريد يطلق على كائن ما ويمكنه من التفاعل مع كائنات أخرى.
Method: الطريقة عبارة عن مجموعة من البيانات التي تؤدي بعض المهام المحددة وتعيد النتيجة إلى المتصل. يمكن للطريقة تنفيذ بعض المهام المحددة دون إرجاع أي شيء. تسمح لنا الطرق بإعادة استخدام الكود دون إعادة كتابته، ولهذا السبب تعتبر موفرة للوقت. في Java يجب أن تكون كل عملية جزء من فئة معينة والتي تختلف عن لغات مثل: c,c++,python.
6- الركائز الأربعة ل Oop:
الركيزة الاولى: التجريد Abstraction:
تجريد البيانات هي الخاصية التي بموجبها يتم عرض التفاصيل الأساسية فقط للمستخدم. لا يتم عرض الوحدات التافهة أو غير الأساسية للمستخدم. على سبيل المثال: يُنظر إلى السيارة على أنها سيارة وليس على أنها مكونات فردية.
يمكن أيضاً تعريف تجريد البيانات على أنه عملية تحديد الخصائص المطلوبة لكائن ما فقط، وتجاهل التفاصيل غير ذات الصلة. خصائص وسلوكيات الكائن تميزه عن الكائنات الأخرى من نفس النوع وتساعد أيضاً في تصنيف/تجميع الكائن.
فكر في مثال واقعي لرجل يقود سيارة. الرجل يعرف فقط أن الضغط على دواسة البنزين سيزيد من سرعة السيارة أو الضغط على الفرامل سيوقف السيارة، لكنه لا يعرف كيف أنه عند الضغط على دواسة البنزين تزيد السرعة بالفعل. ولا يعرف عن الآلية الداخلية للسيارة أو كيفية عمل المسرعات أو المكابح وغيرها في السيارة.
في Java يتم تحقيق التجريد عن طريق الواجهات والفئات المجردة يمكننا تحقيق التجريد بنسبة 100% باستخدام الواجهات.
تحتوي الطريقة المجردة على إعلان الطريقة فقط وليس التنفيذ.
الركيزة الثانية: التغليف Encapsulation:
يتم تعريفه على أنه التفاف البيانات تحت وحدة واحدة. إنها الآلية التي تربط الكود والبيانات التي يعالجها. هناك طريقة أخرى للتفكير في التغليف وهي أنه درع وقائي يمنع الوصول إلى البيانات بواسطة الكود الموجود خارج هذا الدرع.
من الناحية الفنية في ال encapsulation يتم اخفاء المتغيرات او البيانات الموجودة في فئة ما عن أي فئة اخرى ولا يمكن الوصول إليها إلا من خلال وظيفة عضو في الفئة التي يتم الاعلان عنها.
في ال encapsulation يتم اخفاء البيانات الموجودة في الفصل الدراسي عن الفئات الأخرى وهو ما يشبه ما يفعله اخفاء البيانات لذلك يتم استخدام المصطلحين التغليف واخفاء البيانات بالتبادل.
يمكن تحقيق التغليف من خلال اعلان جميع المتغيرات في الفصل على أنها خاصة وكتابة الأساليب العامة في الفصل لتعيين قيم المتغيرات والحصول عليها.
الركيزة الثالثة: الوراثة inheritance:
تُعد الوراثة أحد الركائز المهمة في Oop (البرمجة الشيئية). إنها الآلية في Java التي يُسمح من خلالها لفئة واحدة أن ترث الميزات (الحقول والأساليب) لفئة أخرى. نحن نحقق الميراث باستخدام الكلمة الأساسية الممتدة. يُعرف الميراث أيضاً بالعلاقة ” is-a “.
دعونا نناقش بعض المصطلحات الهامة المستخدمة بشكل متكرر:
Superclass: تعرف الفئة التي تم توريث ميزاتها باسم الطبقة الفائقة (تعرف أيضاً بالفئة الأصلية أو الفئة الأساسية).
Subclass: تعرف الفئة التي ترث الفئة الأخرى بالفئة الفرعية (تعرف أيضاً باسم الفئة المشتقة أو الموسعة أو التابعة) بالإضافة الى حقول وأساليب الفئة الفائقة.
Reusability: يدعم الوراثة مفهوم قابلية اعادة الاستخدام أي عندما نريد انشاء فئة جديدة وهناك بالفعل فئة تتضمن بعض التعليمات البرمجية التي نريدها. يمكننا اشتقاق فئتنا الجديدة من الفئة الموجودة. من خلال القيام بذلك فإننا نعيد استخدام الحقول والاساليب الخاصة بالفصل الموجود.
الركيزة الرابعة: تعدد الأشكال polymorphism:
ويشير إلى قدرة لغات البرمجة الموجهة للكائنات على التمييز بين الكيانات التي لها نفس الاسم بكفاءة. يتم ذلك بواسطة Java بمساعدة التوقيع والإعلان عن هذه الكيانات. القدرة على الظهور بأشكال متعددة تسمى تعدد الأشكال.
يتكون تعدد الأشكال في جافا من نوعين:
1- طريقة التحميل الزائد في جافا:
في Java يسمح التحميل الزائد للطرق لطرق مختلفة بأن يكون لها نفس الاسم، لكن التوقيعات مختلفة حيث يمكن أن يختلف التوقيع حسب عدد معلمات الإدخال أو نوع معلمات الإدخال، أو مزيج من الاثنين معاً.
يُعرف التحميل الزائد للطريقة في Java أيضاً باسم تعدد الأشكال في وقت الترجمة أو تعدد الأشكال الثابت أو الربط المبكر .في حالة التحميل الزائد للطريقة مقارنةً بالوسيطة الأصلية، ستحصل الوسيطة الفرعية على الأولوية القصوى.
مثال على طريقة التحميل الزائد في جافا:
public class Sum {
// Overloaded sum(). This sum takes two int parameters
public int sum(int x, int y) { return (x + y); }
// Overloaded sum(). This sum takes three int parameters
public int sum(int x, int y, int z)
{
return (x + y + z);
}
// Overloaded sum(). This sum takes two double
// parameters
public double sum(double x, double y)
{
return (x + y);
}
// Driver code
public static void main(String args[])
{
Sum s = new Sum();
System.out.println(s.sum(10, 20));
System.out.println(s.sum(10, 20, 30));
System.out.println(s.sum(10.5, 20.5));
}
}
طرق مختلفة للتحميل الزائد في جافا:
1- تغيير عدد المعلمات: يمكن تحقيق التحميل الزائد للطريقة عن طريق تغيير عدد المعلمات أثناء المرور إلى طرق مختلفة.
وفيما يلي تنفيذ هذه الطريقة:
import java.io.*;
// Class 1
// Helper class
class Product {
// Method 1
// Multiplying two integer values
public int multiply(int a, int b)
{
int prod = a * b;
return prod;
}
// Method 2
// Multiplying three integer values
public int multiply(int a, int b, int c)
{
int prod = a * b * c;
return prod;
}
}
// Class 2
// Main class
class GFG {
// Main driver method
public static void main(String[] args)
{
// Creating object of above class inside main()
// method
Product ob = new Product();
// Calling method to Multiply 2 numbers
int prod1 = ob.multiply(1, 2);
// Printing Product of 2 numbers
System.out.println(
“Product of the two integer value :” + prod1);
// Calling method to multiply 3 numbers
int prod2 = ob.multiply(1, 2, 3);
// Printing product of 3 numbers
System.out.println(
“Product of the three integer value :” + prod2);
}
}
2- تغيير أنواع البيانات: في كثير من الحالات، يمكن اعتبار الأساليب محملة بشكل زائد إذا كانت لها نفس الاسم ولكن لها أنواع مختلفة من المعلمات، وتعتبر الطرق محملة بشكل زائد.
وفيما يلي تنفيذ هذه الطريقة:
import java.io.*;
// Class 1
// Helper class
class Product {
// Multiplying three integer values
public int Prod(int a, int b, int c)
{
int prod1 = a * b * c;
return prod1;
}
// Multiplying three double values.
public double Prod(double a, double b, double c)
{
double prod2 = a * b * c;
return prod2;
}
}
class GFG {
public static void main(String[] args)
{
Product obj = new Product();
int prod1 = obj.Prod(1, 2, 3);
System.out.println(
“Product of the three integer value :” + prod1);
double prod2 = obj.Prod(1.0, 2.0, 3.0);
System.out.println(
“Product of the three double value :” + prod2);
}
}
3- تغيير ترتيب معلمات الطرق: يمكن أيضاً تنفيذ التحميل الزائد للطريقة عن طريق إعادة ترتيب معلمات طريقتين أو أكثر من الطرق المحملة بشكل زائد. على سبيل المثال، إذا كانت معلمات الطريقة الأولى هي اسم السلسلة (int roll_no) والطريقة الأخرى هي اسم السلسلة (int roll_no ) ولكن كلاهما لهما نفس الاسم، فسيتم اعتبار هاتين الطريقتين مثقلتين بتسلسلات مختلفة من المعلمات.
وفيما يلي تنفيذ هذه الطريقة:
import java.io.*;
// Class 1
// Helper class
class Student {
// Method 1
public void StudentId(String name, int roll_no)
{
System.out.println(“Name :” + name + ” “
+ “Roll-No :” + roll_no);
}
// Method 2
public void StudentId(int roll_no, String name)
{
// Again printing name and id of person
System.out.println(“Roll-No :” + roll_no + ” “
+ “Name :” + name);
}
}
// Class 2
// Main class
class GFG {
// Main function
public static void main(String[] args)
{
// Creating object of above class
Student obj = new Student();
// Passing name and id
// Note: Reversing order
obj.StudentId(“Spyd3r”, 1);
obj.StudentId(2, “Kamlesh”);
}
}
مزايا طرق التحميل الزائد:
- تعمل طريقة التحميل الزائد على تحسين امكانية قراءة البرنامج واعادة استخدامه.
- التحميل الزائد للطريقة يقلل من تعقيد البرنامج.
- باستخدام طريقة التحميل الزائد يمكن للمبرمجين أداء المهمة بكفاءة وفعالية.
- باستخدام التحميل الزائد للأسلوب من الممكن الوصول للأساليب التي تؤدي وظائف ذات صلة مع وسائط وانواع مختلفة قليلاً.
- يمكن أيضاً تهيئة كائنات الفصل بطرق مختلفة باستخدام المنشئات.
7- خاتمة
يعد مفهوم البرمجة الشيئية Oop في Java طريقة قوية لتنظيم التعليمات البرمجية وكتابتها. ويستخدم الأفكار الأساسية مثل الفئات والكائنات والميراث وتعدد الأشكال والتغليف والتجريد لإنشاء تعليمات برمجية مرنة وقابلة لإعادة الاستخدام. باستخدام مفهوم Java Oop يمكن للمبرمجين إنشاء تطبيقات معقدة بشكل أكثر كفاءة، مما يجعل إدارة التعليمات البرمجية وفهمها وتعديلها أسهل. بشكل عام، تساعد مفاهيم Oop الخاصة بـ Java في إنشاء حلول برمجية قوية وقابلة للتطوير.