Note #38 Go time 102: Application design 📻🎤
В этому выпуске Kat Zień, Peter Bourgon и Ben Johnson обсуждают тему, которая затрагивает каждый Go проект: как лучше всего организовать проект.
Краткое содержание интересных идей из эпизода:
1) выбираем структуру проекта в зависимости от вашего приложения/контекста, полезно лишний раз обсуждать с коллегами
2) никогда не используем “Global state”
3) Используем io.Reader/io.Writer вместо os.Stdout/os.Stdin для того, чтобы передавать buffer в тестах, тем самым контролировать поток ввода/вывода и логирование.
4) tiny main abstraction
func main() {
if err := run(); err != nil {
fmt.FPrintf(os.Stderr, "%s\n", err)
os.Exit(1)
}
}
// dummy
func run() error {
return nil
}
5) Пишем только то, что нужно прямо сейчас.
6) Пишем код который легко удалить, а не тот который легко расширить. 🔪
7) Не следует писать код - лишь бы удовлетворить компилятор, помним: мы пишем код для людей.
8) Фокусируемся на happy path, если пользователь что-то покупает - самое главное это как можно быстрее вернуть результат об успешной транзакции, а не упасть из-за того что лого не подгрузилось или email не отправился.
9) Начинаем с кода который выполняется последовательно и только позже добавляем concurrency.
P.S. От себя добавлю, что очень часто просматриваю как организованы чужие проекты на github. Например недавно, пересмотрел как организованы такие консольные утилиты как (docker, kubectl, helm3, doctl и так далее), что очень часто помогает выбрать наиболее удачную структуру.
https://changelog.com/gotime/102