Преобразование строки к координатам


Я собираюсь через книгу в CoffeeScript Тревор Бернем, и мне было интересно, что лучший стиль для функции я писал.

В книге автор пишет функцию вот так:

strToCoordinates = (input) ->
    halves = input.split(',')
    if halves.length is 2
        x = parseFloat halves[0]
        y = parseFloat halves[1]
        if !isInteger(x) or !isInteger(y)
            console.log "Each coordinate must be an integer."
        else if not inRange x - 1, y - 1
            console.log "Each coordinate must be between 1 and #{GRID_SIZE}."
        else
            {x, y}
    else
        console.log 'Input must be of the form `x, y`.'

Я написал функцию вот так:

strToCoordinates = (input) ->
    halves = input.split(',')
    if halves.length isnt 2
        console.log 'Please enter coordinates in format: x,y'; return
    [x, y] = (parseFloat s for s in halves)
    unless isInteger(x) and isInteger(y)
        console.log 'The coordinates must be integers.'; return
    if not inRange(x, y)
        console.log "Coordinates must be between 1 and #{GRID_SIZE}."; return
    {x, y}

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

Мне нравится тот факт, что при таком стиле сообщения об ошибках сразу после регистрации, в отличие от С , если/еще, а также вы не должны иметь большие разделы с отступом.



882
4
задан 1 июня 2011 в 11:06 Источник Поделиться
Комментарии
3 ответа

Ну я сейчас не в CoffeeScript, но думаю, что я могу читать это :D

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

strToCoordinates = (input) ->
halves = input.split(',')
if halves.length isnt 2
console.log 'Please enter coordinates in format: x,y';
return

[x, y] = (parseFloat s for s in halves)
unless isInteger(x) and isInteger(y)
console.log 'The coordinates must be integers.';
return

if not inRange(x, y)
console.log "Coordinates must be between 1 and #{GRID_SIZE}.";
return

{x, y}

Но это действительно незначительные спорный твик (некоторым понравится, некоторым нет, я делаю).
Еще один момент, было бы "чрезмерное" возвращается. Функции легче читать, если они имеют ЛСС возврата заявления. Но, повторюсь, это обычно применяется только больше функций.

4
ответ дан 2 июня 2011 в 10:06 Источник Поделиться

Я не очень люблю прятать доходы от конца строки, поэтому ставить их на отдельные строки (или возвращаясь к оригиналу) будет предпочтительнее.

Однако, я бы на самом деле рассмотреть вопрос об использовании постфиксного если. Это сделало бы код такой

strToCoordinates = (input) ->
halves = input.split(',')
return console.log 'Please enter coordinates in format: [x,y]' if halves.length isnt 2
[x, y] = (parseFloat s for s in halves)
return console.log 'The coordinates must be integers.' unless isInteger(x) and isInteger(y)
return console.log "Coordinates must be between 1 and #{GRID_SIZE}." unless inRange(x, y)
{x, y}

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

3
ответ дан 9 июля 2011 в 08:07 Источник Поделиться

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

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

 if isnt 2 and 3 
...
if 2
...
elseif 3

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

1
ответ дан 2 июня 2011 в 12:06 Источник Поделиться