Сокращение дублирования кода из общего кода, вызывающего общий класс

У меня есть класс «А», который почти идеально подходит для моих нужд.
Класс «B» использует класс «A»

Сейчас я спроектировал класс «C» и класс «D» и заметил, что в классах «B» есть хороший кусок кода, так как «C» и «D» дублированы. Я выделил этот код в отдельные, автономные функции в каждом из классов.

Теперь мне интересно, куда этот код должен идти. На данный момент функции дублируются в трех вызывающих классах (B, C и D).

Помещение функций в класс «А» нарушило бы принцип единой ответственности. Наследование для добавления функциональности может нарушить как SRP, так и LSP.

То, что может работать, — это композиция.

Q: Разрабатываете ли вы полный класс только для нескольких функций по сравнению с kill?

Q: Будет ли допустимо, чтобы классы «B», «C» и «D» имели доступ как к новому классу «E» (который будет зависеть от A), так и к старому классу «A» (который должен быть одинаковым экземпляр как экземпляр в новом классе «E»), или новый класс «E» должен обеспечить достаточную функциональность, чтобы классы B, C и D не нуждались в непосредственном доступе к классу A? Казалось бы, это тогда неполный интерфейс с дополнительным функционалом.

Или же новый класс «E» должен что-то сделать и вернуть результат в класс B, C, D, который они могут затем передать классу «A» сами. На самом деле, нет, это не может работать, поскольку класс должен был бы вызываться снова для определенных возвращаемых значений.

Или я должен сделать это совершенно по-другому?

(и почему разработка программного обеспечения требует столько размышлений?)

Пример сценария использования:

Класс B: while ((A-> DoSomething () == ОШИБКА / ВРЕМЯ / и т. Д.) && (повторы < 3)) {повторяет ++; А-> SetSomeParameters (); }

(фактический код больше)

1

Решение

Если дублированный код имеет вид (a) large (ish), (b), вероятно, изменится в lockstep для всех использующих классы, и, следовательно, (c) рискует разойтись, создавая новые ошибки, я бы пошел для создания ( скрытый) класс, содержащий эту функциональность и наследующий его по мере необходимости.

В любом случае, тщательно обдумайте затраты против выгод. Добавление одной версии функции (ей) создает жесткость, которую, возможно, потребуется устранить (снова разделив) позже. «Работай сейчас, это может быть быть полезным позже «чаще всего получается просто создать дополнительную работу на потом (закон Мерфи абсолютно беспощаден). Общая архитектура важнее деталей возможного дублирования.

0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector