문제

나는 다음과 같은 정규 IF 진술에 대한 대안을보고 싶어합니다.

if(x)
     do a;
if(y)
     do b;
if(z)
    do c;

당신이 보시다시피, 진술이 별도이고 다른 조건이없는 경우. XYZ는 완전히 분리 된 조건이므로 스위치가 맞지 않습니다.

도움이 되었습니까?

해결책

"Truely Object Oriented"답변 중 하나는 "규칙"(조건 () 및 Action () 메소드와 함께 인터페이스를 정의하고 3 개의 구현을 작성하고 컬렉션에 넣은 다음 일반적으로 다음과 같이 반복하는 것입니다.

List<Rule> rules = .... ; // your 3 rules initialized here somehow
for(Rule r : rules) {
  if(r.condition()) {
    r.action();
  }
}

이것은 단지 3이 아닌 300 개의 규칙/조건이있는 경우 훨씬 더 의미가 있습니다.

Java8에서는 규칙이 CPU 집약적 인 경우 대신이 작업을 수행 할 수 있습니다.

rules.parallelStream().filter(Rule::condition).forEach(Rule::action);

다른 팁

짧은 대답은 예입니다.

조건부 evluation 및 분기를 위해 IF를 사용하지 않아도되는 시간이 몇 시간이 있습니다. 그리고 그들은 적절한 순간을 가지고 있습니다.

  1. 동작이 초기 값에 의존 할 때 다형성
  2. 가능한 초기 값을 알고 있고 반환 값과 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 ];
    
  3. 가능한 초기 값을 알고 있고 사용할 함수/분기와 1 ~ 1의 상관 관계가있는 경우에 의뢰 된 분기. (Java가 아님)

    // 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 ](); `
    
  4. 직접 부울 과제.

    우리는 싫어합니다 :

    if (thisCondition == true) {  
      b = true;  
    } else {  
      b = false;  
    }
    

    해야한다:

    b =이 전환;

대안 if-else Java에는 스위치 명령문이 있습니다 조건부 제 3 (?:) 운영자, 어느 누구도 당신이 요구하는 것을 정확하게하지 않습니다 ( if NO 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();
     }
}

IF는 완전히 제거되지는 않지만 무언가로 이동합니다. 이 솔루션은 모든 경우에 적용 할 수있는 것은 아니지만 일부에서는 여러 IFS에 대한 매우 좋은 대안입니다.

여기에 대한 좋은 이야기가 있습니다.
http://misko.hevery.com/2008/12/08/clean-code-talks-inheritance-polymorphism-testing/

이것은 가장 간단합니다. 읽기 쉽지만 효과적입니다 해결책. 여기서 효과적인 대안을보고 놀랄 것입니다.

편집하다

당신은 신청하려고 시도 할 수 있습니다 추출 방법 여러번:

doAIfX();
doBIfY();
doCifZ();

여기서 방법은 다음과 같이 정의됩니다.

void doAIfX() {
    if (!X) {
        return;
    }

    // do 'a'
}

실제로 X, Y, Z 및 A, B, C가 무엇인지에 따라 다릅니다. 때로는 진술이 더 적합한 경우 때때로. 때로는 다형성이 더 적합합니다.

당신은 어딘가에 이것들을 가지고 있어야합니다.

다른 방법으로 제안한대로 현재 방법을 깨끗하게 유지하기 위해 다른 방법으로 리팩토링 될 수 있습니다. 이를 동일하게 재사용 해야하는 경우 세트 여러 곳에서 진술이 있다면 ~할 것 같다 가능해야합니다 데코레이터 패턴.

사용하기에 완벽한 사례처럼 들립니다 폐쇄. 그러나 당신은 필요합니다 그루비 또는 비슷한 것.

어때 ... myanimator (사물, pos, 속도 | computespeed ());

속도 === 한정되지 않은 그러면 ComputesPeed ... 생각합니다.

실제로는 맥락에 달려 있습니다 ...하지만 그렇습니다. 엘스는 그 중 하나 일뿐입니다. 제어 흐름 Java의 진술 :https://docs.oracle.com/javase/tutorial/java/nutsandbolts/flow.html

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top