Я работаю над проектом, который выполняет множество разных, ужасно сложных вещей в среде, которая должна быть легко расширяемой другими.
Сначала классы были большими и занимались множеством дел. Чтобы изменить это поведение, вам пришлось расширить эти классы. Все методы были виртуальными и не меняли состояния объекта, поэтому это было довольно просто.
Но по мере роста системы становилось все более ясно, что в итоге фреймворк будет иметь серию монолитных объектов, каждый из которых будет иметь очень длинные цепочки наследования. Это также привело к неожиданным зависимостям - абстрактный метод, использующий коллекцию класса X для создания объекта Y, определенного в базовом классе, диктовал, что ВСЕМ должен делать это таким образом, даже когда это не имело смысла для половины дерева наследования. Это также привело к появлению массивных классов, которые потребовали десятков модульных тестов, чтобы охватить код более 80%, а сложность была такой, что вы не были уверены, что все покрыли правильно. Было очевидно, что такая конструкция сделает каркас очень жестким и негибким.
Поэтому мы переработали все в соответствии с принципами SRP. У вас будет свой интерфейс, базовый класс и, возможно, один или несколько классов реализации. Каждый из них был составлен из разных объектов, которые выполняли ключевые функции всего процесса. Если вы хотите изменить одну часть, вы не переопределяете метод, вы должны создать другой объект, который расширяет требуемый интерфейс / базовый класс и выполняет свою работу по-другому. SRP даже был включен в аргументы и возвращаемые значения методов класса. Для тех частей системы, которые должны быть гибкими, а не передавать коллекции класса X, которые используются для создания объектов Y, был создан класс, инкапсулирующий процесс производства объектов Y. Компоненты в системе затем будут передавать этих производителей, объединять их с другими (ответственность производителей) и, в конечном итоге, использовать их для производства Y. Это позволяло создавать разные типы производителей, каждый из которых мог обрабатываться точно так же то же самое, хотя они делали совершенно разные вещи. Этот шаг также резко сократил кодовую базу каждого класса и сделал их НАМНОГО проще тестировать.
Я бы сказал, что как новый разработчик ОЧЕНЬ ТРУДНО все довести до этого уровня. Вам почти нужно написать большой комок грязи, понять, как он работает, а затем преобразовать его в несколько различных компонентов, каждый из которых берет на себя ответственность за часть целого.
person
Community
schedule
28.01.2009