سؤال

منذ النقاش دون مصطلحات ذات معنى لا معنى له, فكرت أن أشير إلى الفيل الموجود في الغرفة وأسأله:ما الذي يجعل اللغة "موجهة للكائنات" بالضبط؟أنا لا أبحث عن إجابة كتابية هنا، ولكن إجابة تعتمد على تجاربك مع لغات OO التي تعمل بشكل جيد في مجالك، مهما كان.

السؤال ذو الصلة الذي قد يساعد في الإجابة عليه أولاً هو:ما هو النموذج الأصلي للغات الموجهة للكائنات ولماذا؟

هل كانت مفيدة؟

المحلول

تعريفات التوجه الكائني هي بالطبع أ علبة ضخمة من الديدان, ، ولكن هنا سنتان:

بالنسبة لي، يتمحور التوجه الكائني حول الكائنات التي تتعاون عن طريق إرسال الرسائل.هذه، بالنسبة لي، هي السمة الأكثر أهمية في اللغة الشيئية.

إذا اضطررت إلى وضع قائمة مرتبة بجميع الميزات التي يجب أن تمتلكها اللغة الموجهة للكائنات، فستبدو كما يلي:

  1. كائنات ترسل رسائل إلى كائنات أخرى
  2. كل شيء هو كائن
  3. ملزمة متأخرة
  4. تعدد الأشكال الفرعي
  5. الميراث أو شيء مماثل معبر، مثل وفد
  6. التغليف
  7. إخفاء المعلومات
  8. التجريد

من الواضح أن هذه القائمة مثيرة للجدل للغاية، لأنها تستبعد مجموعة كبيرة ومتنوعة من اللغات التي تعتبر على نطاق واسع لغات موجهة للكائنات، مثل جافا, ج# و سي ++, وكلها مخالفة للنقاط 1 و 2 و 3.ومع ذلك، ليس هناك شك في أن هذه اللغات تسمح بالبرمجة الموجهة للكائنات (ولكن الأمر كذلك أيضًا). ج) وحتى تسهيل ذلك (وهو ما لا يفعله C).لذا، فقد توصلت إلى تسمية اللغات التي تلبي تلك المتطلبات بأنها "موجهة للكائنات بحتة".

باعتبارها لغات نموذجية موجهة للكائنات أود أن أسميها الذات و لغة جديدة.

كلاهما يفي بالمتطلبات المذكورة أعلاه.كلاهما مستوحى من وخلفاء ل حديث قصير, ، وكلاهما تمكنا في الواقع من أن يكونا "أكثر OO" إلى حد ما.الأشياء التي أحبها في الذات واللغة الجديدة هي أن كلاهما يأخذ نموذج إرسال الرسالة إلى أقصى الحدود (اللغة الجديدة أكثر من الذات).

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

وفي الذات هناك لا توجد فصول دراسية, ، كائنات فقط.وهذا يؤكد ما هو OO حقًا عن:الكائنات وليس الطبقات.

نصائح أخرى

وبحسب بوتش فإن العناصر التالية:رئيسي:

  • التجريد
  • التغليف
  • نمطية
  • التسلسل الهرمي (الميراث)

صغير:

  • الكتابة
  • التزامن
  • إصرار

في الأساس، يتلخص التوجه الكائني في "تمرير الرسالة"

في اللغة الإجرائية، أسمي وظيفة مثل هذا:

  f(x)

ومن المحتمل أن يكون الاسم f مرتبطًا بكتلة معينة من التعليمات البرمجية في وقت الترجمة.(ما لم تكن هذه لغة إجرائية ذات وظائف ذات ترتيب أعلى أو مؤشرات إلى وظائف، ولكن دعونا نتجاهل هذا الاحتمال لثانية واحدة.) لذا فإن هذا السطر من التعليمات البرمجية لا يمكن أن يعني سوى شيء واحد لا لبس فيه.

