سؤال

ويبدو لي أن الشيء الأكثر لا تقدر بثمن حول / لغة برمجة ثابتة كتابة بشدة هو أنه يساعد على إعادة بيع ديون: إذا / عند تغيير أي API، ثم المترجم سوف اقول لكم ما قد كسر هذا التغيير

ويمكنني ان اتصور كتابة التعليمات البرمجية في وقت التشغيل / لغة كتابة ضعيفة ... ولكن لا أستطيع أن أتخيل إعادة بيع ديون دون مساعدة مترجم ل، وأنا لا أستطيع أن أتخيل كتابة عشرات الآلاف من خطوط للقانون دون إعادة بيع ديون.

هل هذا صحيح؟

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

المحلول

وأعتقد أنك الخلط بين عندما يتم التحقق من أنواع مع كيف انهم محددا. الكتابة وقت التشغيل ليست ضعيفة بالضرورة.

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

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

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

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

وأما بالنسبة لسؤالك الثاني:

وكيف يمكن أن نعيد عامل بأمان بلغة وقت كتابتها؟

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

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

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

نصائح أخرى

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

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

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

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

وأنا لا أجد عدم وجود أنواع ثابتة لتكون إعادة بيع ديون مشكلة بخصوص. ما أجد مشكلة هي عدم وجود إعادة بيع ديون <م> المتصفح . اللغات الديناميكية لديها مشكلة أن كنت لا تعرف حقا ما الكود هو حقا تنوي القيام به حتى كنت في الواقع تشغيله. بيرل لديه هذا أكثر من غيره. بيرل لديه مشكلة إضافية تتمثل في وجود معقدة للغاية، unparsable تقريبا، بناء الجملة. النتيجة: لا أدوات إعادة بيع ديون (على الرغم انهم يعملون بشكل سريع جدا على أن ). والنتيجة النهائية هي لا بد لي من ريفاكتور باليد. وهذا ما يدخل الخلل.

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

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

والمثال الكلاسيكي: public static double sqrt(double a) هو في توقيع لمربع وظيفة الجذر جافا . لا يعمل الجذر التربيعي على الأرقام السالبة. حيث أنها لا أقول أنه في التوقيع؟ لا. والأسوأ من ذلك، حيث أنها لا تقول ما حتى يفعل ذلك وظيفة؟ التوقيع يقول فقط ما هي أنواع يلزم وما تقوم بإرجاع. تقول شيئا عن ما يحدث في بين وحيث يعيش رمز للاهتمام. وقد حاول بعض الناس لالتقاط API الكامل باستخدام تصميم بالعقود ، التي يمكن على نطاق واسع وصفها بأنها تضمين اختبارات وقت التشغيل المدخلات وظيفة الخاص بك والمخرجات والآثار الجانبية (أو عدمه) ... ولكن هذا عرض آخر.

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

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

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

واحدة من فوائد استخدام <م> فار في C # 3.0 هو أنك <م> يمكن في كثير من الأحيان تغيير نوع دون كسر أي رمز. نوع يحتاج إلى تزال تبدو نفس - الخصائص مع نفس الأسماء يجب أن يكون موجودا، يجب الأساليب مع نفس أو ما شابه ذلك التوقيع لا تزال موجودة. ولكن يمكنك تغيير الواقع إلى نوع مختلف جدا، حتى دون استخدام شيء من هذا القبيل ReSharper.

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