Ответ
Хороший код — это не только работающий код. Он должен обладать рядом качеств, которые делают его надежным и удобным в долгосрочной перспективе. Основные критерии:
-
Читаемость (Readability): Код должен быть понятен другому разработчику (и вам самим в будущем) без длительного изучения и комментариев. Имена переменных, функций и классов должны четко отражать их назначение. Соблюдается принцип "наименьшего удивления".
-
Простота (Simplicity): Следует избегать излишней сложности. Лучше написать простой и ясный код, чем короткий, но "умный" и запутанный. Важно следовать принципам KISS (Keep It Simple, Stupid) и YAGNI (You Ain't Gonna Need It).
-
Сопровождаемость (Maintainability): Код легко изменять и расширять. Это достигается за счет хорошей структуры, слабой связанности (Low Coupling) и сильной сцепленности (High Cohesion) модулей.
-
Тестируемость (Testability): Код должен быть спроектирован так, чтобы его можно было легко покрыть автоматическими тестами. Для этого стоит избегать глобальных состояний, сильных зависимостей и использовать техники вроде Dependency Injection.
-
Эффективность (Efficiency): Код должен выполнять свою задачу, оптимально используя ресурсы (CPU, память). Однако преждевременная оптимизация — зло. Сначала нужно писать понятный и корректный код, а затем оптимизировать только узкие места, выявленные профилированием.
Пример хорошего кода:
// Названия ясны, логика прозрачна
func CalculateDiscount(price float64, isPremiumClient bool) float64 {
const premiumDiscount = 0.2
const regularDiscount = 0.1
if isPremiumClient {
return price * premiumDiscount
}
return price * regularDiscount
}
Пример плохого кода:
// Непонятные сокращения, "магические" числа
func CD(p float64, iP bool) float64 {
d := 0.1
if iP { d = 0.2 }
return p * d
} Ответ 18+ 🔞
А, слушай, вот это тема, про которую можно дохуя говорить, но в двух словах не объяснишь. Хороший код — это не просто когда программа не падает, а ты сидишь довольный, как слон. Это, блядь, целая философия, ёпта!
Первое и главное — читаемость. Код должен быть таким, чтобы какой-нибудь левый чувак, который пришёл после тебя, не начинал материться через пять минут, пытаясь понять, что тут происходит. Имена переменных — не a, b, c, а нормальные, человеческие, чтобы сразу ясно было, что это за хуйня. Принцип "наименьшего удивления" — это святое. Если функция называется CalculateDiscount, она должна считать скидку, а не, блядь, отправлять письма или форматировать жёсткий диск.
Второе — простота. Тут, сука, многие начинают выёбываться, писать такие конструкции, что сам чёрт ногу сломит. "О, смотри, как я умно в одну строку всё завернул!" А через месяц сам же в этом коде разбираешься, как обезьяна в гранатах. KISS, блядь! Keep It Simple, Stupid! И YAGNI — не делай на будущее то, что тебе прямо сейчас нахуй не нужно. Иначе получится этакая хитрая жопа, которую потом поддерживать — терпения ебать ноль.
Третье — сопровождаемость. Код должен быть таким, чтобы его можно было менять, не боясь, что всё развалится, как карточный домик. Слабая связанность, сильная сцепленность — звучит как порно для архитекторов, но на деле это спасает от многих бед. Чтобы не было ситуации: "Тронул одну кнопку — в рот меня чих-пых, пол-проекта легло".
Четвёртое — тестируемость. Если твой код нельзя нормально покрыть тестами, значит, ты накосячил с архитектурой. Глобальные состояния, жёсткие зависимости — это всё, блядь, мины замедленного действия. Dependency Injection — не просто модное словечко, а реально полезная штука, чтобы не превращать проект в спагетти-код, где всё завязано на одну глобальную переменную godObject.
Ну и эффективность. Да, она важна, но, ёпта, не надо с неё начинать! Сначала пиши так, чтобы было понятно и работало. Потом, если уж реально тормозит — профилируешь и оптимизируешь конкретные места. А то бывает: сидит чувак, оптимизирует цикл из трёх итераций, а по факту проблема в том, что он в каждой итерации, блядь, файл на диск пишет. Ядрёна вошь!
Вот, смотри, пример нормы:
// Всё ясно, как божий день. Премиум-клиент — 20%, обычный — 10%.
func CalculateDiscount(price float64, isPremiumClient bool) float64 {
const premiumDiscount = 0.2
const regularDiscount = 0.1
if isPremiumClient {
return price * premiumDiscount
}
return price * regularDiscount
}
А вот это — пиздец, мрак, вротберунчик:
// Что такое CD? P? iP? d? Магические числа 0.1 и 0.2. Кто это будет читать? Ты через месяц сам забудешь.
func CD(p float64, iP bool) float64 {
d := 0.1
if iP { d = 0.2 }
return p * d
}
Вот и вся разница, понимаешь? Можно написать код, который работает, но выглядит как зашифрованное послание инопланетян. А можно написать так, чтобы и машине было хорошо, и людям, которые после тебя придут, не хотелось тебя мысленно посылать на хуй. Выбирай, блядь.