Дублирование кода относится к существенному повторению блоков, операторов или даже группировок общих объявлений участников. Он не относится к повторению языковых ключевых слов, идентификаторов, шаблонов и т. Д. В противном случае вы не сможете добиться полиморфизма.
Пример, который вы предоставляете, на самом деле не демонстрирует принцип Open/Closed, поскольку вы не продемонстрировали, как поведение данного класса может быть расширено без изменений. Принцип Open/Closed заключается в создании новых классов каждый раз, когда желателен вариант поведения. Это может быть достигнуто с использованием наследования вместе с шаблоном метода шаблона (т.е. вызовом абстрактных или виртуальных методов в базовом классе, которые переопределены в подклассах для достижения желаемого/нового поведения), но чаще это демонстрируется с использованием композиции с использованием шаблона стратегии (т.е. инкапсулируя поведение варианта в классе и передавая его закрытому типу, который будет использоваться при определении общего поведения).
Из вашего примера, похоже, вы думали больше о попытках достичь OCP через наследование, но начиная с базового форматирования отчета, чтобы установить интерфейс с подтипами, чтобы указать различные типы форматов для данного отчета, на самом деле хороший старт к показу OCP через композицию. Что необходимо для демонстрации OCP с помощью подхода, основанного на композиции, - это класс, который потребляет форматировщики ... скажем, ReportWriter.
public class ReportWriter : IReportWriter
{
Write(IReportData data, IReportFormatter reportFormatter)
{
// ...
var formattedStream = reportFormatter.Format(data, stream);
// ...
}
}
Просто ради демонстрации, я сделал несколько предположений о том, как наш новый форматировщик может вести себя, так что не уделяют слишком сильно на этой части. Основное внимание уделяется тому, что ReportWriter открыт для расширения, позволяя передавать новые форматы, что влияет на то, как отчеты в конечном итоге записываются, но закрыты для модификации кода, необходимого для достижения этого нового поведения (т. Е. Наличия операторов if, switch заявления и т. д., чтобы добиться нескольких способов форматирования).
Принцип Open/Closed не только не вызывает дублирования кода, когда достигается посредством использования композиции над наследованием, это фактически может помочь уменьшить дублирование. Если истинное дублирование кода происходит в процессе создания иерархии наследования или классов стратегии, это указывает на проблему факторинга, не связанную с тем, что она может существовать в контексте того, что вы пытаетесь достичь OCP.
Что такое дублирование в приведенном выше коде? – shahkalpesh
Ваш код не является примером OCP. Возможно, вы показываете проект, который «открыт для расширения», но где находится «закрытая для модификации»? – SingleShot
@SingleShot: для части «закрыта для модификации», я думаю, что первый класс должен быть внутренним, а не публичным. Правильно???? – egyamado