2013-05-03 4 views
1

의 우리가 적어도 하나는 다소 복잡한 성격 인의 그것에 몇 가지 방법과 클래스가 있다고 가정 해 봅시다 : 함수를 올바르게 구조화하는 방법은 무엇입니까?

class Example { 
    public function Example() 
    { 
    } 

    private function complexFunction():void 
    { 
     //Do this 
     //And do that 
     //And of course do that 
     //and do not forget that 
    } 

    private function otherImportantFunction():void 
    { 
     //Do something 
    } 

    //[...] 
} 

지금 "complexFunction는()"꽤 길고도 조금 복잡 성장했다. 따라서 가독성을 높이려면 작은 하위 함수에서 "complexFunction()"을 분리하는 것이 좋습니다. 나는 보통 이런 식으로 작업을 수행합니다
class Example { 
    public function Example() 
    { 
    } 

    private function complexFunction():void 
    { 
     doThis(); 
     doThat(); 
     andOfCourseDoThat(); 
     andDoNotForgetThat(); 
    } 

    private function doThis():void 
    { 
     //Do This 
    } 

    private function doThat():void 
    { 
     //Do That 
    } 

    private function andOfCourseDoThat():void 
    { 
     //And of course do that 
    } 

    private function andDoNotForgetThat():void 
    { 
     //And do not forget that 
    } 

    private function otherImportantFunction():void 
    { 
     //Do something 
    } 

    //[...] 
} 

하지만 지금 클래스가 이미 그의 유일한 목적 사소한 기능에 익사에 의한

는 내부에 한 번 전화를받을 것입니다 "complexFunction()". 이 "분할 (split-up)"을 좀 더 자주 수행하면 모든 도우미 기능들간에 중요한 방법을 찾아내는 것이 어려워집니다.

적어도이 모든 일은 항상 저에게 일어나며 선명도는 실제로 그것을 겪고 있습니다. 그 딜레마를 해결할 방법을 안다면 저를 궁금하게 생각하십니까? 분명히 이것을 처리하는 방법 또는 '우수 사례'가 있습니까? 나는 그 목적을 위해 전혀 새로운 클래스를 만들지 않고, 함수를 함께 그룹화하거나, 보조 함수를 상위 클래스에 종속시키는 방법을 꿈꾸고있다. 아니면 어떻게 끝났습니까?

+1

재사용 가능한 코드 용 함수 만 쓰려고합니다. 함수가 "마스터 함수"에 의해 한 번만 호출 된 경우 함수가있는 것이 좋습니다. 복잡한 함수를 주석 처리하면 읽는 것이 더 쉬울 수도 있습니다 ... –

+0

그리고 "마스터 함수"내부에서 두 번 이상 호출 되었습니까? –

+0

그럼 분명히 코드를 복제해서는 안되지만 함수를 작성해야합니다 ... –

답변

0

하나의 큰 기능을 여러 기능으로 나눌 수 있습니다. 제공된 경우 value++ 대신 AddOne()과 같은 것이 아닙니다. 특히 더 자주 반복되는 기능은 유용 할 수 있습니다.

클래스가 여러 함수 (또는 긴 함수)로 채워지면 클래스의 기능을 재고하는 것이 좋습니다. 한 과목을 대상으로하는 수업을 유지하십시오. 예를 들어, 클래스에 대한 좋은 아이디어는 사용자와 관련된 것입니다. 사용자 생성 또는 삭제와 같은 작업을 수행 할 수 있습니다. 사용자를 예를 들어 자신이 소유 한 차량과 일치시키는 경우에도 거기에서 수행 할 수 있습니다. 그러나 Cars를 저장하거나 제거하는 User 클래스에는 함수를 포함하지 마십시오. 다른 클래스에 대해 저장하십시오.

그런 경우 Example 클래스에는 User 클래스와 Car 클래스의 인스턴스가 있습니다. 이 경우 다음과 같이 효율적으로 프로그래밍하고 있습니다.

