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

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

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;
};

Please enable JavaScript to view thecomments powered by Disqus.

AltStyle によって変換されたページ (->オリジナル) /