На мой взгляд, создание, чтение, обновление и удаление - четыре причины
класс для изменения.
Почему?
Если у меня есть Stack
класс, есть ли Push
и Pop
причины для изменения класса?
Я так не думаю. Это две стандартные операции, которые люди выполняют со стеком. То же самое с CRUD, это простой, хорошо известный набор операций над хранилищем данных.
Теперь ваша базовая технология хранения данных является причиной изменения вашего класса. То есть, если ваша реализация CRUD жестко запрограммирована для работы только с конкретным экземпляром базы данных MS SQL 6.0, то вы нарушаете SRP, и этот класс будет непросто повторно использовать или расширять.
Что касается 4 интерфейсов, то это ближе к другому принципу SOLID, ISP , и необходимость здесь определяется моделями использования вашего хранилища данных. Например, если некоторым классам потребуется только чтение из хранилища данных, имеет смысл извлечь интерфейс с помощью только метода Read и запросить этот интерфейс в качестве аргумента для таких методов. Разделяя этот интерфейс, вы можете позже создать его отдельную реализацию. Кто знает, может быть, для клиентов только для чтения вы можете выполнить более оптимизированный запрос или использовать кэш памяти, но если нет - вы можете просто передать им экземпляр хранилища данных по умолчанию, реализующий этот интерфейс.