일을 정리하려고 할 때도 일부 클래스는 커지는 경향이 있습니다. 그것은 결코 나쁜 것이 아니며 긴 기능도 아닙니다. 분리 된 것들을 유지하려고 시도하고 코드를 너무 많이 반복하지 않도록하고 (그 기능을 만들기 위해) 서로 다른 클래스들과 관련된 것들을 유지하려고 노력하십시오.

+0

좋은 조언입니다! 그리고 실제로 저는 저의 커리큘럼에서 몇 가지 클래스를 만들 수있었습니다. 그들의 연대기가 아닌 다른 방법으로 당신의 어셈블리에 구조를 가져올 수있는 방법이 정말로 없다면, 각각의 책임이 적은 클래스를 갖는 것이 가장 좋습니다. –

0

나는 단순한 기능으로 나누면 복잡한 코드의 가독성이 향상된다는 것을 개인적으로 발견했다. 내가 제시 한 코드에서 실제로 얻지 못하는 것은 이러한 간단한 함수가 하나의 함수로 결합되는 방식입니다.이 함수는 전혀 반환하지 않는 함수 (단지 몇 가지 효과가있는 것처럼 보입니다)에서만 작동하는 것처럼 보입니다. 좀 더 자연스러운 방법으로 단순한 함수에서 복잡한 함수를 만드는 것은 함수의 구성, 대소 문자 구별 또는 다른 어떤 방법을 통해 이루어질 것입니다 ...

+0

예, 동의합니다. 제 예제는 매우 단순합니다. 의도는 단지 많은 기능을 갖는 것이 중요한 항목을 도우미 기능과 구분하는 것을 점점 더 어렵게한다는 것을 시각적으로 증명하는 것이 었습니다. 따라서 필자는 분리 함수를 사용하되 명확성에 도움이되는 경우 클래스를 더 자주 분할합니다. 답변 주셔서 감사합니다 :). –

0

함수가 "길다"는 것이 더 복잡하지 않기 때문에, 어떤 것은 단지 많은 코드를 사용합니다.
예를 들어 보자은 "긴"

var loader:Loader = new Loader(); 
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, completeHandler); 
loader.contentLoaderInfo.addEventListener(HTTPStatusEvent.HTTP_STATUS, httpStatusHandler); 
loader.contentLoaderInfo.addEventListener(Event.INIT, initHandler); 
loader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler); 
loader.contentLoaderInfo.addEventListener(Event.OPEN, openHandler); 
loader.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS, progressHandler); 
loader.contentLoaderInfo.addEventListener(Event.UNLOAD, unLoadHandler); 
loader.contentLoaderInfo.addEventListener(MouseEvent.CLICK, clickHandler); 
var request:URLRequest = new URLRequest(url); 
loader.load(request); 

인가? 예
Cyclomatic Complexity가 높습니까? no
여기에서 무슨 일이 벌어지고 있는지 쉽게 이해할 수 있으며 따르기가 쉽습니다.
그리고 CC 값이 낮은 함수/메소드는 항상 읽기 쉽습니다.
반면에 높은 (+20) CC 값을 갖는 방법은 적색 플래그를 올려야합니다.
메서드를 별도의 도우미 메서드로 분할해도 현재의 문제는 제거되지 않으며 컴파일러의 경우 실제로 악화됩니다. 이제는 한 번만 호출 될 메서드에 할당 된 리소스를 할당해야하기 때문입니다. 어림짐작은 20의 CC 값 이상으로 올라가지 않도록하는 것입니다.
20 세 이상이되면 클래스 디자인이 단단히 결합되면서 다시 생각해 볼 때입니다.

아마도 질문해야 할 질문이 있습니다.

How can I reduce the Cyclomatic Complexity of this? 
+0

글쎄, 아마도이 코드를 읽을 때 이해하기 어려운 것은 아니지만, 더 이상 코드에 익숙하지 않다면 찾고자하는 것을 찾기가 더 어려워 질 것입니다. 그래서 나는 여전히 그것을 분리하고 'loadContentAndSetupEventListeners()'와 같은 자체 설명 기능으로 대체합니다. 음, 어쩌면 그 특정 사례 - 케이스에서 너무 많은 이해가되지 않습니다,하지만 generelly 내가 정말 그것을 읽고 싶을 때 코드를 읽는 것을 선호합니다. –

관련 문제