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);
}
Это позволяет вам удобно вызывать один метод, сохраняя при этом отделение логики сериализации от логики валидации, что должно упростить обслуживание программы.