캡슐화와 관련된 유지 관리 가능성과 관련하여 몇 가지 일반적인 질문이 있습니다. 다음은 구문 분석 트리를 구성하는 데 사용한 예제 클래스입니다. (나는 교육을 위해 STL을 피했다.)유지 관리 및 캡슐화를위한 C++ 클래스 계층 구조 구성
Node
클래스는 트리의 노드를 설명한다. 관리 클래스 ParseTree
(표시되지 않음)은 Node
개체 컬렉션을 의미 있고 나무 같은 방식으로 작성 및 유지 관리해야합니다.
// contents of node.h, not including header guard or namespace
class Token;
class Node {
public:
static const Node* FindParent(const Node* p_root, const Node* p_node);
static int Height(const Node* p_root);
static void Print(const Node* p_root);
Node(const Token * p_tok=0) : p_left_(0), p_right_(0), p_tok_(p_tok) {}
~Node() { delete p_left_; delete p_right_; }
const Node* p_left(void) const { return p_left_; }
const Node* p_right(void) const { return p_right_; }
const Token* p_tok(void) const { return p_tok_; }
private:
friend class ParseTree;
Node* p_left_;
Node* p_right_;
Token* p_tok_;
};
다음 네 가지 주제는 캡슐화와 관련됩니다. 그들이 어떤 개인 멤버를 사용하지 않고 말로 표현 할 수 있기 때문에 Node
클래스
정적 방법은 정적 선언됩니다. 일반적인 네임 스페이스에서
Node
외부에 살 것인지, 아니면ParseTree
내의 정적 멤버로 살 것인지 궁금합니다. 내 결정은ParseTree
이 나무를 담당한다는 사실에 의해 결정되어야하며 그 논리에 따라 기능은ParseTree
에 있어야합니까?관련 메모에서
ParseTree
대신 정적 방법이Node
이 아닌 이유는ParseTree
이 많은 구성원으로 채워져 있기 때문입니다. 나는 클래스를 작고 민첩하게 유지하는 것이 유지 보수에 더 좋다는 것을 읽었습니다. 개인 멤버 액세스에 의존하지 않는 메서드를 찾고 클래스 정의에서 꺼내 클래스와 동일한 네임 스페이스 내에 그룹화 된 함수에 넣는 방법을 찾아야할까요?내가 가지고 또한 캡슐화를 중단하는 경향이 있기 때문에 개인 회원에 뮤 테이터 방지에 관한 조언을 읽고, 그래서 만 가지고 접근을 종료하고,
ParseTree
가Node
과의 우정을 사용하여 수정을 처리 할 수 있습니다. 돌연변이가 있고ParseTree
으로 우정을 끝내는 것보다이게 낫지 않습니까? mutator를 추가하면 다른 우정을 추가하지 않고Node
을 다른 컨텍스트에서 재사용 할 수 있습니다.내가 돌연변이를 추가하고
Node
에서 정적 함수를 제거하면 데이터 멤버를 public으로 만들고 모든 접근 자/mutators/friend 선언을 제거 할 수 있다고 생각합니다. 나는 그러한 접근이 나쁜 형태라는 인상을 가지고있다. 각각의 개인 멤버에 접근 자/뮤 테이터 쌍이 있다면 디자인에 회의적이어야합니까?내 접근 방식에 대해 내가 묻지 않을 것이 분명하고 이상한 점이 있다면 그것에 대해 듣고 싶습니다.
당신의 논쟁은 원에서 돌아가고 있는데, 나는 이런 종류의 문제에 관해 생각할 때 저에게 무슨 일이 일어나는가에 대한 것입니다. 나는 그것에 대해 너무 걱정하지 않을 것입니다, 당신은 당신이하는 일을 알고있는 것처럼 보입니다. 그러나 매우 빨리 1) 노드에 있어야한다고 생각하지 않습니다. 2) 예, 글로벌 기능. 3) Node를 재사용 할 때 거의 이점이 없다. ParseTree에 묶여있는 것처럼 큰 가치는 없다. 4) 아니요, 노드처럼 단순한 것으로 모든 것이 공개 될 수 있기 때문입니다. – john
'돌연변이', 예수님 Setters and Getters의 잘못된 점은 무엇입니까? – James
나는 지난 몇 년 동안 저수준 작업 (IC 디자인, hdl, 임베디드 C의 자리)을하는 데 대부분을 보냈다. 절친한 친구는 객체 지향 디자인을 내게 설명 할 때 접근 자 (accessor)와 돌연변이 자 (mutators)를 가리키는 데 항상 사용되기 때문에 사적인 구성원과 상호 작용하는 public 멤버 함수에 관해 생각할 때 내 머리 속에서 가지고있는 것입니다. –