2010-12-14 1 views
8

접근 대 방법에 필드를 통과, 다음 클래스 주어진는 :자바 스타일/최상의 방법 - 자바에서 직접

public class MyClass { 
    private final Dependency dependency; 
    public MyClass(Dependency dependency) 
    { 
     this.dependency = dependency; 
    } 

    public void doWork() 
    { 
     // validate dependency... 
    } 

doWork 방법은 dependency를 사용하는 메소드를 호출 할 필요가있다.

"모범 사례"로 간주되는 다음 두 가지 변형은 어느 것입니까? 그 이유는 무엇입니까? 그것은 (이기는하지만, 변두리) 분리에 테스트 할 수있는 방법은 쉽게로

// Access dependency directly 
    void validateDependency() 
    { 
     this.dependency.something(); 
    } 

    // access dependency as passed to the method 
    void validateDependency(Dependency dependency) 
    { 
     dependency.something(); 
    } 

나는, 나 자신이, 후자를 선호하는 방법에 직접 종속성을 통과 찾을 수 있습니다.

그러나 여기서는 Java 규칙/우수 사례에 관심이 있습니다.

+4

확실히 상황에 따라 다릅니다. 정확히 –

+1

! 상황에 달려 있습니다. 예를 들어, 일시적으로 결합 된 작업 (특정 순서로 호출해야하는 작업)이있는 경우 해당 작업을 사용해야합니다. 그렇지 않으면 코드의 클라이언트/관리자가 NPE의 혼동을 야기 할 수 있습니다. – lucas1000001

+0

또한 극단적 인 것으로 받아 들여야합니다. 저는 여러분이 기능적 대 객체 지향 프로그래밍 스타일을 정말로 고려하고 있다고 생각합니다. oo는 전자이고 functional은 후자입니다. – lucas1000001

답변

9

해당 상태에 연결된 상태 및 연산이 있기 때문에 클래스가 존재합니다. 그 상태의 일부를 매개 변수로 클래스 메서드에 전달할 좋은 이유가 없습니다.

실제로, 그것은 국가의 일부가 실제로 클래스에 속해서는 안됨을 나타냅니다. 또는이 방법은 클래스에 속하지 않는 것입니다.

"단위 테스트가 더 쉽도록"매개 변수를 사용하면 매개 변수를 사용하는 것이 좋습니다 (메서드가 클래스에 있어서는 안 됨).

+0

+1 내 좋은 앞날에 +1 –

-1

올바른 방법이 없습니다. 나는 변수를 거기에 두는 것을 더 선호한다.

+1

-1 API가 더 잘 고려되어야합니다. –

-1

의존성 주입. 두 번째 옵션은 "최상"입니다.

"종속성"클래스를 인터페이스로 만들면 코드가 모듈화되고 테스트가 쉽고 결합이 덜합니다.

+1

-1 그의 "종속성"은 멤버 변수입니다. 그것은 이미 결합되었습니다. 이 "Dependency Injection"을 호출하면 상황이 난처합니다. –

3

예를 들어 함수에서 멤버 함수가 아닌 정적 함수를 사용하는 종속성을 사용하여 함수를 수행하도록 요청하고 있습니다.

엄지 손가락의 제 규칙은 : 사용 회원 직접 후자

정적 방법을 직접 종속성에 관련된 무언가를 테스트하고 선호/수행 할 때 멤버를 소유 객체의 메소드를 호출하지만, 참조를 통과 할 때 그것은 약간 장황하지만 나는 그것이 도움이되기를 바랍니다. 언제나 "올바른 일을 해보려고 노력하는 것처럼"이 작은 것은 코드의 유지 보수 나 가독성에 큰 영향을 미치지 않을 것입니다.

관련 문제