Как применять принципы ООП в новом консольном приложении C # - PullRequest
0 голосов
/ 17 ноября 2018

Я пытаюсь выяснить, как лучше структурировать объекты в новом консольном приложении C #, чтобы оно соответствовало принципам ООП, чтобы его можно было многократно использовать, поддерживать, расширять и тестировать на единицах.

У меня есть следующая задача:

  1. Консольное приложение будет запускаться из планировщика задач
  2. Читает в xml-файле из общей папки
  3. XML-файл содержит числовые данные, которые необходимо агрегировать
  4. Результат этой агрегации необходимо отправить по электронной почте конечному пользователю

Для шагов 1 и 2 я планировал создать следующие классы:

  • FileToStringTransformer (это будет считывать содержимое xml-файла из общего файлового ресурса и переносить его в приложение в виде строки. Изоляция этого класса позволяет нам выполнять модульное тестирование других классов без зависимости от файла. поделиться, а также дает нам гибкость, чтобы изменить местоположение источника XML из файла на диске, чтобы сказать базу данных, не влияя на другие классы)

  • StringToXDocumentTransformer (это изменит строковый объект на объект XDocument)

  • XDocumentToDomainObjectTransformer (это сопоставит объект XDocument с объектом домена, чтобы было легко агрегировать числовые данные)

Я планировал, чтобы объект XDocumentToDomainObjectTransformer "имел" объект StringToXDocumentTransformer, а объект StringToXDocumentTransformer "- объект FileToStringTransformer. Это делается для того, чтобы один вызов объекта XDocumentToDomainObjectTransformer вызывал методы для двух других объектов, чтобы вам не пришлось явно записывать вызовы во все три класса везде, где вы хотите преобразовать файл на диске в объект домена.

Но я понял, что недостатком этого является то, что вы не сможете повторно использовать классы изолированно друг от друга - я не могу сказать, что повторно используйте один класс XDocumentToDomainObjectTransformer, потому что дерево зависимостей включает в себя два других класса. Как лучше всего спроектировать объекты для шагов 1 и 2 задачи, чтобы они соответствовали принципам ООП?

1 Ответ

0 голосов
/ 17 ноября 2018

Ваша интуиция о том, что вы не сможете повторно использовать классы в отдельности, верна. Вторая проблема заключается в том, что обычно ваши трансформаторы не должны иметь состояния.

Модель дизайна, к которой вы склоняетесь, обычно называют «функциональным программированием».

Под этой моделью у вас будет:

FileToStringTransformBlock StirngToXDocumentTransformBlock XDocumentToDomainObjectTransformBlock

Который вы могли бы связать вместе в одном конвейере, как предложено выше.

Для лучшей практики я бы предложил использовать Dataflow , в котором есть действительно чистый пример, использующий 4 цепных преобразования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...