Наименование функции: ActionIfCondition ()

2

Мне часто нужно использовать функцию, которая выполняет и действие X является условием Y. Каков наилучший способ назвать такую ​​функцию?

Я не хочу повторять утверждения if, поскольку они могут быть сложными.

Например, если я хочу обрезать строку, если свойство задано, функцию можно назвать:

  • void TrimIfOptionSet (строка) - слишком громоздкий, особенно если условие сложное
  • bool TryTrim (строка) - не упоминает внешнее условие, я бы ожидал, что он учитывает только этот аргумент.
  • void ConditionalTrim (строка) - бит многословный

Существуют ли какие-либо соглашения для этой ситуации в С#/.NET или какой-либо другой язык?

Теги:
naming-conventions
naming

3 ответа

2
Лучший ответ

Учитывая ограничения, я бы выбрал TrimIfOptionSet или TrimIfNeeded.

  • TryTrim чувствует, что всегда будет выполняться операция триммирования (в блоке try), что не является тем же самым, что и его запуск, только если это необходимо
  • ConditionalTrim слишком длинный - глаза читателя остаются на "условном" и никогда не доходят до "обрезки".
4

Попробуйте что-то вроде:

if(IsComplexCondition(complexData))
{
    DoThing(otherData);
}

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

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

Я не думаю, что есть хороший ответ на то, чтобы называть общий случай ActionIfSomething() просто потому, что он обычно не является хорошим решением проблемы. Я бы просто сказал, что вы вызываете функцию Action() и документируете ее, возможно, в <remarks>, чтобы выполнять действие только тогда, когда Something - true. Если Action принадлежит условию в функции, то это имеет смысл только в контексте этого условия, поэтому повторное указание его в имени функции является избыточным.

  • 0
    Хороший аргумент, и я согласен в принципе, но не практично, если 4 строки повторяются очень часто (например, поверх каждой публичной функции). Связь «условие + действие» пахнет плохо, но если бы мне пришлось ее инкапсулировать, что бы лучше ее назвать?
  • 1
    Ах, если вы делаете это в верхней части каждой функции, проверьте кодовые контракты в .Net 4. Я предполагаю, что вы говорите о проверке параметров. Другой вариант - использование «плавных интерфейсов», чтобы сделать проверку параметров более читабельной.
2

Можно ли это решить с помощью аксессуаров?

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. Хорошая документация должна охватывать эти случаи.

  • 0
    Работает для конкретного случая (String.Trim), но не в общем случае ActionIfCondition (например, если я хотел изменить аргумент и не возвращать значение. Спасибо и добро пожаловать в SO :)
  • 0
    В случае безвозвратного значения, я думаю, я бы назвал вещи в соответствии с намерением. Мне сложнее обобщать, но что-то вроде «void Normalize ();», где понимается, что Normalize может оценивать определенные (переменные?) Условия, чтобы определить, каким может быть «Normal». Это особенно верно для публично представленной функциональности. Стиль именования «ActionIfOption» может показывать слишком много деталей реализации внешнему потребителю. Внутренне я не побоялся бы быть достаточно многословным. Это потенциально понятнее тем, кто придет за мной. И спасибо, рад быть здесь.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню