JavaRush /مدونة جافا /Random-AR /مفاهيم البرمجة الشيئية جافا
shabnahm
مستوى

مفاهيم البرمجة الشيئية جافا

نشرت في المجموعة
تعتمد JAVA على مفاهيم البرمجة الشيئية، والتي تسمح لك بالانتقال إلى مستوى أعلى من التجريد لحل أي مشكلة بطريقة واقعية. يتصور النهج الموجه للكائنات حل المشكلة من حيث كائنات العالم الحقيقي التي يسهل إعادة استخدامها في التطبيق. على سبيل المثال، Chair(كرسي)، Fan(مروحة)، Dog(كلب)، Computer(كمبيوتر) وهكذا. في JAVA، الفئة عبارة عن تخطيط أو قالب أو نموذج أولي يحدد السلوك العام لكائن من نوع معين. المثيل هو تطبيق منفصل لفئة، وجميع مثيلات الفئة لها نفس الخصائص الموضحة في تعريف الفئة. على سبيل المثال، يمكنك تحديد فئة تسمى "منزل" بعدد الغرف كسمة وإنشاء مثيلات للفئة مثل منزل مكون من غرفتين، ومنزل مكون من ثلاث غرف، وما إلى ذلك. مفاهيم البرمجة الشيئية JAVA - 1المزايا: فيما يلي بعض مزايا تطوير البرامج الموجهة للكائنات.
  • انخفاض تكاليف دعم البرامج، ويرجع ذلك أساسًا إلى حقيقة أنها يتم تنفيذها بشكل نمطي.
  • تحسين إعادة استخدام التعليمات البرمجية من خلال ميزات مثل الميراث، مما يؤدي إلى تطوير أسرع للبرامج.
  • زيادة موثوقية التعليمات البرمجية والمرونة.
  • سهولة الفهم بسبب محاكاة العالم الحقيقي.
  • تجريد أفضل على مستوى الكائن.
  • تقليل تعقيد الانتقال من مرحلة تطوير إلى أخرى.
هناك أربع خصائص رئيسية لـ OOP:
  • التغليف
  • ميراث
  • تعدد الأشكال
  • التجريد

التغليف

يعمل التغليف بمثابة عقد لكائن ما الذي يجب أن يخفيه وما يجب أن يفتحه للوصول إلى الكائنات الأخرى. في JAVA، نستخدم معدل الوصول privateلإخفاء الطريقة وتقييد الوصول إلى متغير من العالم الخارجي. تحتوي JAVA أيضًا على معدّلات وصول مختلفة: public, default, protected, private, والتي تُستخدم لتقييد الرؤية على مستويات مختلفة. لكن الهدف النهائي هو تغليف تلك الأشياء التي لا ينبغي تغييرها. النهج الذي يعمل بشكل أفضل هو أن الفصل يجب أن يكون لديه سبب واحد فقط للتغيير، والتغليف يجعل تصميم هذا "السبب الواحد" حقيقة واقعة. الطريقة الصحيحة للتغليف هي إخفاء الأشياء التي تتغير بشكل متكرر لتجنب إتلاف الفئات الأخرى. الفوائد: فيما يلي بعض فوائد التغليف:
  • يمكننا حماية الحالة الداخلية للكائن عن طريق إخفاء سماته.
  • يؤدي هذا إلى تحسين نمطية التعليمات البرمجية لأنه يمنع الكائنات من التفاعل بطرق غير متوقعة.
  • يحسن سهولة استخدام التعليمات البرمجية.
  • وهذا يدعم العلاقة التعاقدية لكيان معين.
  • التغليف يجعل صيانة البرامج أسهل.
  • يمكن إجراء تغييرات على الكود بشكل مستقل عن بعضها البعض.

تعدد الأشكال

