Только один оператор возврата на метод, даже в этом сценарии?

Причина в stri_sub(..., -2). Вам нужно указать от 1 до -2 символов, т.е.

library(stringi)

with(df, ifelse(stri_sub(PlayerName, -1, -1) %in% c('Q', 'Z'), 
                          stri_sub(PlayerName,  1, nchar(PlayerName)-2), PlayerName))

#[1] "Joh"    "Robert" "Alber"  "Jef"

ДАННЫЕ

structure(list(PlayerName = c("JohnQ", "Robert", "AlbertZ", "JeffQ"
), Score = c(75L, 80L, 67L, 88L)), row.names = c(NA, -4L), class = "data.frame")
12
задан Dave M 3 January 2012 в 12:10
поделиться

12 ответов

Откровенно говоря, такие ситуации - то, почему чрезмерно твердые правила плохи.

Точка правил как это должна сделать код более читаемым и удобным в сопровождении, поэтому когда они делают код тяжелее для чтения, они должны быть проигнорированы.

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

25
ответ дан 2 December 2019 в 02:50
поделиться

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

Однако большие функции указывают, что Вы, возможно, должны осуществить рефакторинг код в меньшие более простые функции так или иначе.

8
ответ дан 2 December 2019 в 02:50
поделиться

Лично я думаю

public static string ChopText(string Text))
{
   if(String.IsNullOrEmpty(Text)
      return Text;

   ...
}

прекрасен полностью, если Вам не нравятся они И если это становится большим.

7
ответ дан 2 December 2019 в 02:50
поделиться

"Мне нравится идея наличия только 1 оператора возврата на метод". Объяснить?

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

Плохо:

if (Valid) { do lots of stuff}
else {return};

Чисто:

if (invalid) { return; }
if (invalid2) {return; }

Другой подход:

if (invalid) {
     throws IllegalArgumentException();
4
ответ дан 2 December 2019 в 02:50
поделиться

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

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

2
ответ дан 2 December 2019 в 02:50
поделиться

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

В конце концов, то, что мы ищем, является удобочитаемостью.

2
ответ дан 2 December 2019 в 02:50
поделиться

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

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

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

1
ответ дан 2 December 2019 в 02:50
поделиться

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

4
ответ дан 2 December 2019 в 02:50
поделиться

Действительно необходимо взвесить расходы и доходы выполнения чего-то вроде этого. Будут преимущества наличия только одного оператора возврата перевешивают оборотные стороны необходимости исказить метод, который должен быть довольно прост записать?

Я пошел бы без для этого случая.

2
ответ дан 2 December 2019 в 02:50
поделиться

Правило вытеснено. Простой и простой. Это существует, чтобы помочь плохим программистам написать больше читаемого кода..., и это имело неприятные последствия. Сделайте свой код маленьким и читаемым, и избавьтесь от того глупого правила.

0
ответ дан 2 December 2019 в 02:50
поделиться

Я категорически не согласен с идеей, что «один вход - один выход» приводит к сложному коду. Я только что написал приложение для телефонов Blackberry и Android на Java, которое состоит примерно из 100 файлов, и нет ни одного метода, который не завершился бы в конце. Хотя это приложение с графическим интерфейсом и многопоточное, ни один код не является сложным. Немногие, если какие-либо процедуры, не отображаются на экране полностью. Я занимаюсь проектированием и написанием программного обеспечения на протяжении 46 лет на всех языках и операционных системах, кроме нескольких, и для меня «один вход - один выход» делает код очень простым, легким для чтения и сопровождения. Моя стоимость 0,02 доллара. Извините, если я взъерошил перья.

0
ответ дан 2 December 2019 в 02:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: