Это очень простой материал, но здесь. Я считаю, что я никогда не могу согласиться с самим собой: способ, которым я разделять большие классы на более мелкие, делает вещи более удобными или менее обслуживаемыми. Я знаком с шаблонами проектирования, хотя и не подробно, а также с концепциями объектно-ориентированного дизайна. Все вникающие правила и рекомендации в сторону, я ищу, чтобы выбрать ваши мозги в отношении того, что мне не хватает с очень простым, примерным сценарием. По существу, по строкам: "... этот проект сделает его более трудным" и т.д.... Все, чего я не ожидаю из-за отсутствия опыта, по существу.
Скажем, вам нужно написать базовый класс стиля "файловый читатель/файл" для обработки определенного типа файла. Позвоните в файл файл YadaKungFoo. Содержимое файлов YadaKungFoo по существу похоже на файлы INI, но с небольшими различиями.
Существуют разделы и значения:
[Sections]
Kung,Foo
Panda, Kongo
[AnotherSection]
Yada,Yada,Yada
Subtle,Difference,Here,Yes
[Dependencies]
PreProcess,SomeStuffToPreDo
PreProcess,MoreStuff
PostProcess,AfterEight
PostProcess,TheEndIsNear
PostProcess,TheEnd
ОК, поэтому это может привести к 3 основным классам:
public class YadaKungFooFile
public class YadaKungFooFileSection
public class YadaKungFooFileSectionValue
Два последних класса по существу представляют собой только структуры данных с переопределением ToString(), чтобы выплескивать список строк значений, хранящихся в нескольких общих списках. Этого достаточно для реализации функциональных возможностей сохранения YadaKungFooFile.
Таким образом, со временем YadaYadaFile начинает расти. Несколько перегрузок для сохранения в разных форматах, включая XML и т.д., И файл начинает нажимать на 800 строк или около того. Теперь реальный вопрос. Мы хотим добавить функцию для проверки содержимого файла YadaKungFoo. Первое, что приходит на ум, очевидно, добавить:
var yada = new YadaKungFooFile("C:\Path");
var res = yada .Validate()
И мы закончили (мы можем даже вызвать этот метод из конструктора). Проблема в том, что проверка довольно сложна и делает класс очень большим, поэтому мы решили создать новый класс следующим образом:
var yada = new YadaKungFooFile("C:\Path");
var validator = new YadaKungFooFileValidator(yada);
var result = validator.Validate();
Теперь этот пример, очевидно, ужасно простой, тривиальный и несущественный. Любой из двух способов выше, вероятно, не будет иметь большого значения, но мне не нравится:
- Класс YadaKungFooFileValidator и класс YadaKungFooFile, по-видимому, очень сильно связаны этим дизайном. Кажется, изменение в одном классе, скорее всего, вызовет изменения в другом.
- Я знаю, что такие фразы, как "Validator", "Controller", "Manager" и т.д.... указывают класс, который связан с состоянием других объектов, в отличие от его "собственного бизнеса" и, следовательно, нарушает разделение принципов озабоченности и отправки сообщений.
В целом, я думаю, я чувствую, что у меня нет опыта, чтобы понять все аспекты того, почему дизайн плохой, в каких ситуациях это не имеет особого значения и какая озабоченность несет больший вес: меньшие классы или более сплоченных классов. Они кажутся противоречивыми требованиями, но, возможно, я ошибаюсь. Может быть, класс validator должен быть составным?
По сути, я прошу дать комментарии о возможных преимуществах/проблемах, которые могут возникнуть в результате вышеупомянутого проекта. Что можно сделать по-другому? (базовый класс FileValidator, интерфейс FileValidator и т.д. u именовать его). Подумайте о функциональности YadaKungFooFile, которая со временем растет.