هل يمكن أن يكون لديك الكثير من "الديناميكي" باللغات الديناميكية؟

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

سؤال

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

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

لذلك، إليك أسئلة خاصة أحتاج إلى مساعدة في:

  1. يجب أن أعلن أنواع لمعلماتي، حقول، إلخ؟

  2. يجب أن أعلن كتلة من التعليمات البرمجية كإغلاق عندما ستفعل الطريقة البسيطة؟

  3. متى يجب أن أستخدم كتابة البط بدلا من الإرسال الديناميكي متعدد الأشكال. على سبيل المثال، في Groovy يمكنني أن أفعل الحيوان. "$ عمل" () أو def الحيوان؛ Animal.action ()، بدلا من حيوان حيوان = كلب جديد ()؛ الحيوان (). أستطيع أن أرى المشكلة الأولى في سياق المبدأ المفتوح المغلقة، ولكن أي أسباب أخرى تفضل أن تعدد الأشكال أسلوب OO؟

  4. متى يجب أن أستخدم واجهات في Groovy (إذا كان ذلك من أي وقت مضى)؟

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

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

المحلول

.1. يجب أن أعلن أنواع لمعلماتي، حقول، إلخ؟

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

.2. يجب أن أعلن كتلة من التعليمات البرمجية كإغلاق عندما ستفعل الطريقة البسيطة؟

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

.3. متى يجب أن أستخدم كتابة البط بدلا من الإرسال الديناميكي متعدد الأشكال. على سبيل المثال، في Groovy يمكنني أن أفعل الحيوان. "$ عمل" () أو def الحيوان؛ Animal.action ()، بدلا من حيوان حيوان = كلب جديد ()؛ الحيوان (). أستطيع أن أرى المشكلة الأولى في سياق المبدأ المفتوح المغلقة، ولكن أي أسباب أخرى تفضل أن تعدد الأشكال أسلوب OO؟

أنا فقط استخدام الحيوان. "Action $" () نموذج عندما أحتاج إلى هذا المستوى من غير مباشر لأن اسم الأسلوب يختلف بناء على مسار تنفيذ التعليمات البرمجية (في أغلب الأحيان أثناء التعريف الثقيل). أنا استخدام حيوان الحيوان = كلب جديد ()؛ Animal.action () عندما أريد مساعدة IDE في الإكمال التلقائي، أو هذا المستوى من الوثائق مفيد لوضوح التعليمات البرمجية (ولا يضر بالرقابة الإضافية التي قد تكون واضحة أو تقييد).

.4. متى يجب أن أستخدم واجهات في Groovy (إذا كان ذلك من أي وقت مضى)؟

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

نصائح أخرى

هذا ليس دائما رأي شعبي، لكنني أعتقد أن رمزك أكثر وضوحا واضحا يمكن أن يكون، كان ذلك أفضل.

أنا لا أحب بنيات تتركك تخمين فقط ما يحدث ...

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

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

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

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

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

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

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

هناك نوعان مهيمان من اللغات الموجهة للكائنات.

اللغات في سيمولا 67. الأسرة، مثل C ++ وجافا، تفضل متغيرات مكتوبة ثابتة ومجمعات محلات ومحولات وروابط وطريقة VTables.

اللغات في حديث قصير الأسرة، مثل روبي، لصالح المتغيرات المكتوبة ديناميكيا، التفسير، وصالة الرسائل بدلا من جداول مؤشر الوظائف.

كلاهما موجه نحو الكائنات، ولكن يختلف كثيرا عن مفهوم توجيه الكائنات.

نعم

--

رقم

هل تدرك أنه لا توجد إجابة حقيقية لهذا السؤال؟

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