2010-03-13 6 views
1

유니 (uni) 이후로, 저는이 언어에 전적으로 헌신하지는 않았지만 3 년 동안 자바로 프로그래밍을 해왔습니다. 그럼에도 불구하고 꽤 많은 시간을 보냈습니다. 두 가지 모두를 이해합니다. 어떤 스타일을 선호하는지 궁금합니다.중첩 된 메서드와 "파이프 된"메서드가 더 좋을까요?

주요 방법에 집중하십시오. 가장 관심이있는 부분입니다.

public class Test 
{ 
    public static void main(String[] args) 
    { 
     System.out.println(getAgent().getAgentName()); 
    } 

    private static Agent getAgent() 
    { 
     return new Agent(); 
    } 
} 
class Agent 
{ 
    private String getAgentName() 
    { 
     return "John Smith"; 
    } 
} 

나는 그들은 내가 두 번 "존 스미스"를보고 동일한 출력을 가지고 그런 다음

public class Test 
{ 
    public static void main(String[] args) 
    { 
     System.out.println(getAgentName(getAgent())); 
    } 

    private static String getAgentName(Agent agent) 
    { 
     return agent.getName(); 
    } 

    private static Agent getAgent() 
    { 
     return new Agent(); 
    } 
} 
class Agent 
{ 
    public String getName() 
    { 
     return "John Smith"; 
    } 
} 

처럼 중첩 된 메소드 호출과 매우 기쁘게 생각합니다.

이 작업을 수행하는 한 가지 방법이 다른 것보다 우수한 성능 또는 다른 장점을 가지고 있는지 궁금합니다. 개인적으로 나는 후자를 선호한다. 왜냐하면 중첩 된 방법에 대해 먼저 어느 것이 먼저 시작하는지 그리고 어떤 것이 뒤인지를 확실히 말할 수 있기 때문이다.

위의 코드는 하나의 견본이지만, 지금 제가 작업하고있는 코드는 훨씬 더 복잡하고 미로 같은 것입니다 ... 그래서 두 가지 스타일을 전환하면 종종 짧은 시간 안에 머리를 터뜨릴 수 있습니다.

+0

... * 재미 * 괄호 스타일. .. –

+0

@ 그렉 : 나는 중괄호 스타일을 알고 있지 않다. 지금은 그럴 것이다. –

+2

@Michael Mao : 아무것도 찾지 못하면 "Java 프로그래밍 언어의 코드 규약", 특히 6.4 절을 참조하십시오. http://java.sun.com/docs/codeconv/html/CodeConvTOC.doc.html –

답변

2

"busines logic"(데이터 관련 작업)으로 데이터 검색을 혼합하기 때문에 후자의 스타일을 권장합니다. 첫 번째 접근 방식을 사용하면 데이터로 수행하려는 작업에 높은 자유도를 유지할 수 있습니다 (예 : 당신이 적어도 일이 방법을 명확하게 이루어집니다 무엇을 설명하는 이름을 가진 함수 이름을 선택한 경우

public static void main(String[] args) 
{ 
     System.out.println(getAgent().getAgentName()); 
     System.err.println(getAgent().getAgentName()); 
     someTextArea.append("The agent name is: " + getAgent().getAgentName()); 
     // etc 
} 

, 예를 들어,

private static void getAgentNameAndPrintIt(Agent agent) 
{ 
    System.out.println(agent.getName()); 
} 
+0

좋은 지적! 이제 getAgent()를 "agent"와 같은 더미 객체 참조로 처리하면 getAgentName()이 확실히이 객체에 속한 메소드입니다. 내 스타일과는 정반대이지만 다른 스타일보다 분명히 나을 것이므로 이제 마음을 바꿀 것입니다. –

1

나는 당신이 가장 단순하고 명료하다고 믿는 것을 고집 할 것을 제안합니다. 그들이 필요로하는 것보다 더 복잡한 것을 만들지 마십시오. 더 명확하게하지 않는 복잡성을 추가하지 마십시오.

"아무것도 없을 때 완전이 달성 완벽 추가 남아 있지,하지만이있을 때 아무것도 빼앗아 남아 있지"- 앙투안 드 생 텍쥐페리을

내가 때까지, 멀리 일을 계속 복용 것 중 하나 아무튼 ' 똑같은 일을하지 않으면 선명도가 떨어집니다.

다른 방식으로 말하십시오. 다음은 똑같은 일을합니다. 더 명확하게하기 위해 무엇을 추가할까요?

class Test{public static void main(String[]args){System.out.println("John Smith");}} 

감사합니다. @Michael Mao.

+0

좋은 지적입니다. 코드 예제에서 벗어날 수있는 유일한 방법은 최초의 "공개"입니다. –

2

게시 한 첫 번째 예에서는 문제의 여러 부분을 다른 방법으로 구분합니다. getAgentName 메서드의 두 번째 예제에서는 .getName()에 대한 호출과 출력 할 위치 (System.out.println)를 모두 결합합니다. 아마도 첫 번째 스타일을 선호 할 것입니다. 호출자가 무엇을 인쇄할지 결정할 수있는 유연성이 가장 높기 때문입니다.

+0

참으로 좋은 지적입니다. 실제로 저는 모든 사람들이 요점에 집중할 수 있도록 명확한 일을했습니다. 실제 코드는 다른 사람이 수행했으며, 내가보고있는 API와 샘플 코드는 읽기가 어렵습니다. 그래서 그 질문을 얻었습니다. –

+0

두 번째 코드를 조금 변경했는데 첫 번째 스타일이 지금도 여전히 좋을까요? –

2

필자는 첫 번째 스타일을 선호합니다. 이는 구현 세부 사항을 책임있는 개체에 가깝게 유지합니다. 두 번째 스타일은 더 많은 "유틸리티 메소드"를 작성하여 객체를 처리하지만 함수를 실행하는 클래스의 객체는 포함하지 않습니다.

에이전트 클래스는 테스트 클래스에 getAgentName() 방법을 소개하고, 그 getAgentName 방법을 정의 곳의 지식이 필요하지 않습니다 테스트 클래스는 코드베이스에 불필요한 복잡성을 추가하고, 그것으로 작업 할 때 미래 테이너가 별도의 방법을 확인해야 . 다른 주에

은, 에이전트 클래스는 getAgentName() 방법의 맥락이기 때문에 문맥에서 알 수있는 바와 같이 나는 getName()로 단순화 것 :의

System.out.println(getAgent().getName()); 
+0

좋은 지적. 내가 직접 그 메소드 이름을 만들었 기 때문에 나는 모두가 "가짜"라고 물어보기도 전에 정말로 더 잘 만들었어야했다. :) –

관련 문제