تعدد الأشكال في البرمجة هو القدرة على توفير نفس الواجهة لأشكال أساسية مختلفة (أنواع البيانات). وهذا يعني أن الفئات التي لها وظائف مختلفة تشترك في نفس الواجهة ويمكن استدعاؤها ديناميكيًا عن طريق تمرير المعلمات حسب المرجع. والمثال الكلاسيكي هو فئة Shape(الشكل) وجميع الفئات التي ترث منه: square(مربع)، circle(دائرة)، dodecahedron(اثنا عشري الوجوه)، irregular polygon(مضلع غير منتظم)، splat(نقطة)، وهكذا. في هذا المثال، سيكون لكل فئة طريقتها الخاصة Draw()ويمكن لرمز العميل ببساطة القيام بما يلي:
Shape shape = new Shape();
Shape.area()للحصول على السلوك الصحيح لأي شكل، يكمن جمال تعدد الأشكال في أن الكود، الذي يعمل مع فئات مختلفة، لا يحتاج إلى معرفة الفئة التي يستخدمها، لأنها جميعها تعمل على نفس المبدأ. تسمى العملية التي تستخدمها لغات البرمجة الموجهة للكائنات لتنفيذ تعدد الأشكال الديناميكي بالربط الديناميكي. ملحوظة: تعدد الأشكال هو القدرة على اختيار طرق أكثر تحديدًا للتنفيذ اعتمادًا على الكائن. يحدث تعدد الأشكال عندما لا يتم تضمين الفئات المجردة. مزايا:
  • إنشاء رمز قابل لإعادة الاستخدام. أي أنه بمجرد إنشاء الفصل وتنفيذه واختباره، يمكن استخدامه بحرية دون القلق بشأن ما هو مكتوب فيه بالضبط.
  • وهذا يسمح بتعليمات برمجية أكثر عمومية ومترابطة بشكل فضفاض.
  • يتم تقليل وقت التجميع، مما يسرع عملية التطوير.
  • الربط الديناميكي.
  • يمكن استخدام نفس الواجهة لإنشاء طرق ذات تطبيقات مختلفة.
  • يمكن استبدال التنفيذ بأكمله باستخدام توقيعات الطريقة نفسها.
طريقة التجاوز كجزء من تعدد الأشكال. يتفاعل التجاوز مع طريقتين: طريقة في الفئة الأصلية وطريقة في الفئة المشتقة. هذه الأساليب لها نفس الاسم والتوقيعات. يتيح لك التجاوز إجراء نفس العملية بطرق مختلفة لأنواع مختلفة من الكائنات. على سبيل المثال:
while(it.hasNext()) {
Shape s = (Shape) it.next();
totalArea += s.area(dim); //будет применен полиморфизм и вызван нужный метод для каждого an object.
}
مفاهيم البرمجة الشيئية JAVA - 2التحميل الزائد للطريقة أو تعدد الأشكال المخصص أو تعدد الأشكال الثابت يتفاعل التحميل الزائد مع طرق متعددة من نفس الفئة تحمل أسماء متطابقة ولكن لها توقيعات طريقة مختلفة. تتيح لك إعادة التحميل وصف نفس العملية بطرق مختلفة لبيانات مختلفة. يُطلق عليه أحيانًا تعدد الأشكال الساكن، لكنه في الواقع ليس تعدد الأشكال. هذا ليس أكثر من مجرد وجود طريقتين بنفس الأسماء، ولكن قائمة مختلفة من الوسائط. إعادة التشغيل لا علاقة لها بالميراث وتعدد الأشكال. والطريقة المحملة بشكل زائد ليست مثل الطريقة التي تم تجاوزها على الإطلاق. تعدد الأشكال البارامترية من خلال التوليد في JAVA عند الإعلان عن فئة، يمكن ربط حقل الاسم بأنواع مختلفة، ويمكن ربط اسم الطريقة بمعلمات وأنواع إرجاع مختلفة. تدعم JAVA تعدد الأشكال البارامترية باستخدام الأدوية العامة.
List<String> list = new ArrayList<String>();
لماذا لا يمكننا تجاوز الطريقة الثابتة في JAVA؟ يعتمد التجاوز على وجود مثيل للفئة. فكرة تعدد الأشكال هي أنه يمكنك إنشاء فئة فرعية، والكائنات التي تنفذها تلك الفئات الفرعية سوف تتصرف بشكل مختلف مع نفس أساليب الفئة الأصلية (يتم تجاوزها في الفئات الفرعية). لا ترتبط الطريقة الثابتة بأي مثيلات للفئة، لذلك لا يمكن تطبيق مفهوم التجاوز نفسه. استرشد منشئو جافا باعتبارين أثرا في هذا النهج. أولاً، هناك مشاكل في تنفيذ التعليمات البرمجية: كان هناك الكثير من الانتقادات لـ Smalltalk لكونها بطيئة (كان جمع البيانات المهملة وتعدد الأشكال جزءًا من هذه المشكلة)، وتم تصميم JAVA لتجنب ذلك. الاعتبار الثاني كان القرار بأن الجمهور المستهدف لـ JAVA سيكون مطوري C++. كان وجود الأساليب الثابتة تعمل بهذه الطريقة مألوفًا جدًا لمبرمجي C++، كما أدى إلى تسريع الأمور نظرًا لعدم وجود حاجة للصعود إلى التسلسل الهرمي للفصل لمعرفة الطريقة التي يجب الاتصال بها. تذهب مباشرة إلى الفصل وتتصل بطريقة محددة.

