Ответ
Помимо SOLID, существуют другие ключевые принципы проектирования ПО:
-
DRY (Don't Repeat Yourself) — избегайте дублирования кода и логики. Повторяющуюся функциональность следует выносить в единый источник (функцию, класс, модуль).
- Почему: Упрощает поддержку, изменения вносятся в одном месте, снижает вероятность ошибок.
-
Пример:
// Нарушение DRY func calculateCircleArea(radius: Double) -> Double { return 3.14159 * radius * radius } func calculateSphereVolume(radius: Double) -> Double { return (4.0 / 3.0) * 3.14159 * radius * radius * radius } // Соблюдение DRY let pi = Double.pi func calculateCircleArea(radius: Double) -> Double { return pi * radius * radius } func calculateSphereVolume(radius: Double) -> Double { return (4.0 / 3.0) * pi * pow(radius, 3) }
-
KISS (Keep It Simple, Stupid) — стремитесь к максимальной простоте и понятности дизайна и кода.
- Почему: Сложный код сложнее понимать, тестировать, поддерживать и в нем легче допустить ошибку.
-
YAGNI (You Aren't Gonna Need It) — не добавляйте функциональность, пока она явно не потребовалась.
- Почему: Разработка "на будущее" тратит время, увеличивает сложность кодовой базы и часто приводит к ненужному коду, который никогда не используется.
-
Composition over Inheritance — отдавайте предпочтение композиции (включению объектов) перед наследованием классов.
- Почему: Композиция обеспечивает большую гибкость, снижает связность и позволяет избежать проблем хрупкой базовой иерархии (Fragile Base Class).
-
Law of Demeter (Принцип наименьшего знания) — модуль должен взаимодействовать только с ближайшими для него объектами (друзьями), а не с их "друзьями друзей".
- Почему: Уменьшает связность между компонентами, делая систему более модульной и устойчивой к изменениям.
-
Пример:
// Нарушение: объект A знает о внутренней структуре объекта B. let value = a.b.c.doSomething() // Соблюдение: A вызывает метод B, а B управляет своими зависимостями. let value = a.getValueFromB()
Ответ 18+ 🔞
А, ну вот, блядь, классику вспомнили! SOLID — это, конечно, круто, но это ж не единственные заповеди в нашем храме программирования. Есть ещё куча других принципов, без которых тоже нихуя не получится. Слушай, сейчас разложу по полочкам, как эти пацаны работают.
DRY (Don't Repeat Yourself) — Не Повторяйся, ёпта! Смысл в чём? Если ты пишешь один и тот же кусок кода в двух местах — ты уже мудак. Потому что завтра придётся менять логику, и ты, сука, забудешь один из этих мест, и всё пойдёт по пизде. Всё, что повторяется — выноси в одно место. Функцию, константу, хоть хуй в стакане — но чтобы было ОДИН РАЗ.
- Зачем? А чтобы не было вот этого: "Ой, бля, я же в трёх файлах это число поменял, а в четвёртом забыл, и теперь продакшн упал". Поддержка — один раз, изменения — одно место. Красота.
- Смотри, как бывает:
// Нарушение DRY (Ты чё, дебил?)
func calculateCircleArea(radius: Double) -> Double {
return 3.14159 * radius * radius // Пи тут жёстко зашито, да ещё и в двух местах
}
func calculateSphereVolume(radius: Double) -> Double {
return (4.0 / 3.0) * 3.14159 * radius * radius * radius // И тут! Овердохуища копипасты!
}
// Соблюдение DRY (Ну вот, уже умнее)
let pi = Double.pi // Вынес нахуй! Один источник истины!
func calculateCircleArea(radius: Double) -> Double {
return pi * radius * radius
}
func calculateSphereVolume(radius: Double) -> Double {
return (4.0 / 3.0) * pi * pow(radius, 3)
}
KISS (Keep It Simple, Stupid) — Делай проще, идиот!
Вот это, блядь, золотые слова. Не надо выёбываться с навороченными паттернами там, где можно тупо if написать. Чем проще код — тем легче его читать тебе через месяц, и какому-нибудь бедолаге, который будет это поддерживать после тебя. Сложность — это рассадник багов, пиздец какой.
YAGNI (You Aren't Gonna Need It) — Тебе это, блядь, не понадобится! О, это про наших фантазёров, которые сразу на три шага вперёд архитектуру закладывают. "А вот тут у нас будет масштабирование, а тут — интеграция с нейросетью для предсказания погоды по цвету кнопки!" Прекрати, ебать! Делай то, что нужно СЕЙЧАС. Всё остальное — это потраченное впустую время, лишняя сложность и куча кода, который только мешает и никогда не заработает. Не выдумывай.
Composition over Inheritance — Композиция рулит, наследование сосёт. Наследование — это как брак, блядь. Связался с одним классом-родителем — и всё, ты от него зависишь по самое не балуйся. Он чихнул — у тебя всё сломалось (Fragile Base Class, слышал про такое?). А композиция — это когда ты не наследуешься, а просто берёшь нужные объекты и включаешь их в себя. Гораздо гибче, проще заменить одну деталь, не разваливая всю иерархию. Предпочитай "иметь" вместо "быть".
Law of Demeter (Закон деметры, или Принцип наименьшего знания) — Не лезь не в своё дело! Представь: ты общаешься с объектом А. И он тебе говорит: "Хочешь значение? Спроси у моего друга Б, у него есть друг В, а у В есть метод, который тебе нужен". Пиздец, да? Ты теперь знаешь всю его подноготную, всю цепочку связей! А если Б поменяет своего друга В на Г? Всё, твой код сломался.
Закон говорит: общайся только с ближайшими "друзьями". Не шарись по чужим карманам.
- Смотри, как не надо:
// Нарушение (Ты что, сыщик, блядь? Зачем тебе знать, что у A есть B, у B есть C, а у C есть метод doSomething?)
let value = a.b.c.doSomething() // Прямой доступ к "другу друга". Хуйня.
- А вот как надо:
// Соблюдение (Спроси у A, а он уж сам разберётся со своими внутренними разборками)
let value = a.getValueFromB() // Идеально! A инкапсулировал свою хуйню.
Вот и все, блядь, базовые принципы. SOLID — это фундамент, а эти ребята — стены, крыша и правила проживания в доме. Запомни их, а то будешь писать код, от которого потом сам же охренеешь.