Следуют ли SOLID чтению и записи файлов две разные обязанности?

13

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

Цель имеет тот же тип файла; Я хочу читать и писать .pdf в моем приложении.

Приложение на Python, если это имеет какое-либо значение.

Воздушные змеи
источник

Ответы:

24

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

Однако, если есть потребители, которые только читают данные без записи или пишут только без чтения, это указывает на то, что с точки зрения интерфейса вы должны отделить эти операции, как предписано Принципом разделения интерфейса. Это означает, что потребители должны определить два интерфейса, от которых они могут зависеть, в то время как Fileкласс будет реализовывать оба интерфейса.

Стивен
источник
8

Когда вы применяете принцип SOLID для проектирования объекта, вы можете считать чтение и запись файла ОДНОЙ обязанностью - работать с постоянными данными

Тем не менее, вы не должны помещать чтение и запись файла в один и тот же метод или функцию.

SergeyLebedev
источник
5

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

Ваше приложение имеет что-то вроде «объекта документа» и сначала записывает это в файл PDF, а затем снова считывает тот же файл в похожий объект документа? Или наоборот, он считывает PDF-документы в документ, вносит в него некоторые изменения и снова сохраняет этот же документ в новый PDF-файл? Тогда чтение и письмо должны рассматриваться как одна обязанность. Это может быть в том случае, если ваше приложение содержит или содержит что-то вроде компонента «Редактор PDF» или «Инструментарий для манипулирования PDF».

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

Специально для PDF этот второй вариант использования является случаем, который я видел гораздо чаще в различных приложениях. Существует намного больше библиотек / компонентов, которые просто поддерживают создание PDF, и только гораздо меньшее количество, которые поддерживают также чтение PDF. Если вы собираетесь использовать одну библиотеку для создания PDF-файлов и совершенно другую для чтения PDF-файлов, то должно быть очевидно, что чтение и запись PDF-файлов будут отдельными обязанностями.

Док Браун
источник
Это похоже на ответ Стивена, но дает конкретный пример.
DavidS
@DavidS: ответ Стивена является очень абстрактным, но, поскольку ОП специально спрашивал о файлах PDF, я думаю, что имеет смысл ответить на этот вопрос более конкретно. А что касается PDF, я не согласен с самым первым предложением Стивена « реализация чтения и записи имеет высокую вероятность быть очень связным» - по моему опыту, для типичных случаев использования PDF верно обратное (я тоже дал ему голос).
Док Браун
Конкретные примеры превосходны. Я просто сравнивал для анализа. Отличный ответ!
DavidS
3

Согласно ( Роберт К. Мартин ) ответственность - это набор функций, которые выполняют один конкретный субъект.

Актер должен быть единственным источником изменения данной ответственности (должна быть только одна причина для изменения).

В вашем случае вы должны сначала определить актеров в качестве первого шага, а затем задать вопросы:. Есть ли актеры, которые заинтересованы только в чтении файлов, а другие пишут?

Если это так, то чтение и запись файлов - это две разные обязанности. Потому что будет несколько источников изменений (многие участники могут попросить изменить логику чтения и то же самое для записи).

Юнесс
источник