Рефакторирование плотно связанных классов, когда можно изменить только одну сторону.C++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Рефакторирование плотно связанных классов, когда можно изменить только одну сторону.

Сообщение Anonymous »

Пожалуйста, примите мои извинения заранее за несколько многословный вопрос. Это минимальный автономный пример, который я мог бы придумать ... Я почти уверен, что в этой проблеме должно быть какое-то очевидное/приятное/аккуратное решение, но в настоящее время я не могу ее увидеть.

Код: Выделить всё

struct Thing1 {
public:
void bar(class Implementation1 &i) {
i.baz();
}

// ...various other methods like bar()
};

struct Thing2 {
public:
void bar(class Implementation2 &i) {
i.qux();
}

// ...various other methods like bar()
};
< /code>
даны. К сожалению, эти классы фиксируются, то есть не могут быть изменены/рефакторированы. 
Однако реализация1 
и реализация2 изменяются. Эти два класса имеют много подобного кода, поэтому кажется естественным размещать общий код в общий базовый класс. Тем не менее, код зависит от типа используемой вещи , но нет общего базового класса для Thing1 и thing2 , поэтому кажется также естественным использование шаблонов. Таким образом, я придумал следующее решение для базового класса < /p>

Код: Выделить всё

template
struct ImplementationBase {
public:
S *self;

void foo() {
T thing;
thing.bar(*self);
}

// ...lots more shared code like foo()
};
< /code>
и конкретные реализации < /p>
struct Implementation1 : public ImplementationBase {
public:
Implementation1() {
self = this;
}

void baz() {
std::cout 

Подробнее здесь: [url]https://stackoverflow.com/questions/27494072/refactoring-tightly-coupled-classes-when-only-one-side-can-be-changed[/url]
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C++»