Мне часто нужно использовать функцию, которая выполняет и действие X является условием Y. Каков наилучший способ назвать такую функцию?
Я не хочу повторять утверждения if, поскольку они могут быть сложными.
Например, если я хочу обрезать строку, если свойство задано, функцию можно назвать:
Существуют ли какие-либо соглашения для этой ситуации в С#/.NET или какой-либо другой язык?
Учитывая ограничения, я бы выбрал TrimIfOptionSet
или TrimIfNeeded
.
TryTrim
чувствует, что всегда будет выполняться операция триммирования (в блоке try
), что не является тем же самым, что и его запуск, только если это необходимоConditionalTrim
слишком длинный - глаза читателя остаются на "условном" и никогда не доходят до "обрезки".Попробуйте что-то вроде:
if(IsComplexCondition(complexData))
{
DoThing(otherData);
}
Как правило, вы не хотите связывать условие с операцией, потому что вы делаете одну функцию, захватывая слишком много семантической информации в этой точке. Это "делает больше, чем одно". Вместо этого, если у вас есть сложное условие, зафиксируйте это условие в функции, чтобы инкапсулировать его.
Если вы имеете в виду гораздо более распространенную ситуацию, например, проверку параметров в верхней части функций, рассмотрите что-то вроде плавная проверка параметров. Если вы не делаете что-то вроде проверки параметров, тогда я могу задать вопрос, почему он находится в верхней части каждой функции и не записывается в общем месте или выполняется один раз на границе системы.
Я не думаю, что есть хороший ответ на то, чтобы называть общий случай ActionIfSomething()
просто потому, что он обычно не является хорошим решением проблемы. Я бы просто сказал, что вы вызываете функцию Action()
и документируете ее, возможно, в <remarks>
, чтобы выполнять действие только тогда, когда Something
- true. Если Action
принадлежит условию в функции, то это имеет смысл только в контексте этого условия, поэтому повторное указание его в имени функции является избыточным.
Можно ли это решить с помощью аксессуаров?
public class MyObject
{
private string _content = string.Empty;
public bool Trim { get; set; }
public string Content
{
get
{
return this.Trim ? _content.Trim() : _content;
}
internal set
{
if (string.IsNullOrEmpty(value))
_content = string.Empty;
else
_content = value;
}
}
}
Это приведет к действию, определяемому логикой Trim при каждом обращении к Контенту. Я защитил набор аксессуаров, так как может быть несколько неоднозначно, что происходит, когда значение Content установлено, а Trim - true, и проверено на специальный случай попытки установить контент в null. Хорошая документация должна охватывать эти случаи.