밥 삼촌의 Clean Code 원칙을 준수하기 위해 if-else if 문을 편집하려면 어떻게해야합니까?


45

밥 삼촌의 깨끗한 코드 제안을 따르고 특히 방법을 짧게 유지하려고합니다.

그래도이 논리를 단축 할 수는 없습니다.

if (checkCondition()) {addAlert(1);}
else if (checkCondition2()) {addAlert(2);}
else if (checkCondition3()) {addAlert(3);}
else if (checkCondition4()) {addAlert(4);}

나는 else를 제거 할 수 없으므로 전체를 더 작은 비트로 분리하여 "else if"의 "else"가 성능을 향상시키는 데 도움이됩니다. 이러한 조건을 평가하는 것은 비용이 많이 들고 아래 조건을 평가하지 않으면 첫 번째 조건 중 하나를 유발합니다 사실, 나는 그들을 피하고 싶습니다.

의미 적으로 말해서 이전 조건이 충족되면 다음 조건을 평가하는 것은 비즈니스 관점에서 의미가 없습니다.


편집 :이 질문은 if (if else)를 처리하는 우아한 방법 의 가능한 복제물로 식별되었습니다 .

나는 이것이 다른 질문이라고 생각합니다 (당신은 또한 그 질문들에 대한 답변을 비교함으로써 그것을 볼 수 있습니다).

  • 내 질문은 첫 번째 수락 조건이 빨리 끝나는 지 확인하는 것 입니다.
  • 관련 질문은 무언가를하기 위해 모든 조건을 수용 하려고합니다 . (이 질문에 대한이 답변에서 더 낫습니다 : https://softwareengineering.stackexchange.com/a/122625/96955 )

46
이 코드의 맥락에서 실제로 무엇이 잘못 되었거나 불분명 합니까? 어떻게 단축 또는 단순화 할 수 있는지 알 수 없습니다! 조건을 평가하는 코드는 결정의 결과로 호출되는 메소드와 마찬가지로 이미 잘 반영된 것으로 보입니다. 코드를 복잡하게 만드는 아래 답변 중 일부만 살펴보십시오!
Steve

38
이 코드에는 아무런 문제가 없습니다. 읽기 쉽고 따르기 쉽습니다. 더 축소하기 위해해야 ​​할 일은 간접적으로 추가하고 이해하기 어렵게 만듭니다.
26 개

20
코드가 좋습니다. 남은 에너지를 더 짧게 만드는 것보다 생산적인 것에 넣으십시오.
Robert Harvey

5
실제로 4 가지 조건이라면 괜찮습니다. 실제로 12 또는 50과 같은 경우이 방법보다 높은 수준에서 리팩토링하고 싶을 것입니다.
JimmyJames

9
코드를 그대로 유지하십시오. 부모님이 항상하신 말씀을 잘 들으십시오. 길거리에서 아이들에게 과자를 제공하는 아저씨를 믿지 마십시오. @Harvey 재미있게도, 코드를 "개선"하려는 다양한 시도로 인해 코드가 훨씬 더 크고 복잡해지고 읽기 어려워졌습니다.
gnasher729

답변:


81

이상적으로는 경고 코드 / 번호를 자체 방법으로 가져 오는 논리를 추출해야한다고 생각합니다. 따라서 기존 코드가 줄어 듭니다.

{
    addAlert(GetConditionCode());
}

GetConditionCode ()가 조건 확인을위한 논리를 캡슐화했습니다. 마법의 숫자보다 Enum을 사용하는 것이 좋습니다.

private AlertCode GetConditionCode() {
    if (CheckCondition1()) return AlertCode.OnFire;
    if (CheckCondition2()) return AlertCode.PlagueOfBees;
    if (CheckCondition3()) return AlertCode.Godzilla;
    if (CheckCondition4()) return AlertCode.ZombieSharkNado;
    return AlertCode.None;
}

2
당신이 묘사 한 것처럼 캡슐화 할 수 있다면 (그렇지 않다고 생각하면 OP는 단순성을 위해 변수를 남기지 않는다고 생각합니다), 코드 자체는 훌륭하지만 코드 인체 공학과 약간의 가독성을 추가하지는 않습니다. 1
opa

17
그 경고 코드로, 나는 한 번에 하나만 반환 할 수있는 코드 감사합니다
조쉬 부

12
이것은 OP의 언어로 사용 가능한 경우 switch 문을 사용하기에 완벽한 것으로 보입니다.
Frank Hopkins

4
특정 상황에 대한 많은 정보를 제공 할 필요없이 여러 상황에서 유용하도록 작성 될 수있는 경우 오류 코드를 새 메소드로 가져 오는 것을 추출하는 것이 좋습니다. 실제로 가치가있을 때 절충점과 손익분기 점이 있습니다. 그러나 종종 유효성 검사 순서가 작업에 따라 다르므로 해당 작업과 함께 유지하는 것이 좋습니다. 그러한 경우 코드의 다른 부분에 수행해야 할 작업을 알려주는 새로운 유형을 발명하는 것은 바람직하지 않은 안정기입니다.
PJTraill

6
이 재 구현의 한 가지 문제는 함수 addAlert가 가짜 경보 상태를 확인해야 한다는 것 AlertCode.None입니다.
David Hammen

69

중요한 측정은 절대 크기가 아니라 코드의 복잡성입니다. 다른 조건이 실제로 단일 함수 호출이라고 가정하면 작업이 표시된 것보다 복잡하지 않은 것처럼 코드에 아무런 문제가 없다고 말할 수 있습니다. 그것은 이미 가능한 한 간단합니다.

"단순화"하려는 시도는 실제로 문제를 복잡하게 만듭니다.

물론 다른 사람들이 제안한대로 else키워드를 a return로 대체 할 수 있지만 이는 복잡성의 변화가 아니라 스타일의 문제 일뿐입니다.


곁에:

내 일반적인 조언은 절대 깨끗한 코드 규칙에 대해 종교적 관계를 가지지 않는 것입니다. 인터넷에서 보는 대부분의 코딩 조언은 적절한 맥락에서 적용되는 경우 좋지만, 모든 곳에서 동일한 조언을 적용하면 엔트리를 얻을 수 있습니다. IOCCC . 요령은 항상 인간이 코드를 쉽게 추론 할 수 있도록 균형을 유지하는 것입니다.

너무 큰 방법을 사용하면 망하게됩니다. 너무 작은 기능을 사용하면 망하게됩니다. 삼항 표현을 피하십시오. 어디에서나 삼항식을 사용하면 망할 수 있습니다. 한 줄 함수를 요구하는 장소와 50 줄 함수를 요구하는 장소가 있음을 인식하십시오 (예, 존재합니다!). 장소가 있다는 것을 실현하는 대한 호출 if()장소가 문 것을 그에 대한 호출 ?:연산자입니다. 귀하의 처분에 따라 완전한 무기고를 사용하고 항상 가장 적합한 도구를 사용하십시오. 이 조언에 대해서도 종교적 태도를 취하지 마십시오.


2
else if내부 를 바꾸고 return간단한 if것을 제거 else하면 코드 를 읽기가 더 어려워 질 수 있다고 주장합니다 . 코드가이라고 말하면 else if다음 블록의 코드가 이전 코드가 실행되지 않은 경우에만 실행됩니다. 무스도없고 소란도 없습니다. 평범한 경우 이전의 실행 여부에 관계없이if 실행되거나 실행되지 않을 수 있습니다 . 이제 이전 블록을 구문 분석하여 블록으로 끝나는 것을 알기 위해 약간의 정신적 노력을 기울여야합니다 . 차라리 비즈니스 논리를 파싱하는 데 정신적 인 노력을 기울이고 싶습니다. return
CVn

1
나는 작은 일이지만 적어도 나에게는 else if하나의 의미 단위를 형성 한다는 것을 알고 있습니다. (컴파일러의 단일 단위 일 필요는 없지만 괜찮습니다.) ...; return; } if (...; 여러 줄로 퍼져 있다면 키워드 pair 만 보아서 직접 수행 할 수있는 것이 아니라 실제로 수행중인 작업을 확인해야합니다 else if.
CVn

@ MichaelKjörling Full Ack else if. 특히 체인 형태가 잘 알려진 패턴이기 때문에 구조물을 선호합니다 . 그러나 형식의 코드는 if(...) return ...;잘 알려진 패턴이므로 완전히 비난하지는 않습니다. 제어 흐름 논리는 두 경우 모두 동일하며 if(...) { ...; return; }사다리를 자세히 살펴보면 실제로 else if사다리 와 동등하다는 것을 알 수 있습니다. 나는 단일 용어의 구조를보고, 그 의미를 유추하고, 그것이 모든 곳에서 반복된다는 것을 깨닫고, 무슨 일이 일어나고 있는지 알고 있습니다.
cmaster

자바 스크립트 / Node.js를에서오고, 일부는 사용하는 "벨트와 멜빵"코드를 사용하는 것이 모두 else if return . 예 :else if(...) { return alert();}
user949300

1
"그리고이 조언에 대해서도 종교적인 태도를 취하지 마십시오." +1
Jared와 같은 단어

22

이것이 주어진 경우에 대해 평범한 if..else보다 '더 나은'것인지 논란의 여지가 있습니다. 그러나 당신이 경우 원하는 뭔가를 시도하는 다른 사람이 그 일을하는 일반적인 방법이다.

조건을 객체에 넣고 해당 객체를 목록에 넣습니다.

foreach(var condition in Conditions.OrderBy(i=>i.OrderToRunIn))
{
    if(condition.EvaluatesToTrue())
    {
        addAlert(condition.Alert);
        break;
    }
}

조건에 여러 작업이 필요한 경우 미친 재귀를 수행 할 수 있습니다

void RunConditionalAction(ConditionalActionSet conditions)
{
    foreach(var condition in conditions.OrderBy(i=>i.OrderToRunIn))
    {
        if(condition.EvaluatesToTrue())
        {
            RunConditionalAction(condition);
            break;
        }
    }
}

분명히 그렇습니다. 논리 패턴이있는 경우에만 작동합니다. 슈퍼 제네릭 재귀 조건부 작업을 시도하면 객체의 설정이 원래 if 문처럼 복잡해집니다. 당신은 당신의 자신의 새로운 언어 / 프레임 워크를 발명 할 것입니다.

그러나 귀하의 예 에는 패턴 있습니다.

이 패턴의 일반적인 사용 사례는 유효성 검사입니다. 대신에 :

bool IsValid()
{
    if(condition1 == false)
    {
        throw new ValidationException("condition1 is wrong!");
    }
    elseif(condition2 == false)
    {
    ....

}

된다

[MustHaveCondition1]
[MustHaveCondition2]
public myObject()
{
    [MustMatchRegExCondition("xyz")]
    public string myProperty {get;set;}
    public bool IsValid()
    {
        conditions = getConditionsFromReflection()
        //loop through conditions
    }
}

27
이것은 if...else사다리를 Conditions목록 구성으로 이동시킵니다 . 순이익은 마이너스인데, 그 구성은 ConditionsOP 코드만큼 많은 코드를 사용하지만 추가 된 간접적 인 가독성에는 비용이 따른다. 깨끗한 코드 사다리를 선호합니다.
cmaster

3
@cmaster 예 나는 정확하게 "그러한 경우 객체 설정은 원래 if 문처럼 복잡 할 것입니다"
Ewan

7
원본보다 읽기 어렵습니다. 어떤 조건이 실제로 확인되는지 확인하려면 코드의 다른 영역을 파헤쳐 야합니다. 코드를 이해하기 어렵게 만드는 불필요한 간접 수준을 추가합니다.
26 개

8
if .. else if .. else .. chain을 술어 및 조치 테이블로 변환하는 것은 의미가 있지만 훨씬 더 큰 예제에만 해당됩니다. 이 테이블은 약간의 복잡성과 간접 성을 추가하므로이 개념상의 오버 헤드를 상각하기에 충분한 항목이 필요합니다. 따라서 4 개의 술어 / 조치 쌍의 경우 간단한 원래 코드를 유지하십시오. 그러나 100이 있으면 테이블과 함께 가십시오. 교차점은 중간에 있습니다. @cmaster, 테이블은 정적으로 초기화 될 수 있으므로 술어 / 액션 쌍을 추가하기위한 증분 오버 헤드는 단순히 이름을 지정하는 한 줄입니다.
Stephen C. Steel

2
가독성은 개인적인 것이 아닙니다. 프로그래밍 대중에게 의무입니다. 주관적입니다. 그렇기 때문에 이와 같은 장소에 와서 프로그래밍 대중의 의견을 듣는 것이 중요합니다. 개인적으로 나는이 예제가 불완전하다는 것을 알았습니다. 어떻게 conditions구성되어 있는지 보여주세요 ... ARG! 주석 속성이 아닙니다! 신 이시여 왜? 아야 내 눈!
candied_orange

7

return;하나의 조건이 성공한 후 사용 하면 모든 elses가 저장 됩니다. return addAlert(1)해당 메소드에 리턴 값이있는 경우 직접 수행 할 수도 있습니다 .


3
물론, 이것은 체인 이후에 다른 일이 발생하지 않는다고 가정합니다 if. 그것은 합리적인 가정 일 수도 있고 다시는 그렇지 않을 수도 있습니다.
CVn

5

나는 때때로 클리너로 간주되는 구조를 보았습니다.

switch(true) {
    case cond1(): 
        statement1; break;
    case cond2():
        statement2; break;
    case cond3():
        statement3; break;
    // .. etc
}

올바른 간격의 3 차도 깔끔한 대안이 될 수 있습니다.

cond1() ? statement1 :
cond2() ? statement2 :
cond3() ? statement3 : (null);

조건과 함수를 포함하는 쌍으로 배열을 만들고 첫 번째 조건이 충족 될 때까지 반복 할 수 있다고 생각합니다. 이것은 Ewan의 첫 번째 대답과 같습니다.


1
삼항은 깔끔합니다
Ewan

6
@Ewan은 깨진 "깊게 재귀 삼항"을 디버깅하는 것은 불필요한 고통이 될 수 있습니다.
dfri

5
그것은 보이는 것처럼 화면에 깔끔한.
Ewan

음, case레이블이있는 함수를 사용하면 어떤 언어가 허용 됩니까?
undercat

1
@undercat 유효한 ECMAScript / 자바 스크립트입니다
zworek

1

@Ewan의 답변의 변형으로 다음과 같은 조건 의 체인을 만들 수 있습니다 ( "플랫 목록"대신).

abstract class Condition {
  private static final  Condition LAST = new Condition(){
     public void alertOrPropagate(DisplayInterface display){
        // do nothing;
     }
  }
  private Condition next = Last;

  public Condition setNext(Condition next){
    this.next = next;
    return this; // fluent API
  }

  public void alertOrPropagate(DisplayInterface display){
     if(isConditionMeet()){
         display.alert(getMessage());
     } else {
       next.alertOrPropagate(display);
     }
  }
  protected abstract boolean isConditionMeet();
  protected abstract String getMessage();  
}

이렇게하면 정의 된 순서로 조건을 적용 할 수 있으며 인프라 (표시된 추상 클래스)는 첫 번째 충족 후에 나머지 검사를 건너 뜁니다.

조건을 적용하는 루프에서 "스킵 (skipping)"을 구현해야하는 "플랫 목록"접근 방식보다 우수합니다.

조건 체인을 설정하기 만하면됩니다.

Condition c1 = new Condition1().setNext(
  new Condition2().setNext(
   new Condition3()
 )
);

간단한 호출로 평가를 시작하십시오.

c1.alertOrPropagate(display);

그렇습니다. 책임 사슬 패턴
Max

4
나는 다른 사람에 대한 이야기 척하지하지만, 문제의 코드는 그 동작에서 바로 읽을 수와 명백한 동안, 나는 것이 되지 는 않는 것과 같은 즉시 분명이를 고려하십시오.
CVn

0

우선, 원래 코드는 끔찍한 IMO가 아닙니다. 꽤 이해하기 쉽고 본질적으로 나쁜 것은 없습니다.

그런 다음 마음에 들지 않으면 @Ewan의 아이디어를 기반으로 목록을 사용하지만 다소 부 자연스러운 foreach break패턴을 제거하십시오 .

public class conditions
{
    private List<Condition> cList;
    private int position;

    public Condition Head
    {
        get { return cList[position];}
    }

    public bool Next()
    {
        return (position++ < cList.Count);
    }
}


while not conditions.head.check() {
  conditions.next()
}
conditions.head.alert()

이제 이것을 선택한 언어로 조정하고 목록의 각 요소를 객체, 튜플 등 무엇이든 만들면 좋습니다.

편집 : 생각만큼 명확하지 않은 것처럼 보이므로 더 자세히 설명하겠습니다. conditions일종의 정렬 된 목록입니다. head현재 조사중인 요소입니다. 처음에는 목록의 첫 번째 요소이며, 매번 next()호출 될 때마다 다음 요소가됩니다. check()alert()있습니다 checkConditionX()addAlert(X)영업 이익에서.


1
(공감하지는 않았지만) 나는 이것을 따를 수 없습니다. 머리 는 무엇입니까 ?
Belle-Sophie

@ 벨 나는 더 자세한 설명을 위해 답변을 편집했습니다. 이완과 같은 생각이지만 while not대신에 foreach break.
Nico

기발한 아이디어의 훌륭한 진화
Ewan

0

이 질문에는 구체적인 내용이 없습니다. 조건이 다음과 같은 경우 :

  • 변경 될 수 있습니다
  • 응용 프로그램 또는 시스템의 다른 부분에서 반복되거나
  • 특정 경우에 수정 됨 (예 : 다른 빌드, 테스트, 배포)

또는 내용 addAlert이 더 복잡한 경우 c #에서 더 나은 해결책은 다음과 같습니다.

//in some central spot
IEnumerable<Tuple<Func<bool>, int>> Conditions = new ... {
  Tuple.Create(CheckCondition1, 1),
  Tuple.Create(CheckCondition2, 2),
  ...
}

//at the original place
var matchingCondition = Conditions.Where(c=>c.Item1()).FirstOrDefault();
if(matchingCondition != null) 
  addAlert(matchingCondition.Item2)

튜플은 c # <8에서 그렇게 아름답 지 않지만 편의를 위해 선택되었습니다.

이 방법의 장점은 위의 옵션 중 어느 것도 적용되지 않더라도 구조가 정적으로 입력된다는 것입니다. 실수로를 잃어 버릴 수는 없습니다 else.


0

가장 좋은 방법은 줄이기 위해 복잡성을 당신이 많은이 곳의 경우를 if->then statements사용하는 것입니다 사전 또는 목록 키 값을 저장하기 위해 (종속 언어) (if 문 값 또는 일부 값) 다음 값 / 함수 결과가.

예를 들어 (C #) 대신 :

if (i > 10) { return "Two"; }
else if (i > 8) { return "Four" }
else if (i > 4) { return "Eight" }
return "Ten";  //etc etc say anything after 3 or 4 values

간단하게 할 수 있습니다

var results = new Dictionary<int, string>
{
  { 10, "Two" },
  { 8, "Four"},
  { 4, "Eight"},
  { 0, "Ten"},
}

foreach(var key in results.Keys)
{
  if (i > results[key]) return results.Values[key];
}

더 현대적인 언어를 사용하는 경우 더 많은 논리 를 저장하고 단순히 값 (c #)을 저장할 수 있습니다 . 이것은 실제로 인라인 함수 일 뿐이지 만 논리가 나쁘게 인라인으로 배치 해야하는 경우 다른 함수를 가리킬 수도 있습니다.

var results = new Dictionary<Func<int, bool>, Func<int, string>>
{
  { (i) => return i > 10; ,
    (i) => return i.ToString() },
  // etc
};

foreach(var key in results.Keys)
{ 
  if (key(i)) return results.Values[key](i);
}

0

밥 삼촌의 깨끗한 코드 제안을 따르고 특히 방법을 짧게 유지하려고합니다.

그래도이 논리를 단축 할 수는 없습니다.

if (checkCondition()) {addAlert(1);}
else if (checkCondition2()) {addAlert(2);}
else if (checkCondition3()) {addAlert(3);}
else if (checkCondition4()) {addAlert(4);}

코드가 너무 짧지 만 논리 자체를 변경해서는 안됩니다. 언뜻보기에 네 번의 호출로 자신을 반복하고있는 것처럼 보이며 checkCondition()코드를주의 깊게 다시 읽은 후에는 각각 다릅니다. 올바른 형식과 기능 이름을 추가해야합니다. 예 :

if (is_an_apple()) {
  addAlert(1);
}
else if (is_a_banana()) {
  addAlert(2);
}
else if (is_a_cat()) {
  addAlert(3);
}
else if (is_a_dog()) {
  addAlert(4);
}

코드는 무엇보다도 읽을 수 있어야합니다. Bob 아저씨의 책 몇 권을 읽은 후에는 그가 계속해서 전달하려는 메시지라고 생각합니다.


0

모든 함수가 동일한 구성 요소에 구현되어 있다고 가정하면 흐름의 여러 분기를 제거하기 위해 함수가 일부 상태를 유지할 수 있습니다.

EG : checkCondition1()가되어 evaluateCondition1()이전 조건이 충족되었는지 확인합니다. 그렇다면,에 의해 검색 될 값을 캐시합니다 getConditionNumber().

checkCondition2()될 것 evaluateCondition2()이전 조건이 충족 된 경우 확인할 것이다에. 이전 조건이 충족되지 않으면 조건 시나리오 2를 확인하여로 검색 할 값을 캐싱합니다 getConditionNumber(). 등등.

clearConditions();
evaluateCondition1();
evaluateCondition2();
evaluateCondition3();
evaluateCondition4();
if (anyCondition()) { addAlert(getConditionNumber()); }

편집하다:

이 접근 방식이 작동하기 위해 값 비싼 조건에 대한 검사를 구현하는 방법은 다음과 같습니다.

bool evaluateCondition34() {
    if (!anyCondition() && A && B && C) {
        conditionNumber = 5693;
        return true;
    }
    return false;
}

...

bool evaluateCondition76() {
    if (!anyCondition() && !B && C && D) {
        conditionNumber = 7658;
        return true;
    }
    return false;
}

따라서 수행 할 값 비싼 점검이 너무 많고이 코드의 항목이 개인용으로 유지되는 경우,이 접근 방식은이를 유지 보수하는 데 도움이되고 필요한 경우 점검 순서를 변경할 수 있습니다.

clearConditions();
evaluateCondition10();
evaluateCondition9();
evaluateCondition8();
evaluateCondition7();
...
evaluateCondition34();
...
evaluateCondition76();

if (anyCondition()) { addAlert(getConditionNumber()); }

이 답변은 다른 답변의 대안 제안을 제공하며 4 줄의 코드 만 고려하면 원래 코드보다 좋지 않을 것입니다. 비록 내가 언급 한 시나리오를 감안할 때 이것은 끔찍한 접근 방식이 아니며 (다른 사람들이 말한 것처럼 유지 보수를 어렵게하지 않습니다) (너무 많은 검사, 공용으로 노출 된 주요 기능 만 모든 기능이 동일한 클래스의 구현 세부 사항입니다).


이 제안이 마음에 들지 않습니다. 여러 함수 안에 테스트 로직이 숨겨져 있습니다. 예를 들어 주문을 변경하고 # 2 이전에 # 3을 수행해야하는 경우 코드를 유지 관리하기가 어려울 수 있습니다.
로렌스

아니요 anyCondition() != false. 이전 상태가 몇 가지인지 평가할 수 있습니다.
Emerson Cardoso

1
좋아, 네가 뭘하는지 봤어 그러나 (예를 들어) 조건 2와 3이 모두로 평가 true되면 OP는 조건 3을 평가하기를 원하지 않습니다.
로렌스

내가 의미하는 것은 anyCondition() != false함수 내에서 확인할 수 있다는 것 evaluateConditionXX()입니다. 구현이 가능합니다. 내부 상태를 사용하는 접근법이 바람직하지 않은 경우 이해하지만 작동하지 않는다는 주장은 유효하지 않습니다.
Emerson Cardoso

1
그렇습니다. 저의 반대는 그것이 테스트 로직을 숨길 수 없다는 것입니다. 귀하의 답변 (3 항)에서 회의 조건 1에 대한 점검은 평가 ... 2 () 안에 있습니다. 그러나 고객 요구 사항 등으로 인해 최상위 수준에서 조건 1과 2를 전환하면 조건 1에 대한 검사를 제거하려면 eval ... 2 ()로 이동하고 eval로 이동해야합니다. ..1 ()을 사용하여 조건 2에 대한 점검 추가
로렌스

0

둘 이상의 "else"절은 코드를 읽는 사람이 전체 체인을 통해 관심있는 항목을 찾도록합니다. void AlertUponCondition (조건 조건) {스위치 (조건) {case Condition.Con1 : ... break; case Condition.Con2 : ... 단절; etc ...} 여기서 "조건"은 적절한 열거 형입니다. 필요한 경우 부울 또는 값을 반환하십시오. 다음과 같이 호출하십시오. AlertOnCondition (GetCondition ());

실제로 더 간단 해 질 수 없으며 몇 가지 경우를 초과하면 if-else 체인보다 빠릅니다.


0

코드가 구체적이지 않기 때문에 특정 상황에 대해 말할 수는 없지만 ...

그런 코드는 종종 부족한 OO 모델에 대한 냄새입니다. 실제로는 자체 알림 유형과 관련된 네 가지 유형의 항목이 있지만 이러한 엔티티를 인식하고 각각에 대한 클래스 인스턴스를 작성하는 대신 하나의 항목으로 취급하고 나중에 한 번에 보충하려고 시도합니다. 계속 진행하려면 무엇을 다루어야하는지 알아야합니다.

다형성이 더 적합 할 수 있습니다.

길거나 복잡한 if-then 구문을 포함하는 long 메소드가있는 코드를 의심하십시오. 종종 가상 메소드가있는 클래스 트리가 필요합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.