1

해결해야 할 복잡한 작업이있는 경우 실행을 제어하는 ​​한 가지 방법이있는 경우가 종종 있습니다. null 검사, if 문, 형식간에 매핑하는 메서드 호출 등으로 인해이 메서드는 실제로 길어질 수 있으므로 더 쉽게 만들려고 노력하고 있습니다.메소드 호출에 대한 책임 대상은 누구입니까?

예 1 I 체인 첫 번째 방법 간단하게 메소드 호출을 할 수

public class A 
public string MethodA(string stringA) 
{ 
    var fooResult = _fooService.fooMethod(stringA); 

    if(fooResult) 
    var barResult = _barService.barMethod(fooResult); 

    if(barResult) 
    // And so on.. 

    return someResult; 
} 

. 그러나 이렇게하면 fooMethod는 _barService에 종속되고 barMethod는 _someService에 종속됩니다. (연쇄 메소드 호출 위와 같지만와 동일)

예 2 내 코드를 구성하는 방법을

public class B 
public string MethodB(string stringB) 
{ 
    return _fooService.fooMethod(stringB); 
} 

public class Foo 
public string fooMethod(string stringB) 
{ 
    return _barService.barMethod(stringB); 
} 

public class Bar 
public string barMethod(string fooString) 
{ 
    return _someService.someMethod(fooString); 
    // And so on... 
} 

? 어떻게 다른 방법을 호출 할 책임이있는 방법이 될 때 어떻게 생각해야합니까?

즉, I는 다음과 같이 수행해야합니다
class A 
{ 
    Execute() 
    { 
    A(); 
    B(); 
    C(); 
    } 

    method A() 
    { 
    ... 
    } 

    method B() 
    { 
    ... 
    } 

    method C() 
    { 
    ... 
    } 
} 

또는 같은

:

class B 
{ 
    Execute() 
    { 
    A(); 
    } 

    method A() 
    { 
    B(); 
    } 

    method B() 
    { 
    C(); 
    } 

    method C() 
    { 
    ... 
    } 
} 
+0

두 번째 예에서 무엇이 어려움을 겪고 있는지 명확하지 않습니다. 대부분 당신은 클래스 의존성을 최소화하는 것에 관심을 가져야한다. (느슨한 결합에 대해 읽는다.) – Megamozg

+0

@Megamozg 나는 질문을 편집하여 희망을 더 분명히했다. 예제 1과 2는 다른 방식으로 동일한 결과를 얻지 만, 종속성은 다른 장소에서 끝납니다. 예제 1 또는 2를 원하십니까? 예제 1을 선호한다면, 그 방법을 길게 관리하고 어떻게하면 더 많은 일을 할 수 있을까요? – Paul

답변

1

다릅니다.

스테이지가 잘 정의되어 있으면 대부분 순서대로 호출하는 것이 더 편리합니다.

그러나 예를 들어 B가 잘 정의되었지만 A와 C가 B에 의존하는 작업의 시작과 끝인 경우 A 나 C 모두 자체적으로 의미가 있으며 이름을 지정하거나 설명하기가 어렵습니다. 또는 그들이 성공했는지 여부를 평가하기 위해서는 B를 호출하는 단일 메소드에서 A와 C를 결합하는 것이 더 합리적입니다. 각 작업이 특정 작업을 수행하도록 메서드를 분리하면 작업 자체가 많은 의미를 가지지 않으면 작업의 일부만 수행하도록 작업을 분리하지 않아야합니다.

코드를 테스트하는 방법을 고려해야합니다. 하나의 디자인에서 다른 디자인보다 쉽게 ​​사용할 수 있습니다.

코드를 유지 관리하는 방법을 고려하십시오. 여기서 코드를 쉽게 이해할 수 있지만 버그를 수정하거나 기능을 향상시키기 위해 편집이 필요한지 고려해야합니다. 이 디자인을 통해 최소한의 노력으로 다른 코드에 부작용을 일으키지 않고 실제로 영향을받지 않아야 할 부분을 다시 테스트 할 수 있습니다.

입력 또는 설정에 따라 다른 버전의 B를 호출하려면 나중에 단계 중 하나를 변경해야하는지 생각하십시오.

재사용을 고려하십시오. A가 B를 호출하면 B를 호출하고 싶지 않은 상황에서 A를 재사용 할 수 없으며 다른 설계에서는 A를 다시 사용할 수 있습니다.

항상 순서대로 호출해야합니다 B와 C를 병렬로 호출하여 속도를 최적화합니다 (B에서 C를 호출하면 허용되지 않습니다).

B가 실패해도 여전히 C를 호출해야합니다 (사실 일 가능성이 높기 때문에 대부분의 사람들이 그렇게 말할 수는 없을 것이라고 생각하지만 실제 문제가 무엇인지에 따라 달라집니다.) 별도의 호출을 사용하면 일반적으로 연결하기가 쉽습니다.

A에서 B를 호출하는 대신 인터페이스에서 A를 노출하면되며 B와 C를 비공개로 설정할 수 있습니다. 그러면 B가 A에서만 호출되므로 B가 특정 초기 조건을 테스트하는 것을 피할 수 있고 A가 해당 작업을 수행 한 것에 의존하는 것이 훨씬 쉽습니다.

물론 위의 내용은 답변보다 많은 질문입니다. 실제 작업이 무엇인지에 따라 디자인이 맞을 수도 있기 때문입니다.하지만 위의 고려 사항이 도움이되기를 바랍니다.

0

는 모든 작업에 대한 보편적 인 의사 결정이 없습니다. 기본적으로 메서드를 작성하고 하나의 작업을 구현하려고 노력해야합니다. 적절한 메소드 이름 지정을 사용하면 도움이됩니다 (문제가있는 것처럼 보입니다). 예를 들어 ExampleClass.DoWork() 또는 ExampleClass.ManageObject(object)과 같은 이름은 정확하지 않으며 복잡하고 긴 구현을 유도하지 않습니다.

일반적으로, "시리얼"쉽게 읽을으로 더 바람직 마지막 두 예제의 버전 및 A(), B(), 더 사소한 구현을 가질 가능성이 C(), 그것이 쉬울 것은에게 제대로 이름을 지정합니다.

자세한 조언을 원하시면 Code Review에 코드를 게시하십시오.