Подтвердить что ты не робот

String.IsNullOrEmpty(myString) или string.IsNullOrWhiteSpace(myString) не нарушает правило SRP?

Как показывает вопрос,

Поскольку мы используем строковые функции, такие как IsNullOrEmpty или IsNullOrWhiteSpace, как показывает имя функций, они выполняют больше одного задания, не является ли это нарушением SRP?

скорее, если не будет string.isValid(Enum typeofValidation), чем использовать шаблон strategey, чтобы выбрать правильную стратегию для проверки.

или это нормально, чтобы нарушить SRP в классе утилит или статических классах.

4b9b3361

Ответ 1

SRP говорит, что функция или класс должны иметь только одну причину изменения. В чем причина изменения? Причиной изменения является пользователь, который запрашивает изменения. Таким образом, класс или функция должны иметь только одного пользователя, который запрашивает изменения.

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

IsNullOrEmpty (String) вряд ли будет обслуживать двух разных пользователей. Пользователь, который заботится о нулевом значении, вероятно, тот же пользователь, который заботится о пустом, так isNullOrEmpty не нарушает SRP.

Ответ 2

В объектно-ориентированном программировании принцип единой ответственности гласит, что каждый объект должен иметь одну ответственность

Вы описываете методы: IsNullOrEmpty или IsNullOrWhiteSpace, которые также самоописаны в том, что они делают, они не являются объектами. string несет отдельную ответственность - ответственность за текстовые строки!

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

Ответ 3

SRP применяется к классам, а не к методам. Тем не менее, неплохо иметь методы, которые делают только одну вещь. Но вы не можете дотянуться до крайности. Например, консольное приложение было бы бесполезно, если его метод Main мог содержать только один оператор (и, если оператор является вызовом метода, этот метод также может содержать только один оператор и т.д., Рекурсивно).

Подумайте о реализации IsNullOrEmpty:

static bool IsNullOrEmpty(string s)
{
    return ReferenceEquals(s, null) || Equals(s, string.Empty);
}

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

Если имена методов беспокоят вас, потому что они подразумевают слишком много активности для одного метода, оберните их в свои собственные методы именами, которые подразумевают оценку одного условия. Например:

static bool HasNoVisibleCharacters(string s) { return string.IsNullOrWhitespace(s); }
static bool HasNoCharacters(string s) { return string.IsNullOrEmpty(s); }

В ответ на ваш комментарий:

Скажем, я написал такую ​​функцию, как SerilizeAndValidate (ObjectToSerilizeAndValidate), ясно, что этот метод/класс делает 2 вещи, Serialize и Validation, явно нарушение, некоторые методы времени в классе приводят к кошмару обслуживания, как, например, пример сериализации и проверки

Да, вы правы, чтобы беспокоиться об этом, но опять же, вы не можете буквально иметь методы, которые делают только одну вещь. Помните, что разные методы будут иметь дело с различными уровнями абстракции. У вас может быть очень высокоуровневый метод, который вызывает SerializeAndValidate как часть длинной последовательности действий. На этом уровне абстракции может быть разумно думать о SerializeAndValidate как о единственном действии.

Представьте, что вы создали набор пошаговых инструкций для опытного пользователя, чтобы открыть диалоговое окно "Свойства" :

  • Щелкните файл правой кнопкой мыши
  • Выберите "Свойства"

Теперь представьте, что вы пишете те же инструкции для тех, кто никогда раньше не использовал мышь:

  • Поместите указатель мыши на значок файла
  • Нажмите и отпустите правую кнопку мыши.
  • Появится меню. Поместите указатель мыши над словом "Свойства"
  • Нажмите и отпустите левую кнопку мыши

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

Методы также позволяют выполнять принцип "не повторяй себя" (часто называемый "СУХОЙ" ). Если вам необходимо как сериализовать, так и проверять объекты во многих частях вашего приложения, вам нужно иметь метод SerializeAndValidate для сокращения дублирующего кода. Вам будет очень удобно использовать этот метод как простой удобный метод:

void SerializeAndValidate(SomeClass obj)
{
    Serialize(obj);
    Validate(obj);
}

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

Ответ 4

Я не вижу в этом ничего общего. Это просто убедитесь, что ваша строка проходит требуемое условие.