Это нарушает принципы SOLID?
У меня есть что-то вроде этого в моем проекте, проект, который вроде как уже закончен (он работает), я просто хочу знать, в порядке ли это с принципами SOLID
static public class Tools
{
static public GetProduct(this id){...}
static public GetProductCategory(this id){...}
static public GetUser(this id){...}
// I also have here methods like IsStringNull ...
// IsNull IsFalse, lots of stuff, everything static
}
и использование так
var UserThatCreatedCategoryForThisProduct =
prodId.GetProduct().CategoryId.GetProductCategory().Creator.GetUser();
я знаю, что очевидно, что он нарушает SRP, но этот класс является статическим, и он содержит статические методы, которые не зависят друг от друга, и он одинаков, если бы я создал статический класс для каждого метода
3 ответа
Насколько я вижу, здесь есть много ТВЕРДЫХ нарушений!
- Нарушения принципа единой ответственности - во-первых, у вас есть методы доступа к данным для нескольких классов, во-вторых, у вас есть вспомогательные методы (IsStringNull, IsNull и т. Д.), Связанные с ними.
- Нарушения принципа сегрегации интерфейса (как упомянуто Рубеном) - Если меня интересовали только продукты, зачем мне знакомство с методами, которые привлекают пользователей?
Я уверен, что есть и другие, но это явные.
ОБНОВЛЕНИЕ Теперь, когда кто-то прокомментировал это, я думаю, что они правы; приведенный выше код выглядит так, будто это какая-то форма злоупотребления методом расширения.
Например, я не верю, что доступ к данным следует относить к методам расширения или, что еще хуже, к классу "Инструменты".
Вероятно, было бы более разумно иметь базовый класс (в совершенно другом пространстве имен и / или сборке), который абстрагирует ваши общности доступа к данным, а затем наследует один класс доступа к данным для каждого уникального объекта домена (например, UserDAO, ProductDAO и т. Д.), Поймите, что мое предположение здесь заключается в том, что под GetProduct или GetUser вы на самом деле имеете в виду GetFromDatabase.
Остальные вспомогательные методы принадлежат расширениям, поэтому они в порядке.
Судя по вашим примерам, определенно существует нарушение ISP и SRP и, возможно, нарушение закона Деметры (не ТВЕРДЫЕ, но...).
IMNSHO Вам гораздо лучше читать статьи о SOLID (или покупать гибкие принципы, шаблоны и практики в C# Роберта Мартина и Мики Мартина, которые превосходны и являются одной из самых полезных книг, которые я читал за последние годы) чем просить частичный совет по поводу паутины для такого типа вещей.
Если вам нужен ярлык (хотя вы этого не сделаете - книги и PDF-файлы содержат примеры, которые очень хорошо объясняют вещи!), Эти подкасты Hanselminutes с дядей Бобом очень хороши:
- Hanselminutes Podcast 145 - Твердые принципы с дядей Бобом - Роберт К. Мартин
- Hanselminutes Podcast 171 - Возвращение дяди Боба
редактировать: получил SRP от Jon Limjap и ppiotrowicz
Это нарушает принципы SOLID во многих отношениях.
- он не следует принципу единой ответственности, потому что я не делаю как минимум 3 разные вещи (возвращение продуктов, возвращение клиентов, строковые операции?)
- он нарушает принцип открытого закрытого, будучи не открытым для расширения