2016-09-26 1 views
2

개체의 여러 메서드를 통해 인수를 전달하려는 경우 해당 인수를 인스턴스 변수에 저장하는 것이 좋습니다? 예를 들어인수가 여러 메소드를 통해 전달 될 때 인스턴스 변수에 저장해야합니까?

:이 경우

public class Example { 
    private int[] array; 

    public void doThingsToArray(int[] array) { 
     this.array = array; 
     // `array` doesn't need to be passed as an argument. 
     doFirstThingToArray(); 
     doSecondThingToArray(); 
     ... 
    } 

    ... 
} 

Example의 동일한 인스턴스가 여러 배열에 doThingsToArray()를 호출하는 데 사용됩니다, 그래서 당신은 단지 Example의 생성자에 인수로 array을 전달할 수 없습니다.

내가 볼 수있는 프로는 인자로 array을 넘겨 줄 필요가 없다는 것입니다. - Clean Code에 따르면, 적어도 메소드가 가진 매개 변수가 적을수록 좋습니다.

나는 단단한 죄수를 생각해 낼 수 없지만,이 상황에 뭔가 잘못 됐음을 느낍니다.

+5

단점 : 즉각적으로 클래스가 스레드로부터 안전하지 않게 만듭니다. 필드는 객체의 상태의 일부가 아니지만 일부 메소드에서 사용되는 임시 값입니다. –

+0

"왜 doThingsToArray()라고 불리는 메소드가 배열을 수정하는 것 이외의 일을하는 것일까?"라는 질문에 대한 첫 번째 질문에 답할 필요가 있다고 생각합니다. " – shmosel

+0

다중 스레드를 사용하지 않으려면 어떻게해야합니까? 나중에 언제든지 그렇게하고 싶을 가능성이 항상 있다고 생각합니다. – Pig

답변

5

개체의 여러 메서드를 통해 인수를 전달하려는 경우 해당 인수를 인스턴스 변수에 저장하는 것이 좋습니다.

아니요, 그렇게하는 것이 현명하지 않습니다.

디자인 관점에서 인스턴스 변수에 숨기도록 제안한 값은 개체의 속성이 아닙니다. 오히려 그것은 주어진 계산의 속성입니다. 따라서 메서드 인수 및/또는 로컬 변수는 해당 변수가 속한 곳이며 인스턴스 변수에 절대 속하지 않습니다.

실용적인 관점에서 인스턴스 변수에 숨겨진 값에 의존하면 스레드 안전이 손상됩니다. 하나의 객체에서 여러 개의 계산을 동시에 수행 할 수는 없습니다. 왜냐하면 각각의 객체가 동일한 목적을 위해 동일한 인스턴스 변수를 사용할 수 있기를 기대하기 때문입니다.

+0

그래서 인스턴스 변수는 객체의 상태만을 설명해야합니까? – Pig

+2

@ 돼지, 네. 그것은 사실 "객체 지향적"의 정의입니다. –

+2

또한 로직을 모호하게하여 코드를 매우 약하게 만듭니다. 예 : 필드에 유효한 값이 언제 있습니까? 장래의 변경으로, 필드가 할당되기 전에 필드를 사용하려고하면,'null' 값이됩니다. 메서드 호출 외부에서이 메서드를 사용하려고하면 어떤 호출이든 마지막 호출에서 부실 값이 표시 될 수 있습니다. 따라서 단일 스레드 응용 프로그램에서도 매우 문제가 있습니다. – Andreas

관련 문제