"재구성-기존 코드 디자인 개선"독서 노트----Hide Delegate
3896 단어 delegate
포장은 대상을 향한 가장 관건적인 특징 중의 하나다.그는 시스템의 모든 대상이 가능한 한 시스템의 다른 부분을 적게 이해해야 한다는 것을 의미한다. 이렇게 가져오는 장점은 일단 변화가 발생한 후에 이 변화를 알아야 하는 대상이 비교적 적다는 것이다. 이것은 당신이 변경해야 할 코드가 매우 적고 변화가 더욱 쉽게 진행될 수 있다는 것을 의미한다.
C++에서 필드를 공명정대하게 공개할 수 있지만, 가능한 한 이 필드를 숨겨야 한다. 이 필드를 공개적으로 노출하는 것은 번거로움이 많을 수 있고, 보호자나 private를 사용해야 한다.개발 경험이 나날이 풍부해지면서 다른 것들도 포장할 수 있다는 것을 알게 될 것이다.
만약에 고객이 하나의 서비스 대상(위탁 대상)을 통해 다른 대상을 얻어 다른 대상의 함수를 호출해야 한다면 고객은 반드시 이 층의 위탁 관계를 알아야 한다. 만약에 위탁 관계가 변화하면 고객도 상응하는 변화를 해야 한다.서비스 대상에 간단한 의뢰 함수를 놓아서 의뢰 관계를 숨겨서 이러한 의존을 제거할 수 있다.이렇게 되면 향후 위탁관계가 바뀌면 변화도 서비스 대상에만 제한되고 고객과 관련이 없다.일부 또는 모든 고객에 대해 먼저 사용할 필요가 있음을 발견할 수 있다Extract Class. 일단 모든 고객에게 관계를 숨기면 서비스 대상에서 피위탁 대상을 공개할 필요가 없다.
방법:
예:
class Person
{
Department *department() const
{
return m_department;
}
void setDepartment(Department *value)
{
m_department = value;
}
private:
Department *m_department;
};
class Department
{
public:
Department(Person *person) :
m_manager(person)
{
}
Person *manager() const
{
return m_manager;
}
private:
QString m_chargeCode;
Person *m_manager;
};
우리는 Person과 Department 두 종류가 있는 것을 볼 수 있다. 클라이언트 코드를 살펴보자. 만약에 Person이 있다면 내가 그의 관리자를 얻으려면 먼저 그의 department를 호출한 다음에 mana를 호출해야 한다.
manager = john->department()->manager();
이를 통해 알 수 있듯이 이러한 호출 방식은 클라이언트 코드가 Department류의 작업 원리를 폭로한 것이다. 우리는 원래 Department가 매니저의 정보를 추적하는 데 사용되었다는 논리를 얻을 수 있다.이렇게 하면 의심할 여지없이 고객 코드와 Department 간의 결합을 증가시켰다. 이러한 결합을 없애려면 Hide Delegate가 Person에서 위탁 함수를 만들어야 한다
class Person
{
public:
Person *manager()
{
m_department->manager();
}
};
그리고 나서 우리는 클라이언트 코드를 수정해서 그가 새로운 함수를 호출하도록 했다.
manager = john->manager();
이번 수정을 거친 후에 클라이언트 코드가 Department에 대해 아무것도 모른다는 것을 알 수 있다. 이렇게 하면 Person 클래스 내부와 Department 사이에 어떤 변화가 있어도 클라이언트 코드는 안정적이다.심지어 만약에 우리가 Department에 대한 모든 함수에 대한 의뢰를 완성한 후에 Person의 모든 고객을 수정하면 나는 Person에서 Department에 대한 접근 함수를 제거할 수 있다.
ger
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
extjs 소스 분석 - 012(Funtion 확장)this : function() { var me = this, args = arguments; fcn.target = me; fcn.method = method; return (fcn.apply(scope || me...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.