في لغة موجهة للكائنات، أقوم بتمرير رسالة إلى كائن، ربما على النحو التالي:

 o.m(x) 

في هذه الحالة.m ليس اسمًا لكتلة من التعليمات البرمجية، ولكنه "محدد الطريقة" وأي كتلة من التعليمات البرمجية يتم استدعاؤها تعتمد في الواقع على الكائن o بطريقة ما.هذا السطر من التعليمات البرمجية أكثر غموضًا أو عمومية لأنه يمكن أن يعني أشياء مختلفة في مواقف مختلفة، اعتمادًا على o.

في غالبية لغات OO، يحتوي الكائن o على "فئة"، وتحدد الفئة أي كتلة من التعليمات البرمجية يتم استدعاؤها.في اثنين من لغات OO (الأكثر شهرة، جافا سكريبت) لا يوجد فئة، ولكن لديها أساليب مرتبطة بها مباشرة في وقت التشغيل، أو ورثتها من نموذج أولي.

ترسيمي هو أنه لا الطبقات ولا الميراث ضروريان لتكون اللغة OO.لكن هذا التعامل متعدد الأشكال مع الرسائل أمر ضروري.

على الرغم من أنه يمكنك تزييف ذلك باستخدام المؤشرات الوظيفية في لغة C، إلا أن هذا لا يكفي لتسمى لغة C لغة OO، لأنه سيتعين عليك تنفيذ البنية التحتية الخاصة بك.يمكنك فعل ذلك، وأسلوب OO ممكن، لكن اللغة لم تمنحك ذلك.

ليست اللغات هي OO حقًا، بل الكود.

من الممكن كتابة تعليمات برمجية C موجهة للكائنات (مع بنيات وحتى أعضاء مؤشر دالة، إذا كنت ترغب في ذلك) ولقد رأيت بعض الأمثلة الجيدة على ذلك.(يتبادر إلى ذهني Quake 2/3 SDK.) ومن المؤكد أيضًا أنه من الممكن كتابة إجراءات إجرائية (أي:رمز غير OO) في C++.

بالنظر إلى ذلك، أود أن أقول إن دعم اللغة لكتابة شفرة OO جيدة هو الذي يجعلها "لغة موجهة نحو الكائن". "لن أزعج نفسي أبدًا باستخدام أعضاء مؤشر الوظائف في الهياكل في ج، على سبيل المثال، لما يمكن أن يكون وظائف الأعضاء العادية ؛لذلك سأقول أن لغة C ليست لغة OO.

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

تعتبر لغة Smalltalk نموذجًا أصليًا للغة OO، على الرغم من أن لغة Simula غالبًا ما يُشار إليها على أنها لغة OO الأولى.

يمكن تصنيف لغات OO الحالية بشكل فضفاض حسب اللغة التي تقترض منها معظم المفاهيم:

  • مثل الحديث الصغير:روبي، الهدف-C
  • تشبه المحاكاة:C++، كائن باسكال، جافا، C#

بقدر ما أستطيع أن أقول، فإن وجهة النظر الرئيسية لما يجعل اللغة "موجهة للكائنات" هي دعم فكرة تجميع البيانات، والأساليب التي تعمل على تلك البيانات، والتي يتم تحقيقها بشكل عام من خلال الفئات، والوحدات، والميراث، وتعدد الأشكال، وما إلى ذلك.

يرى هذه المناقشة للحصول على لمحة عامة عما يعتقده الناس (يفكرون؟) يعني التوجه للكائنات.

أما بالنسبة للغة OO "النموذجية" - فهي في الواقع Smalltalk، كما أشار كريستوفر.

يدعم الفئات والأساليب والسمات والتغليف وإخفاء البيانات والميراث وتعدد الأشكال والتجريد...؟

وبغض النظر عن الآثار النظرية، يبدو أن الأمر كذلك

"أي لغة تحتوي على كلمة رئيسية تسمى 'class'" :-P

لتعزيز ما قاله aib، أود أن أقول إن اللغة ليست موجهة للكائنات حقًا ما لم تكن المكتبات القياسية المتوفرة موجهة للكائنات.وأكبر مثال على ذلك هو PHP.على الرغم من أنها تدعم جميع المفاهيم القياسية الموجهة للكائنات، إلا أن حقيقة أن هذه النسبة الكبيرة من المكتبات القياسية ليست موجهة للكائنات يعني أنه من المستحيل تقريبًا كتابة التعليمات البرمجية الخاصة بك بطريقة موجهة للكائنات.

لا يهم أنهم يقدمون مساحات أسماء إذا كانت جميع المكتبات القياسية لا تزال تطلب منك بادئة جميع استدعاءات الوظائف الخاصة بك بأشياء مثل mysql_ وpgsql_، عندما تكون في لغة تدعم مساحات الأسماء في واجهة برمجة التطبيقات الفعلية، يمكنك التخلص من الوظائف ذات mysql_ ولديك فقط "تضمين system.db.mysql.*" في الجزء العلوي من ملفك حتى يعرف مصدر هذه الأشياء.

عندما يمكنك إنشاء فئات، فهي موجهة للكائنات
على سبيل المثال :Java موجهة للكائنات، وجافا سكريبت ليست كذلك، وC++ تبدو كنوع من اللغات "الفضولية للكائنات"

في تجربتي، اللغات ليست موجهة نحو الكائنات، بل التعليمات البرمجية هي كذلك.

قبل بضع سنوات، كنت أكتب مجموعة من البرامج بلغة AppleScript، والتي لا تفرض فعليًا أي ميزات موجهة للكائنات، عندما بدأت في استخدام OO.من الصعب كتابة كائنات في AppleScript، على الرغم من أنه من الممكن إنشاء فئات ومنشئات وما إلى ذلك إذا أخذت الوقت الكافي لمعرفة كيفية القيام بذلك.

كانت اللغة هي اللغة الصحيحة للمجال:الحصول على برامج مختلفة على نظام التشغيل Macintosh للعمل معًا لإنجاز بعض المهام التلقائية بناءً على ملفات الإدخال.كان تحمل عناء فرض أسلوب موجه للكائنات اختيارًا برمجيًا صحيحًا لأنه أدى إلى تعليمات برمجية كانت أسهل في استكشاف الأخطاء وإصلاحها واختبارها وفهمها.

الميزة التي لاحظتها أكثر في تغيير هذا الرمز من الإجرائي إلى OO كانت التغليف:كل من الخصائص واستدعاءات الأسلوب.

البسطاء:(قارن شخصية التأمين)

1 - تعدد الأشكال 2 - الإرث 3 - التغليف 4 - إعادة الاستخدام.:)

هدف:الكائن هو مستودع للبيانات.على سبيل المثال، إذا كان MyList عبارة عن كائن ShoppingList، فقد يقوم MyList بتسجيل قائمة التسوق الخاصة بك.

فصل:الفئة هي نوع من الكائنات.قد توجد العديد من الكائنات من نفس الفئة؛على سبيل المثال، قد يكون كل من MyList وYourList كائنات ShoppingList.

طريقة:إجراء أو وظيفة تعمل على كائن أو فئة.ترتبط الطريقة بفئة معينة.على سبيل المثال، قد يكون addItem أسلوبًا يضيف عنصرًا إلى أي كائن في قائمة التسوق.في بعض الأحيان ترتبط الطريقة بمجموعة من الفئات.على سبيل المثال، قد يعمل addItem على أي قائمة، والتي تعد قائمة التسوق نوعًا واحدًا منها فقط.

ميراث:قد يرث الفصل خصائص من فئة أكثر عمومية.على سبيل المثال، ترث فئة ShoppingList من فئة القائمة خاصية تخزين تسلسل العناصر.

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

