2013-04-13 3 views
4

클래스의 데이터가 비공개이어야하고 getter 및 setter를 사용하여 읽기/수정해야한다는 것을 알고 있습니다. 그러나 구성원 기능을 직접적으로 저장하는 student.scores.push_back(100)을 사용하는 것과 비교하면 매우 번거롭지 않습니다.데이터를 비공개로 설정해야합니까?

class Student { 
public: 

    void addToScores(int inScore) { 

     scores.push_back(inScore); 
    } 

private: 

    vector<int> scores; 
} 

요약하면 사람들이 실제로 실제로하는 일은 무엇인지, 항상 엄격하게 개인 데이터를 가져다 놓고 설정하는 사람이 궁금합니다.

+0

클래스가 가질 수있는 데이터 멤버의 종류를 고려하기 전에 클래스 인터페이스를 디자인하십시오. 그러면이 질문을하지 않아도됩니다. –

+1

아무도 괜찮은 코드를 작성해야합니다. 날 믿어. –

답변

4

회원 기능의 목적은 인터페이스를 노출하는 것입니다. getter 및 setter 또는 기타 간단한 기능을 사용하여 멤버가 이미 구현 한 인터페이스를 집계 컨테이너 객체로 간단하게 이동시킬 필요가 없습니다.

의 클라이언트가 원하는대로 조작 할 수있게하려면 scores을 공용 멤버로 설정하고 쉬운 방법으로 액세스해야합니다. push, poptop 만있는 스택 인 경우 std::stack 인터페이스 어댑터를 사용하십시오. push_back 만 허용해야하는 경우 addToScores을 구현할 수 있습니다. 그러나 유일한 클라이언트가 당신이고, 당신이 학대받는 std::vector 인터페이스의 다른 부분에 대해 걱정하지 않는다면, 새로운 인터페이스를 구현하는 데 정말로 요점이 없습니다.

프로그램 내의 모든 인터페이스는 신중하게 설계되어야합니다. 표준 인터페이스 (C++ 기본 할당 연산자 포함)가 "위험"하다는 이유로 습관으로 slapdash 인터페이스를 추가하는 것은 반드시 좋은 습관은 아닙니다.

2

실제로 사람들은 클래스를 사용하여 데이터 멤버와 독립적 인 새로운 의미 체계로 새 데이터 유형을 정의합니다. 접근 자나 공용 데이터 멤버는 사용되지 않지만 대신 데이터 멤버에 대한 불변 조건을 유지하면서 새 데이터 유형과 관련된 작업을 수행하는 멤버 함수가 제공됩니다.

물론 사람들은 추가 의미론없이 데이터 집계 인 클래스를 작성하는 경우가 있습니다. 이 경우 공개 회원으로 채워진 struct이 적합합니다.

0

간단한 읽기/쓰기 인 경우 실제로 데이터를 비공개로 설정할 필요는 없습니다. 그러나 읽기/쓰기중인 데이터에 대해 수행해야하는 유효성 검증/조건이있는 경우이를 개인용으로 이해하는 것이 좋습니다.

2

Get/Set 메서드를 사용하는 기본적인 이유 중 하나는 데이터 캡슐화 외에 입력 형식을 제어하는 ​​것입니다.

특정 입력 유형을 사용하지 않으려면 [0,100] 간격 범위 밖의 점수를 원하지 않는다고 가정하면 라이브러리 사용자가 Set 메서드에서이 조건을 검사하여 라이브러리 사용자가 비논리적 인 조작.

관련 문제