2012-03-12 2 views
2

제목에서 : 클래스 변수에 액세스하는 함수를 만드는 것이 좋은 습관입니까?클래스 변수에 액세스하는 함수를 만드는 것이 좋습니다.

나는 다음과 같은 것을 할 코드의 조각 확실히 다수 보았다

:

class MyClass { 
public: 
void setx(int a); 
void sety(int b); 
int read_x; 
int read_y; 

private: 
int x; 
int y; 

}; 

void MyClass::setx(int a) { 
x=a; 
} 

void MyClass::sety(int b) { 
y = b; 
} 

int MyClass::read_x() { 
return x; 
{ 

int MyClass::read_y() { 
return y; 
} 

그래서보다는 접근 변수 직접 (MyClass.x)가 읽고 변수 값 등을 설정하는 기능을 사용을 .

표준인가요?

답변

4

예, 접근 자 기능은 여러 가지 이유로 회원 액세스를 지시하도록되어 있습니다. 고유 한 액세스 포인트를 제공하며 추적 및 디버그가 더 쉽습니다.

예를 들어 MyClass.x이 변경된 코드의 모든 부분에 중단 점을 설정하는 대신 MyClass::setX()에 단일 중단 점을 설정할 수 있습니다.

비록 직접적인 멤버 액세스보다 좋지만 액세스 방법에는 오용 될 경우 단점이 없습니다. 자세한 내용을 보려면 Getters and Setters are bad OO design?

+1

그래도 접근자는 인터페이스 (공용 메소드)와 구현 (개인 필드) 간의 결합을 감소시킵니다. –

+0

한 가지 예외 (IMO)가 있습니다. 경비가 필요하지 않은 변수가 있고 간단한 유형 인 경우 계속 진행하면됩니다. 그것을 얻거나 설정하는 함수를 추가하는 것은 코드 확장 일뿐입니다. –

+0

@EdS : 일관성을 위해서, 단순한 접근자를 추가하여 nonconst ref를 반환하므로 액세스가 동일하게 유지됩니다. – Xeo

1

예, 그렇지만 자바를 사용하는 것보다 클래스를 작게 유지해야하며 그렇게하지 않으면 대부분 getters 인 유형으로 끝나지 않을 것이라고 말하고 싶습니다. 및 세터.

일반적으로 클래스는 (이상적으로 단일 한) 상태 (필요할 경우 얻을 수 있음)를 유지하며 이상적으로 비공개로 유지되어야하는 구현을가집니다.

2

직접 변수에 액세스하지 말고? 전혀. 프로그래밍 방식의 인터페이스 계층을 만들면 내부 변수 자체의 구현 세부 정보가 분리됩니다. 그런 다음 문제의 클래스를 조롱 한 구현 (테스트 용), 프록시 클래스 만들기 (예 : 로깅 등의 데코레이션 기능 용)와 같은 추가 유연성을 누릴 수 있습니다.

당신이 그들을 필요로하지 않을 수도있는 모든 곳. 하지만 그건 다른 문제입니다.

이 많은 체육관에서 운동처럼 : 그것은 기본 데이터 모델 클래스의 인터페이스를 분리로이 중요하다

1

)이 걸리는 이상을 다시 제공합니다. 게시 한 예제와 같은 기본 코드가 자주 표시되며, 처음에는 많은 코드가 불필요한 복잡성처럼 보일 수 있습니다. 그러나 정의 된 인터페이스를 통해 클래스의 객체에 액세스하는 코드를 중단하지 않고 객체의 구현을 변경할 수있는 (자체 문서화) 프레임 워크를 제공합니다.

+0

물론입니다. 몇 천 줄에 걸쳐서 그 일을하지 않으면 얼마나 중요한지를 설명하기가 어렵습니다.) –

관련 문제