ميراث

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

التجريد

التجريد يعني تصميم الفئات بناءً على واجهاتها ووظائفها، دون مراعاة تفاصيل التنفيذ. تمثل الفئة المجردة واجهات دون تضمين التنفيذ الفعلي. إنه يميز تنفيذ الكائن عن سلوكه. يعمل التجريد على تبسيط الكود عن طريق إخفاء التفاصيل غير المهمة. مزايا:
  • باستخدام التجريد، يمكننا فصل ما يمكن تجميعه في نوع ما.
  • يمكن تجميع الخصائص والأساليب التي تتغير بشكل متكرر في نوع منفصل، بحيث لا يخضع النوع الرئيسي للتغييرات. وهذا يعزز مبدأ OOP: "يجب أن يكون الكود مفتوحًا للامتداد، ولكنه مغلق أمام التغيير " .
  • التجريد يبسط تمثيل نماذج المجال.
الفرق بين التجريد والتغليف التغليف هي استراتيجية تستخدم كجزء من التجريد. يشير التغليف إلى بنية الكائن: حيث تقوم الكائنات بتغليف خصائصها وإخفائها عن الوصول الخارجي. يتفاعل مستخدمو الفصل الدراسي معه باستخدام أساليبه، لكن ليس لديهم إمكانية الوصول المباشر إلى بنية الفصل. بهذه الطريقة، يلخص الفصل تفاصيل التنفيذ المتعلقة بتصميمه. التجريد هو مصطلح أكثر عمومية. ويمكن أيضًا تحقيق ذلك، من بين أمور أخرى، باستخدام الفئات الفرعية. على سبيل المثال، الفئة List(القائمة) في المكتبة القياسية هي عبارة عن تجريد لسلسلة من العناصر، مفهرسة وفقًا لمكانها في القائمة. الأمثلة المحددة للقائمة Listهي ArrayListأو LinkedList. الكود الذي يتفاعل مع القائمة Listيلخص تفاصيل القائمة التي يستخدمها. في كثير من الأحيان لا يكون التجريد ممكنًا دون إخفاء الحالة الأساسية باستخدام التغليف. إذا كشف الفصل عن بنيته الداخلية، فلن يتمكن من تغيير عملياته الداخلية، وبالتالي لا يمكن تجريدها. ما هي الطبقة المجردة والطريقة المجردة؟ يحدث أنه أثناء التطوير تريد أن توفر الفئة الأساسية واجهة فقط للفئات المشتقة منها. أي أنك لا تريد أن يقوم أي شخص بإنشاء مثيلات للفئة الأساسية. أنت بحاجة إلى استخدام الواجهة بحيث تقوم فقط بإلقاء الكائنات إليها (وهذا عبارة عن تحويل ضمني يسمح بسلوك متعدد الأشكال). يتم تحقيق ذلك عن طريق جعل هذا الفصل مجردًا باستخدام الكلمة الأساسية abstract. وهذا يفرض بعض القيود، مثل عدم القدرة على إنشاء مثيلات لفئة مجردة؛ عند استخدام فئة مجردة، من الضروري تنفيذ أساليب مجردة. وهذا يضمن تعدد الأشكال. يمكن أن تحتوي الفئة المجردة على طرق مجردة وملموسة. إذا تم تعريف أسلوب واحد على الأقل في الفصل بأنه مجرد، فيجب أيضًا تعريف الفصل بأكمله بأنه مجرد. ومع ذلك، ليس من الضروري مراعاة القاعدة في الاتجاه المعاكس. إذا تم الإعلان عن فئة مجردة، فقد لا تحتوي على أساليب مجردة. الطريقة التي تحدد توقيعاتها فقط ولا توفر تطبيقًا تسمى مجردة. يتم ترك التنفيذ الفعلي لفئاته الفرعية، والتي توسع الطبقة المجردة. لا يمكن لكائن أن يستخدم الطريقة المجردة، بل يمكن لفئة أخرى فقط توسيعها. متى يجب عليك استخدام فئة مجردة؟ تتيح لك الفئات المجردة تحديد بعض السلوكيات الافتراضية كما توفر الفئات الفرعية أي سلوك محدد. على سبيل المثال: List(list) عبارة عن واجهة، تحدد بدورها AbstractListالسلوك الأساسي للقائمة، والتي يمكن استخدامها كما هي أو تحسينها في فئة فرعية، على سبيل المثال، في ArrayList(صفيف القائمة). ما هي الواجهة؟ إن مفهوم الواجهة عبارة عن فئة مجردة، لكن الواجهة (المحددة بواسطة الكلمة الرئيسية interface) تذهب خطوة أخرى إلى الأمام. يمنع أي تنفيذ لطريقة أو وظيفة على الإطلاق. يمكنك فقط الإعلان عن طريقة أو وظيفة، ولكن لا يمكنك توفير تنفيذها. يجب أن تهتم الفئة التي تنفذ الواجهة بالتنفيذ الفعلي. الواجهات مفيدة جدًا وتستخدم على نطاق واسع في OOP. ونظرًا لأنهما يشتركان في الواجهة نفسها والتنفيذ، فإنهما يوفران العديد من المزايا لاستخدامهما:
  1. تعدد الميراث .
  2. اقتران فضفاض . هناك تجريد للعملية، مثل الطبقات، ويمكن أن يكون التنفيذ الملموس أي شيء: JDBC، JPA، JTA، إلخ.
  3. لم يتم تنفيذ برنامج الواجهة .
  4. تعدد أشكال الربط الديناميكي : يتم عرض واجهة برمجة الكائن دون الكشف عن تنفيذه الفعلي.
  5. مستويات مجردة ، وفصل الوظائف.
