Я пишу багато коду, який включає три основні етапи.
- Отримайте дані звідкись.
- Перетворіть ці дані.
- Покладіть ці дані кудись.
Як правило, я використовую три типи занять - надихнувшись їх відповідними моделями дизайну.
- Фабрики - для побудови об'єкта з якогось ресурсу.
- Посередники - користуватися фабрикою, виконувати перетворення, потім використовувати командира.
- Командири - розмістити ці дані десь в іншому місці.
Мої заняття, як правило, мені досить малі, часто це єдиний (загальнодоступний) метод, наприклад отримати дані, перетворити дані, зробити роботу, зберегти дані. Це призводить до поширення класів, але загалом працює добре.
Там, де я борюся, коли я приходжу до тестування, я, в кінцевому підсумку, буду щільно поєднати тести. Наприклад;
- Заводська - читає файли з диска.
- Commander - записує файли на диск.
Я не можу перевірити одне без іншого. Я можу написати додатковий тестовий код для читання / запису диска також, але тоді я повторююсь.
Дивлячись на .Net, клас File застосовує інший підхід, він поєднує в собі обов'язки (мого) заводу та командира разом. Він має функції для створення, видалення, існування та читання всіх в одному місці.
Чи слід дивитись, щоб наслідувати приклад .Net та поєднувати - особливо, коли ми маємо справу із зовнішніми ресурсами - мої заняття разом? Код, який він все-таки поєднав, але це більш навмисно - це відбувається при початковій реалізації, а не в тестах.
Чи моє тут питання про те, що я застосував Принцип єдиної відповідальності дещо надмірно? У мене є окремі класи, які відповідають за читання та письмо. Коли я міг би мати комбінований клас, який відповідає за роботу з певним ресурсом, наприклад системним диском.
Looking at .Net, the File class takes a different approach, it combines the responsibilities (of my) factory and commander together. It has functions for Create, Delete, Exists, and Read all in one place.
- Зауважте, що ви пов'язуєте "відповідальність" із "річчю, що потрібно робити". Відповідальність більше схожа на "сферу занепокоєння". Відповідальність класу File - виконання файлових операцій.
File
бібліотеки від C # є те, що, наскільки ми знаємо, File
клас може бути просто фасадом, розміщуючи всі файлові операції в одному місці - в клас, але можна внутрішньо використовувати аналогічні ваші класи читання / запису, які б насправді містять складнішу логіку обробки файлів. Такий клас (the File
) все ще дотримуватиметься SRP, оскільки процес фактичної роботи з файловою системою буде абстраговано за іншим шаром - швидше за все, з об'єднавчим інтерфейсом. Не кажучи, що це так, але це могло бути. :)