Это нарушает принципы 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 с дядей Бобом очень хороши:

редактировать: получил SRP от Jon Limjap и ppiotrowicz

Это нарушает принципы SOLID во многих отношениях.

  • он не следует принципу единой ответственности, потому что я не делаю как минимум 3 разные вещи (возвращение продуктов, возвращение клиентов, строковые операции?)
  • он нарушает принцип открытого закрытого, будучи не открытым для расширения
Другие вопросы по тегам