Денис Крешихин

Денис
Крешихин

iOS-разработчик с 15+ летним опытом

Тимлид/сеньор по обстоятельствам

Интересы: swift, uikit, rxswift, oop/ood, devops, agile

2024 © Денис Крешихин

Статическая и динамическая композиции в c++

Возможность метапрограммирования в c++ позволяет расширить тривиальные способы композиции классов, варьируя сцепленность и зависимость объектов.

Ниже приведены пять вариантов композиции в c++.

  1. Жёсткая композиция:

(-) сильная зависимость

class A
{
public:
   void doSmthing(){
       b.method();
   }
private:
   B b;
};

class A protected B
{
public:
   void doSmthing(){
       this->method();
   }
};
  1. Динамическая композиция:
  • (o) слабая зависимость
  • (-) развязано только до уровня AbstractB
class A
{
public:
   A(AbstractB *b) : b(b) {};
   void doSmthing(){
       b->method();
   }
private:
   AbstractB* b;
};
  1. Статическая композиция:
  • (+) минимальная зависимость
  • (-) невозможна динамическая смена композанта, низкая сцепленность
template <class B>
class A
{
public:
   void doSmthing(){
       b.method();
   }
private:
   B b;
};

template <class B>
class A : protected B
{
public:
   void doSmthing(){
       b.method();
   }
};
  1. Статическая композиция с динамической инициализацией.
  • (+) минимальная зависимость
  • (+) возможна динамическая смена композанта, высокая сцепленность
  • (-) class A меняет тип в зависимости от композиции
template <class B>
class A
{
public:
   A(B* b) : b(b){};
   void doSmthing(){
       b->method();
   }
private:
   B* b;
};
  1. Статическая композиция с динамической инициализацией и абстрактным предком.
  • (+) минимальная зависимость
  • (+) возможна динамическая смена композанта, высокая сцепленность
  • (+) class A предоставляет постоянный интерфейс AbstractA
class AbstractA
{
public:
  void doSmthing() = 0;
};

template <class B>
class A : public AbstractA
{
public:
   A(B* b) : b(b){};
   void doSmthing(){
       b->method();
   }
private:
   B* b;
};