2010-04-16 3 views
3

예 : 두 번째 옵션이 커플 링을 회피하면서클래스 데이터가 내부적으로 전달되거나 직접 액세스되는 것이 더 낫습니까?

// access fields directly 
private void doThis() 
{ 
    return doSomeWork(this.data); 
} 

// receive data as an argument 
private void doThis(data) 
{ 
    return doSomeWork(data); 
} 

첫 번째 옵션 this.data의 값과 결합된다. 나는 두 번째 옵션이 항상 더 좋은 것처럼 느낀다. 클래스 내에서 느슨한 결합을 촉진합니다. 전역 클래스 데이터에 액세스하는 것은 나쁜 생각처럼 보일뿐입니다. 분명히이 클래스 데이터는 어느 시점에서 직접 액세스해야합니다. 그러나이 전역 클래스 데이터에 대한 액세스가 매개 변수 전달을 통해 제거 될 수 있으면 항상 바람직합니다.

두 번째 예제는 적절한 형식의 데이터로 작업 할 수있는 이점이 있지만 첫 번째 예제는 just 클래스 데이터로 작업 할 수 있습니다. 추가 유연성이 필요하지 않더라도 옵션으로 남겨 두는 것이 좋습니다.

첫 번째 예제와 같이 개인용 메서드에서 직접 멤버 데이터에 액세스 할 때 어떤 이점도 보이지 않습니다. 여기서 가장 좋은 방법은 무엇일까요? 코드를 완전하게 참조했지만이 특정 문제에 대해서는 아무 것도 찾을 수 없었습니다.

답변

3
  • 데이터가 개체 상태의 일부인 경우 private/protected로 설정하면됩니다. 옵션 1 - 좋습니다.

  • 일부 개발자는 클래스의 메서드 사이에 매개 변수를 전달하기 위해 전용/보호 된 변수를 만들고 싶어하므로 메서드 호출에서 매개 변수를 전달해야합니다. 그들은 실제로 객체의 모델/상태를 저장하는 것이 아닙니다. ... 그런 다음 옵션 1 - 좋지 않습니다.

이유는이 경우에 좋지 옵션 1 ...

  • 만큼만 당신이 (VAR 범위 지정)를 필요로 노출합니다. 그래서, 데이터를 전달하십시오. 두 가지 메소드간에 데이터를 전달하기 위해 private/protected var를 작성하지 마십시오.
  • 모든 것을 내부적으로 파악하는 개인적인 방법을 사용하면 매우 쉽게 이해할 수 있습니다. 피할 수없는 경우를 제외하고는이 방법으로 보관하십시오.
  • private/protected vars는 리팩터링하는 것이 어렵습니다. 메서드가 '자체 포함'이 아니기 때문에 다른 곳에서 사용할 수있는 외부 변수에 따라 다릅니다.

내 2 센트! :-)

2

클래스에서 전역 데이터는 문제가되지 않습니다. 클래스는 상태, 동작 및 신원을 결합하는 데 사용됩니다. 그래서 그러한 결합은 문제가되지 않습니다. 인수는 다른 클래스의 다른 객체의 데이터를 사용하여 해당 메소드를 호출 할 수 있으며 내부 클래스를 연결하는 것보다 더 고려해야한다고 생각합니다.

1

둘 다 인스턴스 메소드이므로 스레드가 관련된 상황이 아니라면 # 1이 더 적합합니다 (언어와 시나리오에 따라 다르지만 데이터 메소드를 동기식으로 잠 그거나 표시 할 수 있음). Java 지식은 다음과 같습니다. 녹슨).

두 번째 기법은 절차 적 프로그래밍을 상기시킵니다.

관련 문제