RsD0p9BK
6/6/2017 - 11:20 AM

coding__Single_Responsibility_Principle.md

#Single Responsibility Principle#

В ООП принцип единственной ответственности (англ. The Single Responsibility Principle, SRP) обозначает, что каждый объект должен иметь одну ответственность и эта ответственность должна быть полностью инкапсулирована в класс. Все его поведения должны быть направлены исключительно на обеспечение этой ответственности.

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

В вашем примере я бы сказал, что необходимости в разбиении класса DataBaseInteracting согласно действиям нет. Обязанность "обеспечение хранения данных" достаточно атомарна, на мой взляд, и делить ее на чтение/запись/обновление не нужно. Однако имеет смысл поделить в других плоскостях. Например, если в этом классе есть код построения SQL запросов, то он должен быть вынесен в отдельный класс. Более того, если нужна поддержка нескольких БД, то таких классов должно быть несколько.

Т.о. если возникнет потребность какого-то высокоуровневого изменения в "обеспечении хранения данных", вы будете менять класс DataBaseInteracting. Если обнаружится баг с построением неоптимального запроса, вы будете менять класс, который строит запросы и даже не будете трогать DataBaseInteracting. Если вам нужно будет поддержать новую БД, вы просто добавите новый класс. Понимаете?

При этом все эти классы должны лежать в проекте DAL. И в этом проекте должно лежать только то, что относится к логике взаимодействия с хранилищем (БД в вашем случае). Так вы поддержите SRP на уровне проекта.