Чи дотримуйтесь SOLID, читання та запис файлів є двома окремими обов'язками?


13

Я тільки починаю досліджувати SOLID, і я не впевнений, читання з файлів і запис у файли несуть ту саму відповідальність.

Цільовий тип одного типу; Я хочу читати і писати .pdf у своїй програмі.

Додаток знаходиться в Python, якщо це має значення.

Відповіді:


24

Реалізація читання та письма, ймовірно, має велику ймовірність бути дуже згуртованою. Якби одне змінилося, так би і інше. Висока згуртованість є яскравою ознакою єдиної відповідальності, а Принцип єдиної відповідальності говорить нам про те, що їх слід об'єднувати в один клас. Якщо ці операції мають низьку згуртованість, швидше за все, розкол їх покращує ремонтопридатність.

Однак, якщо є споживачі, які читають дані лише без письма або пишуть лише без читання, це свідчить про те, що з точки зору інтерфейсу ви повинні відокремлювати ці операції, як це визначено Принципом розбиття інтерфейсу. Це означає, що споживачі повинні визначити два інтерфейси, від яких вони можуть залежати, тоді як Fileклас буде реалізовувати обидва інтерфейси.


8

Коли ви застосовуєте принцип проекту SOLID для проектування об'єкта, ви можете розглядати читання та запис файлів як ОДИНУ відповідальність - працювати з постійними даними

Однак не слід ставити читання та запис файлів у один і той же метод або функцію.


5

Більшість інших відповідей, здається, не помітили, що у вашому запитанні відсутня одна важлива інформація - ви не сказали нам, чи пов’язані документи, які ви збираєтесь читати та писати!

Чи є у вашій програмі щось на кшталт "об'єкт документа" і записує спочатку у файл PDF, а потім знову читає той самий файл у подібний документ? Або навпаки, воно читає PDF-файли в документ, вносить деякі зміни в нього і знову зберігає цей самий документ у новому PDF-файлі? Тоді читання та письмово слід сприймати як одну з обов'язків. Це може бути так, якщо ваша програма містить або містить щось на зразок компонента "Редактор PDF" або "Інструментарій маніпулювання PDF".

Однак якщо одна частина вашої програми створює деякі файли PDF, наприклад, у складі звіту, а інша незв'язана частина вашої програми читає різні PDF-файли (наприклад, оцінювач вкладення пошти для пошукової системи) та внутрішнє представлення ці останні PDF-файли не мають нічого спільного з випадком першого використання, тоді ці завдання є різними обов'язками.

Спеціально для PDF цей випадок другого використання - це той випадок, який я бачив набагато частіше в різних видах застосувань. Існує набагато більше бібліотек / компонентів, які просто підтримують створення PDF, і лише набагато менша кількість, яка підтримує також читання PDF. Якщо ви збираєтесь використовувати одну бібліотеку для генерації файлів PDF та зовсім іншу для читання PDF-файлів, то повинно бути очевидним, що читання та запис PDF-файлів буде окремим обов'язком.


Це схоже на відповідь Стівена, але це дає конкретний приклад.
DavidS

@DavidS: Відповідь Стівена є просто дуже абстрактною, але оскільки ОП спеціально запитує файли PDF, я думаю, що є сенс відповісти на це більш конкретно. Що стосується PDF, я не погоджуюся з першим реченням Стівена: "Програма для читання і написання має велику ймовірність бути дуже згуртованою" - на мій досвід, для типових випадків використання PDF правдиво навпаки (я також дав йому відгук).
Док Браун

Конкретні приклади - чудові. Я просто порівнював для аналізу. Чудова відповідь!
DavidS

3

На думку ( Роберт К. Мартін ) відповідальність - це набір функцій, який виконує один конкретний актор.

Актор повинен бути єдиним джерелом зміни заданої відповідальності (для зміни має бути лише одна причина).

У вашому випадку слід спочатку визначити акторів як перший крок, а потім задати питання:. Чи є актори, які цікавляться лише читанням файлів та іншим письмом?

Якщо це так, то читання та запис файлів - це два окремих обов'язки. Тому що буде багато джерел змін (багато акторів можуть попросити змінити логіку читання і те саме для написання).

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.