2010-03-09 5 views
8

큰 .NET 메서드가있는 경우 여러 메서드로 나눌 좋은 방법인지 여부를 알고 싶습니다. 내 우려 사항은 다음과 같습니다. 1 - 한 번만 호출하면 메서드를 만드는 것이 있습니까?
2 - 내 수업에서 개인 메서드를 호출하는 경우 인스턴스 변수를 사용하지 마십시오. 이 좋은 또는 나쁜 연습인가? 예를 들어 :.NET에서 큰 메서드 리팩터링

var a, b; 
public void TestMe 
{ 
    FirstTest(a,b); 
} 
private void FirstTest(paramA, paramB) 
{ 
     //code here with passed in parameters 
} 

//instead of: 
private void FirstTest() 
{ 
     //code here with instance variables a,b 
} 

편집 : 첫 번째의 방법을 만들 수있는 가능성이 가장 높은하지 않는 이유가, 예를

답변

5

1 - 한 번만 호출되는 경우 메서드를 만드는 요점이 있습니까?

예, 여러 가지 이유가 있습니다. 아마도 해독 가능성이 가장 중요합니다. 메소드를 분리 할 수있어 읽기 쉽고 유지 보수하기 쉬운 방법을 만들 수 있다면 꼭 그렇게하십시오.

방법이 너무 길면 레거시 코드를 리팩터링 한 경험으로 반복해서 나타나는 코드 조각이 거의 없습니다.이들은 일반적으로 리팩토링 기회를 찾는 최고의 장소입니다. 이러한 조각에 대해 별도의 메서드를 만들면 메서드의 길이가 크게 줄어들 수 있으므로 greating은 가독성을 높입니다.

2 - 내 클래스 내에서 private 메소드 를 호출하는거야, 내가 인스턴스 변수를 사용하지보십시오. 이게 좋을까요 아니면 나쁜 습관입니까?

일반적으로 변수의 범위를 작게 만들 수 있습니다. 너와 마찬가지로 나는 가능할 때마다 매개 변수를 사용하는 경향이있다. 메소드가 자체 매개 변수에 대한 참조 만 갖는 경우, 메소드에 대해 추론하고, 메소드의 정확성을 검증하고, 올바르게 사용할 수있게됩니다. (방법은 어떤 상태를 이렇게 수정할 수없는 경우에, 그 유지 보수 혜택 당신에게 많은을 산다.)

을하는 방법의 목적은 최고의 객체의 필드를 조작하여 제공하는 경우, 그 완벽하다 받아 들일 수 있고, 많은 경우에, 생존 할 수 없다. 그러나, 당신이 말했듯이, 이것은 공공의 방법에 특히 중요합니다. 큰 메소드를 작은 메소드로 리팩토링 할 때, 새로운 메소드에서 멤버 필드에 직접 액세스하는 경우는 거의 없습니다. 이는 주로 프로그램의 동작을 더 쉽게 이해할 수있게하기위한 것입니다.

이러한 방식으로 리팩터링하는 경우 필드에 액세스하지 않는 경우 static으로 새 메서드를 표시해야합니다. 이렇게하면 의도가 명확 해집니다.

1
  1. 코드 조각 한 번만 호출 할 것입니다 경우 글로벌 대체 장소. 그러나 그것이 개인적인 방법이고 분리 된 기능 (별도의 관심사)으로 활용되고 있다면, 그것을 분리하는 것이 좋은 생각 일 수있다. 하나의 엄청난 방법을 피하기 위해 이렇게하고 싶을 것입니다. 예를 들어 코드 조각에서 한 번만 검색을 수행하면 검색 기능이 별도의 기능이므로 검색을 분할하고 싶습니다. (아주 나쁜 예입니다. 누군가가 더 좋은 예가 있다면, 편집 해 주시기 바랍니다.) 전체 시스템에서 액세스 할 수 없다면 변수가 TRUEY가 아닙니다. 전역 변수를 피하는 이유는 변수의 범위가 매우 크기 때문에 코드를 디버깅하고 작업하는 것이 매우 어렵 기 때문입니다. 대신 지역화 된 변수를 더 많이 갖고 함수/메서드에 필요한 변수를 전달하고 호출자 함수가 필요합니다. 이렇게하면 데이터가보다 현지화되어 결국 궁극적으로 코드를 읽고 관리하기가 더 쉬워집니다.

9

첫 번째 질문과 관련하여 방법의 복잡성을 줄이는 것은 큰 방법을 작은 방법으로 분해하는 데 충분한 이유입니다. 작은 방법은 하나의 큰 방법보다 훨씬 이해하기 쉽습니다. 제대로 완료되면, 방법을 논리적으로 일관된 작업 단위로 분리함으로써, 많은 작은 방법들이 거의 모든 경우에 하나의 큰 방법보다 선호됩니다. 그것이 그 관점에서 더 이상 받아 들일 수없는 지점까지 당신의 성과에 영향을주는 경우가 아닐 수도있는 유일한 조건입니다.

두 번째 질문과 관련하여 @Jason이 지적했듯이 클래스 내에서 전역 변수가 아닌 인스턴스 변수를 사용하고 있습니다. 어떤 실천이 바람직한지는 그 방법의 맥락에 달려 있다고 말할 수 있습니다. 물론이 메소드가 많은 문맥에서 재사용 될 수 있다면 그 중 일부만 인스턴스 변수에서 작동하므로 매개 변수화해야합니다. 인스턴스 변수 만 사용하는 경우 매개 변수를 사용하지 않을 수도 있고 나중에 필요에 따라 유용성을 위해 리팩터를 사용할 수도 있습니다.

는 C#에서, 나는 또한 더 그것을 사용하는 방법의 속성을 분리하는 예를 특성 이상 필드를 사용하여 선호 할 것입니다.

+4

Bob 삼촌의 책 "Clean Code"는 방법을 설명하는 데 도움이됩니다. 엄지 손가락의 간단한 규칙은 코드에서 주석을 사용할 수 있다고 생각한다면 아마도 잘 명명 된 메서드를 대신 사용할 수 있습니다. –

4

Clean Code (우수 도서)에서 인용하려면 방법이 한 가지만하고 한 가지만 수행해야합니다. 한 가지 방법으로 여러 가지 일을한다면, 아마도 그 논리를 다른 방법으로 추출해야한다는 것을 의미합니다. 코드를 따르는 것이 훨씬 쉬워집니다. 그래서 내가 말 할텐데

질문 1 : 예.

질문 2 : 일반적으로 나는 이 절대적으로 일 필요가없는 한 글로벌 변수를 갖는 것은 나쁜 습관이라고 생각합니다. 공개 getter에 대해 private 속성 (인스턴스 변수)을 사용하는 일반적인 질문에 대해서는 getter를 사용하여 어떤 이점도 보이지 않습니다. 예를 들어, 고려 :

function someFunc() { 
    anotherFunc(this.a, this.b); 
} 

function anotherFunc(int paramA, int paramB) { 
    //do stuff with paramA and paramB 
} 

당신이 this를 사용하여 인스턴스 변수를 참조 할이있을 것이다 어떤 점에서

function someFunc() { 
    anotherFunc(); 
} 

function anotherFunc() { 
    //do stuff with this.a and this.b 
} 

대. 그래서 나는 이점을 보지 못합니다. 결국, 안에 클래스가 있으므로 비공개 멤버에 대한 완전한 액세스 권한이 있습니다.