الفرق بين الواجهة والطبقة المجردة.
  • الواجهة هي علاقة تعاقدية مع الفئات التي تنفذ هذه الواجهة، تنص على أن التنفيذ يتم بالطريقة التي تحددها الواجهة. هذه قذيفة فارغة مع الأساليب المعلنة.
  • تحدد الفئة المجردة بعض السلوك العام وتطلب من فئاتها الفرعية تحديد سلوك غير نمطي أو محدد لفئتها.
  • يمكن تعيين أساليب وأعضاء فئة مجردة باستخدام أي معدّل وصول؛ وفي المقابل، يجب أن تكون جميع أساليب الواجهة عامة.
  • عند وراثة فئة مجردة، يجب على الفئة التابعة تعريف الأساليب المجردة، بينما يمكن للواجهة أن ترث واجهة أخرى دون تحديد أساليبها بالضرورة.
  • يمكن للفئة التابعة توسيع فئة مجردة واحدة فقط، ولكن يمكن للواجهة أن تمتد أو يمكن للفئة تنفيذ العديد من الواجهات الأخرى.
  • يمكن للفئة التابعة أن تحدد طرقًا مجردة بنفس معدل الوصول أو أقل تقييدًا، ولكن يجب أن تحدد الفئة التي تنفذ الواجهة طرقًا بنفس مستوى الرؤية.
  • لا تحتوي الواجهة على مُنشئات، بينما تحتوي الفئة المجردة على ذلك.
  • تعتبر المتغيرات المعلنة في واجهة Java نهائية بشكل افتراضي. يمكن أن تحتوي الفئة المجردة على متغيرات ليست نهائية.
  • جميع أعضاء واجهة Java هم public. يمكن لأعضاء فئة مجردة أن يكونوا public، protectedوما إلى ذلك.

