Стиль программирования здорового разработчика

tl;dr:
- один и только один уровень отступов на метод
- использовать ранний выход из метода
- не использовать else
- никаких аббревиатур

Здесь и далее для наглядности используется псевдокод

Уровни вложенности

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

if (ok) {
  callA()
  if (A_ok) {
    callB()
    callC()
    if (B_Ok AND C_ok) {
      callD()
      callE()
      callF()
      callG()
    } else
      throwException("Method A failed")
  } else
    throwException("Method B or C failed")
} else
  throwException()

На лицо все возможные недостатки: - запутанная бизнес-логика - обработчики ошибок далеко от места возникновения самих ошибок - много уровней вложенности - просто много кода

Решением проблема является паттерн IfError:

if (error)
  throwException()

callA()
if (A_error)
  throwException("Method A failed")

callB()
callC()
if (B_error OR C_error)
  throwException("Method B or C failed")

callD()
callE()
callF()
callG()

Преимущества: - разделение обработки ошибок и бизнес логики - обработчики ошибок возле мест возникновения ошибок - один уровень вложенности - меньше кода

Фантастические ELSE и где они обитают

Знаком такой стиль написания кода?

method(argument) {
  if (argument is ok)
    return a
  else if (argument is not ok)
    return b
  else
    return с
}

Что должно произойти, чтоб после return сработал else?! Не нужен тут else, вообще. Здесь и далее паттерн раннего возврата:

method(argument) {
  if (argument is ok)
    return a

  if (argument is not ok)
    return b

  return c
}

return должен быть на первом уровне вложенности всего метода или же на втором, если это ранний возврат

Аббревиатуры

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

method(attrs, args, clss) {
  dump("Attributes", attrs)
  dump("Arguments", args)
  dump("Classes", clss)
}

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