Когда я создаю приложение, я обычно создаю статический класс, который содержит статические методы и свойства, которые я не могу понять, куда поместить куда-либо еще.
Это не очень хороший дизайн, но в этом и заключается суть: это дает мне возможность локализовать целый класс дизайнерских решений, которые я еще не придумал. Как правило, когда приложение растет и совершенствуется за счет рефакторинга, становится яснее, где эти методы и свойства фактически должны находиться. К счастью, состояние инструментов рефакторинга таково, что эти изменения обычно не особенно болезненны.
Я пытался сделать это по-другому, но другой путь - это в основном реализация объектной модели, прежде чем я узнаю достаточно о моем приложении, чтобы правильно спроектировать объектную модель. Если я сделаю , что , я потрачу изрядное количество времени и энергии, чтобы найти посредственное решение, которое мне придется пересмотреть и восстановить с нуля в будущем. Хорошо, хорошо, если я знаю, что собираюсь рефакторинг этого кода, как насчет того, чтобы пропустить этап разработки и создания ненужных сложных классов, которые на самом деле не работают?
Например, я создал приложение, которое используется несколькими клиентами. Я довольно рано понял, что мне нужен способ выделить методы, которые должны работать по-разному для разных клиентов. Я создал метод статической утилиты, который мог вызывать в любой точке программы, где мне нужно было вызывать пользовательский метод, и вставил его в мой статический класс.
Это работало нормально месяцами. Но наступил момент, когда это только начинало выглядеть уродливо. И поэтому я решил перестроить его в свой класс. И когда я просмотрел свой код, просматривая все места, где вызывался этот метод, стало совершенно ясно, что все настраиваемые методы действительно должны быть членами абстрактного класса, а сборки клиентов должны содержать один производный класс. который реализует все абстрактные методы, а затем программе просто нужно было получить имя сборки и пространство имен из ее конфигурации и создать экземпляр класса пользовательских объектов при запуске. Мне было действительно легко найти все методы, которые нужно было настроить, так как все, что мне нужно было сделать, - это найти все места, где вызывался мой метод load-a-custom-feature. Мне потребовалась лучшая часть дня, чтобы просмотреть всю кодовую базу и рационализировать этот дизайн, а конечный результат действительно гибкий и надежный и решает правильную проблему.
Дело в том, что когда я впервые реализовал этот метод (на самом деле это были три или четыре взаимосвязанных метода), я понял, что это не правильный ответ. Но я не знал достаточно, чтобы решить, каков был правильный ответ. Поэтому я шел с самым простым неправильным ответом, пока правильный ответ не стал ясным.