بديل إذا كان البيان في جافا
-
06-07-2019 - |
سؤال
أنا الغريب أن نرى أي بديل(s) العادية إذا عبارات مثل
if(x)
do a;
if(y)
do b;
if(z)
do c;
حتى ترى كل شيء إذا البيانات منفصلة و أي شرط آخر.من فضلك لاحظ أن X Y Z تماما منفصلة الشروط حتى التبديل لا يصلح.
المحلول
واحد من شأنه أن "حقا وجوه المنحى" الجواب هو تحديد واجهة ل "القاعدة" (مع حالة () والعمل () طرق)، إنشاء 3 تطبيقات، الاشياء لهم إلى مجموعة، ثم أعاد فقط من خلالهم كما بشكل عام في:
List<Rule> rules = .... ; // your 3 rules initialized here somehow for(Rule r : rules) { if(r.condition()) { r.action(); } }
وهذا يجعل الكثير من المعنى إذا كان لديك 300 قواعد / الشروط بدلا من مجرد 3.
في Java8، قد ترغب في القيام بذلك بدلا من ذلك، إذا كانت القواعد هي وحدة المعالجة المركزية مكثفة: م>
rules.parallelStream().filter(Rule::condition).forEach(Rule::action);
نصائح أخرى
الجواب القصير هو نعم.
هناك عدد قليل من الوقت يمكنك تجنب استخدام إذا كان المشروط evluation و المتفرعة كل ذلك معا.وأنها لحظات من ملاءمة.
- تعدد الأشكال, عندما السلوك تعتمد على القيم الأولية
Referrenced المهمة عندما كنت تعرف الأولية الممكنة القيم لديهم من 1 إلى 1 العلاقة مع عودة القيم.قوائم أفضل من المصفوفات على هذا لكن...
// Example: if (a==1) { b=2; } if (a==2) { b=17; } // Becomes int fx(2); // our array of answers fx[0] = 2; fx[1] = 17; b = fx[ a - 1 ];
Referrenced المتفرعة ، عندما كنت تعرف الأولية الممكنة القيم لديهم من 1 إلى 1 العلاقة مع وظيفة/فرع للاستخدام.(على سبيل المثال لا جافا)
// Example: if (a==1) { doSomething1(); } if (a==2) { doSomething2(); } // Becomes function * fx(2); // our array or better still, list of functions fx[0] = &doSomething1; fx[1] = &doSomething2; `fx[ a - 1 ](); `
مباشرة منطقية المهمة.
نحن نكره:
if (thisCondition == true) { b = true; } else { b = false; }
يجب أن تكون:
ب = thisCondition;
البدائل if-else
في جافا هي بيان التبديل ، الشرطي الثلاثي (?:) المشغل ولا تفعل بالضبط ما تطلبه (مقبض فقط if
لا else
).الكود الذي نشر هو أفضل طريقة للقيام بذلك, في رأيي.
استخدم تعدد الأشكال.
interface SomethingDoer {
public void doSomething();
}
class ADoer implements SomethingDoer { ... }
class BDoer implements SomethingDoer { ... }
class CDoer implements SomethingDoer { ... }
public class Main {
public static void main (String[] args) {
SomethingDoer doer = new SomethingDoerFactory(args).getDoer();
doer.doSomething();
}
}
وإذا لم يتم القضاء عليها تماما، ولكن يتم نقله إلى SomethingDoerFactory. هذا الحل لا ينطبق في جميع الحالات، ولكن في بعض منها هو بديل جيد جدا لاستثناءات متعددة.
وهنا هو الحديث لطيفة حول هذا الموضوع:
http://misko.hevery.com / 2008/12/08 / نظيفة رمز محادثات الميراث، تعدد الأشكال اختبار /
هذا هو أبسط ، للقراءة لكنها فعالة الحل.سوف يفاجأ أن نرى بدائل فعالة هنا.
تحرير
يمكنك محاولة تطبيق طريقة استخراج عدة مرات:
doAIfX();
doBIfY();
doCifZ();
حيث طرق محددة:
void doAIfX() {
if (!X) {
return;
}
// do 'a'
}
وانها حقا يتوقف على ما س، ص، ض وأ، ب، ج هي. في بعض الأحيان إذا كانت تصريحات هي أكثر ملاءمة. أحيانا تعدد الأشكال هو أكثر ملاءمة.
سوف تحتاج إلى هذه البيانات إذا في مكان ما.
أنها يمكن أن تكون بتعميل الترميز إلى طرق أخرى للحفاظ على هذا الأسلوب نظيفة ، كما اقترح آخرون.إذا كنت بحاجة إلى إعادة استخدام نفس هذا مجموعة إذا كانت البيانات في عدد من الأماكن ، قد يكون من الممكن استخدام نمط الديكور.
يبدو أن حالة مثالية باستخدام إغلاق.ولكن لهذا كنت في حاجة رائع أو شيئا من هذا القبيل.
ماذا عن...myAnimator(الشيء, نقاط البيع, سرعة | computeSpeed());
إذا كانت السرعة === غير معرف فإنه سيتم ثم computeSpeed...أعتقد.
وانها حقا يتوقف على السياق ... ولكن نعم هو إلا إذا بين آخر واحد من التحكم في التدفق م> بيان في جافا: https://docs.oracle.com/javase/tutorial/java/ nutsandbolts / flow.html