"재구성-기존 코드 디자인 개선"독서 노트----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

    좋은 웹페이지 즐겨찾기