سؤال

لقد تم طرح هذا السؤال وأنا بصراحة الحيرة:

بدلا من كتابة الأساليب المجردة ، يمكننا محاولة تزييفها باستثناءات ، مثل هذا:

public int someMethod(int someparameter) {
    throws new RuntimeException("unimplemented");
}

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

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

المحلول

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

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

لقد لاحظت أن جافا تحدد فئة مجردة java.net.SocketImpl, ، يحتوي على طريقتين غير مجردة, shutdownInput() و shutdownOutput(), ، الذي التنفيذ الافتراضي هو رمي استثناء:

protected void shutdownInput() throws IOException {
  throw new IOException("Method not implemented!");
}

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

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

نصائح أخرى

لقد ألقيت أحيانا غير المشجعية exception طريقة لم يتم تنفيذ وظائفها بعد.(هناك أيضا notimslementedException في Apache Commons وهي فرعية من الفئة الفرعية لعملية عمل غير مستخدم.) كان هذا يعني دائما كصحة نعلية ورسالة للآخرين باستخدام الفئة أو الخدمة ذات الصلة التي لا تكتملها الطريقة.مثل هذا الرمز لم يحدثه أبدا للإنتاج.

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

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