Какое хорошее соглашение об именах для методов, которые принимают условные действия?

Скажем, у меня есть метод Foo(). Есть только определенные моменты, когда Foo() подходит, как определено методом ShouldFooNow(). Тем не менее, есть много раз, когда программа должна учитывать, подходит ли Foo() в это время. Поэтому вместо написания:

if ShouldFooNow():
   Foo()

всюду, я просто делаю это в одну функцию:

def __name():
    if ShouldFooNow():
       Foo()

Что было бы хорошим именем для этого метода? Мне трудно найти подходящую конвенцию. IfNecessaryFoo() неудобно, особенно если Foo() имеет более длинное имя. DoFooIfShould()? Еще более неудобно.

Что будет лучшим стилем имени?

Ответы

Ответ 1

Я думаю, вы довольно близки. Поместите действие/намерение во имя имени метода, чтобы упростить поиск по алфавиту. Если бы я писал что-то подобное, я бы подумал

FooIfNecessary()
FooIfRequired()

Скажем, например,

ElevatePermissionsIfNecessary()

Ответ 2

Недавно я начал использовать соглашение:

FooIf(args, bool);

Где args - любые аргументы, которые принимает метод, и bool либо ожидает логическое значение, либо какой-либо Func, который разрешает логическое. Затем, в рамках этого метода, я проверяю bool и запускаю логику. Сохраняет такие утверждения до одной строки и выглядит чистым для меня.

Пример в моем коде С# для ведения журнала:

public void WarnIf<T>(T value, string message, Func<T, bool> isTrue)
{
  if (isTrue(value)) _log.Warn(message);
}

Тогда я бы назвал это чем-то вроде:

WarnIf(someObject, "This is a warning message to be logged.", s => s.SomeCondition == true);

(Этот вызывающий может быть неправильным, но вы понимаете... У меня сейчас нет передо мной кода.)

Ответ 3

Вы можете использовать EnsureFoo().

Например, метод EnsurePermissions() при необходимости предпримет соответствующие действия. Если разрешения уже правильные, метод ничего не сделает.

Ответ 4

Ответ Михаэля Петротты (IfNecessary или IfRequired) хорош, но я предпочитаю более короткую альтернативу: IfNeeded.

ElevatePermissionsIfNeeded()

И если вы хотите что-то еще короче, я бы рассмотрел такой префикс, как May или Might:

MayElevatePermissions()
MightElevatePermissions()