وجوه المنحى:يعرف كل كائن فئته الخاصة والطرق التي تتعامل مع الكائنات الموجودة في تلك الفئة.تعرف كل قائمة تسوق وكل عربة تسوق أي تطبيق addItem ينطبق عليها.

في هذه القائمة، الشيء الوحيد الذي يميز اللغات الموجهة للكائنات عن اللغات الإجرائية (C، Fortran، Basic، Pascal) هو تعدد الأشكال.

مصدر: https://www.youtube.com/watch?v=mFPmKGIrQs4&list=PL-XXv-cvA_iAlnI-BQr9hjqADPBtujFJd

يسعدني مشاركة هذا معكم يا رفاق، لقد كان مثيرًا للاهتمام ومفيدًا جدًا بالنسبة لي.هذا مقتطف من مقابلة مع رولينج ستون عام 1994 حيث يشرح ستيف (وليس مبرمجًا) OOP بعبارات بسيطة.

جيف جودل:هل يمكنك أن تشرح، بعبارات بسيطة، ما هي البرامج الموجهة للكائنات بالضبط؟

ستيف جوبز:الأشياء تشبه الناس.إنهم يعيشون ويتنفسون أشياء تحتوي بداخلها على معرفة حول كيفية القيام بالأشياء ولديها ذاكرة بداخلها حتى يتمكنوا من تذكر الأشياء.وبدلاً من التفاعل معهم على مستوى منخفض جدًا، فإنك تتفاعل معهم على مستوى عالٍ جدًا من التجريد، كما نفعل هنا.

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

ليس لديك أي فكرة كيف فعلت ذلك.ليس لديك علم بمكان الغسيل.ربما تتحدث الفرنسية، ولا يمكنك حتى طلب سيارة أجرة.لا يمكنك الدفع مقابل واحدة، وليس لديك دولارات في جيبك.ومع ذلك، عرفت كيف أفعل كل ذلك.ولم يكن عليك أن تعرف أيًا منها.كل هذا التعقيد كان مخفيًا بداخلي، وكنا قادرين على التفاعل على مستوى عالٍ جدًا من التجريد.هذا ما هي الأشياء.إنها تغلف التعقيد، والواجهات الخاصة بهذا التعقيد عالية المستوى.

النموذج الأصلي

القدرة على التعبير عن سيناريوهات العالم الحقيقي في التعليمات البرمجية.

foreach(House house in location.Houses)
{
 foreach(Deliverable mail in new Mailbag(new Deliverable[]
              {
              GetLetters(), 
              GetPackages(), 
              GetAdvertisingJunk()
              })
 {
    if(mail.AddressedTo(house))
    {
        house.Deliver(mail);
    }
 }
}

-

foreach(Deliverable myMail in GetMail())
{
    IReadable readable = myMail as IReadable;
    if ( readable != null )
    {
        Console.WriteLine(readable.Text);
    }
}

لماذا؟

لمساعدتنا على فهم هذا بسهولة أكبر.إنه منطقي بشكل أفضل في أذهاننا وإذا تم تنفيذه بشكل صحيح يجعل الكود أكثر كفاءة وقابلية لإعادة الاستخدام ويقلل من التكرار.

لتحقيق ذلك تحتاج إلى:

  • المؤشرات/المراجع للتأكد من أن هذا == هذا وهذا!= ذلك.
  • الطبقات للإشارة إلى (على سبيل المثالArm) التي تخزن البيانات (كثافة الشعر) والعمليات (Throw(IThrowable))
  • تعدد الأشكال (الميراث و/أو الواجهات) للتعامل مع كائنات معينة بطريقة عامة حتى تتمكن من قراءة الكتب وكذلك الكتابة على الجدران (كلاهما يطبق IReadable)
  • التغليف لأن التفاحة لا تعرض خاصية Atoms[]
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top