Какой из этих подходов к именованию методов лучше и почему?

В моем приложении есть пользователи, которые могут выполнять действия друг над другом - например, тыкать в Facebook.

Я пишу методы только сейчас и не совсем уверен, какой подход выбрать. Я имею в виду, я знаю, что они оба приемлемы, но есть ли более идиоматический подход?

Опция 1

if @current_user.may_poke?(@other_user)
  @current_user.poke!(@other_user)
end

Вариант 2

if @current_user.may_poke?(@other_user)
  @other_user.poke!(@current_user)
end

Первый вариант читается лучше на английском, почти идеально как предложение. Второй вариант имеет больше смысла с точки зрения именования методов, "poke" - это метод, выполняемый над @other_user, @current_user это просто аргумент, чтобы предоставить дополнительную информацию - кто тыкал.

4 ответа

Решение

Я бы остановился на Варианте 1 там... если вы следуете логике условного выражения, то вы спрашиваете: "Если current_user может ткнуть other_user, тогда пусть current_user ткнет other_user". Вариант 2 не имеет особого смысла, если рассматривать его в этих терминах.

Также.. Matz, автор Ruby, заявляет, что "знак взрыва [восклицательный знак] означает" версия взрыва более опасна, чем его аналог, не являющийся аналогом взрыва; Обращаться осторожно"." ( http://www.ruby-forum.com/topic/176830). Я бы, наверное, просто использовал poke для этого имени метода вместо poke!,

Первый вариант кажется более правильным, так как may_poke? указывает на выполнение действия. Для второго варианта используйте имя pokable? (или же pokeable?Правильное написание для этого кого-нибудь?), чтобы указать атрибут сам по себе.

Я говорю: выбери вариант, который ты поймешь быстрее, прочитав его. Это делает код более читабельным и, таким образом, улучшает его (IMO).

В моем случае (для этой конкретной ситуации) я бы выбрал вариант 1.

Если poke это то, что меняет состояние @other_user, затем перейдите к варианту 2. Но имя метода poke предполагает, что получатель и аргумент - наоборот, поэтому, чтобы избежать путаницы, измените имя на что-то вроде poke_by, Я не думаю, что хорошо, если получатель и аргумент поменялись местами для may_poke, Возможно, лучше иметь его таким же образом:

if @other_user.pokable_by?(@current_user)
  @other_user.poke_by(@current_user)
end
Другие вопросы по тегам