Какое хорошее соглашение об именах для методов, которые принимают условные действия?
Скажем, у меня есть метод 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()