OOP vs البرمجة الوظيفية مقابل الإجرائي [مغلق

StackOverflow https://stackoverflow.com/questions/552336

  •  23-08-2019
  •  | 
  •  

سؤال

ما هي الاختلافات بين النماذج البرمجة هذه، وهي أكثر ملاءمة بشكل أفضل لمشاكل معينة أو هل تؤيد أي حالات استخدام واحدة على الآخرين؟

أمثلة الهندسة المعمارية

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

المحلول

كلهم جيدون بطرقهم الخاصة - إنها مجرد طرق مختلفة لنفس المشاكل.

في النمط الإجرائي بحت، تميل البيانات إلى أن تكون مدفأ للغاية من الوظائف التي تعمل عليها.

في نمط وجوه موجه، تميل البيانات إلى حملها مع مجموعة من الوظائف.

في نمط وظيفي، تميل البيانات والوظائف نحو وجود المزيد من القواسم المشتركة مع بعضها البعض (كما هو الحال في LISP ومخطط) مع توفير المزيد من المرونة من حيث استخدام الوظائف بالفعل. تميل الخوارزميات أيضا إلى تعريفها من حيث العودية والتكوين بدلا من الحلقات والتكرار.

بالطبع، تؤثر اللغة نفسها فقط على الطريقة المفضلة. حتى في لغة خالصة وظيفية مثل Haskell، يمكنك الكتابة بأسلوب إجرائي (على الرغم من أنه مثبط للغاية)، وحتى في لغة إجرائية مثل C، يمكنك البرنامج في نمط موجه نحو الكائنات (كما هو الحال في GTK + و fl apis).

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

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

نصائح أخرى

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

على سبيل المثال، إذا كنت تقوم بعمل لعبة فيديو، فهناك أمثلة برمجية جيدة و SDKS في C ++، لذلك ربما تكون أفضل حالا مع ذلك. للحصول على تطبيق ويب صغير، هناك بعض الأطر Python و PHP و Ruby التي سوف تحصل عليها وتعمل بسرعة كبيرة. يعد Java خيارا رائعا للمشاريع الأكبر بسبب التحقق من الوقت ومكتبات المؤسسات والمنصات.

اعتادت أن تكون هي الحالة التي كانت فيها المكتبات القياسية لغات مختلفة صغيرة جدا وسهولة تكرارها - C، C ++، Assembler، ML، LISP، إلخ. جاء مع الأساسيات، ولكن تميل إلى الدجاج عندما يتعلق الأمر بتوحيد الأشياء مثل اتصالات الشبكة، التشفير، الرسومات، تنسيقات ملفات البيانات (بما في ذلك XML)، حتى هياكل البيانات الأساسية مثل الأشجار المتوازنة وتركت hashtables!

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

لا يجب أن تكون هذه النماذج حصرية بشكل متبادل. إذا نظرت إلى Python، فإنه يدعم الوظائف والفئات، ولكن في الوقت نفسه، كل شيء كائن، بما في ذلك الوظائف. يمكنك مزج وتطابق نمط وظيفي / OOP / الإجرائي الكل في قطعة واحدة من التعليمات البرمجية.

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

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

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

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

في بيثون، ليس لديك هذا التقييد.

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

لا أعتقد أنه مسألة اللغة لا. يمكنك كتابة وظيفية أو إجرائية أو كائن في أي لغة شعبية تقريبا، على الرغم من أنه قد يكون بعض الجهود الإضافية في بعضها.

من أجل الإجابة على سؤالك، نحتاج إلى عنصرين:

  1. فهم خصائص أنماط / أنماط العمارة المختلفة.
  2. فهم خصائص النماذج البرمجة المختلفة.

يتم عرض قائمة أنماط بنية البرامج / النمط على عمارة البرمجيات على ويكيبييدا. ويمكنك البحث عنها بسهولة على الويب.

باختصار وجمهور، تكون الإجرائية جيدة للنموذج الذي يتبع الإجراء، OOP هو جيد للتصميم، وعملي جيد للبرمجة عالية المستوى.

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

بعد فهمها كلاهما، يمكنك ربط بنود أنماط / أنماط الهندسة المعمارية إلى نماذج البرمجة.

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

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

أ) كنت ابتكار نظام ذكي سيعاني الميراث إلى حد ما. يمكن إنجازه!

أنا) يمكنك استخدام نظام هوك, ، والذي يتوقع أن يكون لكل طفل ج من الوالد P تجاهل معين للحصول على وظيفة F. يمكنك جعل الأطفال يقومون بتسجيل عمليات التجاوزات الخاصة بهم، والتي سيتم تخزينها وتسميتها عند الاقتضاء.

2) يمكنك استخدام الهيكل محاذاة الذاكرة ميزة لإدلاء الأطفال في الآباء والأمهات.

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

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

أنا تميل نحو النهج ب. كتبت حلا ممكنا باستخدام النهج A، وسأكون صادقا، فقد شعرت بعدم طبيعي للغاية باستخدام هذا الرمز.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top