تعبير

يمكن تحقيق إعادة استخدام الكود باستخدام كل من الميراث والتكوين. لكن استخدام التركيب يوفر مستوى تغليف أعلى من الوراثة، نظرًا لأن التغييرات في فئة الواجهة الخلفية لن تؤثر بالضرورة على الكود الذي ينتمي إلى فئة الواجهة الأمامية. التركيب هو أسلوب تصميم يستخدم العلاقات "has-a" (يحتوي على، يتضمن) في الفصول الدراسية. يمكن استخدام كل من وراثة جافا وتكوين الكائن لإعادة استخدام التعليمات البرمجية. جوهر التكوين هو التعبير عن علاقة "لديه" بين الأشياء. فكر في كرسي. الكرسي لديه مقعد. الكرسي له ظهر. يحتوي الكرسي على عدد معين من الأرجل. تشير عبارة "لديه" إلى علاقة يكون فيها الكرسي شيئًا آخر، أو على الأقل يستخدمه. هذه هي بالتحديد علاقة "has-a"، التي هي أساس التكوين. مزايا:
  • التحكم في الرؤية
  • يمكن استبدال التنفيذ في وقت التشغيل
  • اقتران فضفاض، لأن فئة الواجهة لا تعتمد على التنفيذ.
الفرق بين التركيب والميراث
لا. تكوين (لديه / لديه) الميراث (هو / هو)
1 يدعم تعدد الأشكال وإعادة استخدام التعليمات البرمجية. يدعم تعدد الأشكال وإعادة استخدام التعليمات البرمجية.
2 لقد تم بالفعل إنشاء كائن وقت التشغيل. يتم إنشاء الكائن ديناميكيًا في وقت الترجمة.
3 يمكن استبدال التنفيذ في وقت التشغيل. يمكن تغيير التنفيذ في وقت الترجمة.
4 الفئة الفرعية مستقلة عن فئتها الأم، والتي تفضل الاقتران السائب (خاصة تحت التحكم في الواجهة). تعتمد الفئة الفرعية على تنفيذ الفئة الأصلية، لذلك يعتبر الارتباط قويًا.
5 الاستخدام: المنزل به حمام. ومن الخطأ أن نقول أن البيت هو الحمام. الميراث أحادي الاتجاه: البيت هو المبنى. لكن المبنى ليس منزلاً.
ملحوظة: لا تستخدم الوراثة فقط لضمان إعادة استخدام الكود. إذا لم تكن هناك علاقة "هو" (هو)، يتم استخدام التركيب لهذه الأغراض. الفرق بين التركيب والتجميع يكمن في العلاقات بين الكائنات. التجميع هو علاقة يتم فيها دمج فئة واحدة في مجموعة. إنها جزء من علاقة كاملة، حيث يمكن للجزء أن يوجد دون الكل. مثل هذه العلاقات أضعف بكثير. لا يوجد تبعية دورية. على سبيل المثال: الطلب والمنتج. التركيب هو العلاقة التي تتناسب فيها فئة واحدة مع المجموعة. إنه جزء من علاقة كاملة، حيث لا يمكن للجزء أن يوجد بدون الكل. فإذا تم تدمير الكل، سيتم تدمير جميع مكوناته أيضًا. إنها علاقة أقوى. على سبيل المثال: المضلع ورؤوسه، والنظام ومكوناته.
تعليقات
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION