2011-09-15 2 views
4

좋은 스타일 (코드 북 정리)은 메서드의 이름이 메서드의 기능을 설명해야한다고 말합니다. 그래서 예를 들어 나는 이름이 뭔가해야한다, 그것을 저장하는 데이터베이스에서 주소를 확인하는 방법이 있고, 이메일을 보내는 경우 등 verifyAddressAndStoreToDatabaseAndSendEmail(address);긴 메서드의 메서드 이름

또는

verifyAddress_StoreToDatabase_SendEmail(address);

내가 나눌 수 있지만, 그 3 가지 방법에서 그 기능을, 나는 여전히 이러한 3 가지 방법을 호출하는 방법이 필요합니다. 그래서 큰 메소드 이름은 필연적입니다.

그리고 명명 된 메소드는 분명히 메소드가 수행하는 것을 설명하지만, IMO는 이름이 매우 매우 클 수 있기 때문에 읽기 쉽지 않습니다. 어떻게 해결하겠습니까?

편집 : 어쩌면 내가 같은 메소드 이름을 분해 유창한 스타일을 사용할 수 있습니다

verifyAddress(address).storeToDatabase().sendEmail();

하지만 난 호출의 순서를 보장 할 수있는 방법이 필요하다. 어쩌면 상태 패턴을 사용하면 코드가 커지게됩니다.

+3

당신은 3 가지 일을합니다. 좋아,이 세 단계를 호출하여 무엇을하는지 설명하는 이름에 대해 생각해보십시오. 이름이 있습니까? 메서드 이름은 ok입니다. –

+0

Hernan에 동의합니다. 여러 단계를 거치면 항상 전체적인 목표가 있습니다. 구체적이지 않은 경우 항상 처리와 같은 일반적인 목표가 있습니다. processAddress (address) 메소드는 각각의 메소드에서 3 단계로 호출 할 수 있습니다. –

+0

하지만 'processAddress'는 매우 일반적이므로 IMO는 메소드의 사용법에 대해 독자에게 아무 것도 말하지 않습니다. – ejaenv

답변

2

한 가지 방법으로 3 가지를해서는 안됩니다. 따라서 3 가지 방법으로 작업을 분할 : 난 당신이 더 높은 방법으로 다음 언급으로이 3 개 개의 작은 방법을 확인하는 것입니다 접근 방법

  1. verifyAddress
  2. storeAddress
  3. sendEmail
+1

하지만 내가 말했듯이, 어느 시점에서이 세 가지를 부르는 것이 필요할 것입니다. (단일 책임 원리는 메서드가 한 가지만 수행해야한다는 것을 말하지만,이 한 가지는 추상화 수준을 의미합니다.) – ejaenv

6

을 그 3 개의 작은 것들을 호출합니다. 나는 왜 그 세 가지를해야하는지 "왜"후에 이름을 짓습니다.

왜 이러한 단계를 수행해야하는지 정의하고 메서드 이름의 기초로 사용하십시오.

+0

이 제안을 해결하기 위해 세 가지 개인 메서드를 호출하는 public 메서드 인 SaveAddress를 사용했습니다. :'verifyAddress','insertAddress','sendEmail'. –

+0

@Rick이지만 'SaveAdress'라는 이름은 이메일을 보내는 부작용에 대해서는 아무 말도하지 않습니다. – ejaenv

+1

@ejaenv 한 가지 방법은 'HandleSaveAddressRequest' 또는 이와 비슷한 이름을 지정하는 것입니다. 이유가 이해가되지 않는다면, 때로는 사건을 다루는 것 같은 목적이나 행동을 설명하는 것이 대안의 해결책이 될 수 있습니다. – JamesEggers

2

나는 나의 이전 코멘트에 대하여 후속 조치를하고있다. 그러나 나는 대답 할 정도로 합리적으로 의견에 합치는 것보다 더 많이 여기있다.

자세한 내용은 메서드 이름이 아닌 설명서에 나와 있습니다 (제 의견으로는). 이 방법으로 생각하면 ... SendEmail을 메서드 이름에 넣으면 구현 이름이 메서드 이름에 커밋됩니다. 이메일 대신 SMS 또는 트위터를 통해 알림을 전송하는 결정이 내려지면 어떻게 될까요? 메소드의 이름을 변경하고 API를 중단 시키거나 메소드 이름을 사용하여 API 사용자를 오도 할 수 있습니까? 고려해야 할 것.

이름에 메소드의 기능을 유지하려고한다면, 좀 더 일반적인 것을 찾아야 할 것입니다. 아마도 VerifySaveAndNotify(Address address)의 라인을 따라 뭔가. 그런 식으로 메서드 이름을 지정하면 지정하지 않고 무엇을하는지 알 수 있습니다. 의 매개 변수 Address무엇을 확인하고 저장되고 있는지 확인합니다. 이 모든 것이 함께 작동하여 유익하고 유연하며 간결한 메소드 이름을 만듭니다.

0

편집 : 어쩌면 내가 같은 메소드 이름을 분해 유창한 스타일을 사용할 수 있습니다

verifyAddress (주소) .storeToDatabase를().이메일을 보내();

하지만 호출 순서를 보장해야합니다. 어쩌면 상태 패턴을 사용하면 코드가 커지게됩니다.

유창한 스타일로 명령을 정렬하려면 각 단계의 결과가 다음 단계에서 요구되는 기능 만 제공하는 개체가됩니다. 예를 들면 :

public class Verifier 
{ 
    public DataStorer VerifyAddress(string address) 
    { 
     ... 
     return new DataStorer(address); 
    } 
} 

public class DataStorer 
{ 
    public Emailer StoreToDataBase() 
    { 
     ... 
     return new Emailer(...); 
    } 
} 

public class Emailer 
{ 
    public void SendEmail() 
    { 
     ... 
    } 
} 

이것은 당신이 매우 세분화 된 디자인을 만들 필요 재사용성에 대한 클래스를 최적화하려는 경우에 유용하지만, 대부분의 상황에서 디자인 과잉 될 가능성이 높습니다. 다른 사람들이 전체 프로세스가 나타내는 것으로 보이는 이름을 선택한다고 말한 것이 더 나을 것입니다. 간단히 "StoreAndEmail"이라고 부르면 데이터가 어떤 대상에 커밋되기 전에 일상적으로 수행하는 것으로 가정합니다. 이름이 길어도 괜찮 으면 간단히 설명하고 긴 이름이 필요하다는 것을 받아 들여야합니다. 결국, 그것은 당신에게 어떤 비용도 들지 않지만 확실하게 코드를 의도적으로 더 구체적으로 만들 수 있습니다.