Представь: ты пишешь код для взлома 10 систем. Копируешь функцию hack_system() 10 раз. Потом находишь баг — и приходится исправлять в 10 местах! 😱
Есть принцип, который спасает от этого кошмара: DRY.
🎯 Что такое DRY?
DRY = Don’t Repeat Yourself (“Не повторяй себя”)
Главная идея: Каждый кусочек знания должен иметь единственное, однозначное представление в системе.
Проще говоря: одна задача = один кусок кода.
🔴 Проблема: Дублирование кода
Пример 1: Копипаста в хакер-симуляторе
❌ Плохо:
# Прогресс-бар для сканирования
print("Сканирование...", end="")
for i in range(10):
print("█", end="", flush=True)
time.sleep(0.1)
print(" Готово!")
# Прогресс-бар для взлома
print("Взлом...", end="")
for i in range(10):
print("█", end="", flush=True)
time.sleep(0.1)
print(" Готово!")
# Прогресс-бар для обхода файрвола
print("Обход файрвола...", end="")
for i in range(10):
print("█", end="", flush=True)
time.sleep(0.1)
print(" Готово!")
Что не так?
- ❌ Один и тот же код повторяется 3 раза
- ❌ Если нужно изменить анимацию — меняй в 3 местах
- ❌ Легко сделать ошибку (забыть flush=True в одном месте)
- ❌ Занимает много места
✅ Хорошо:
def progress_bar(text):
"""Показывает прогресс-бар для любой операции"""
print(f"{text}...", end="")
for i in range(10):
print("█", end="", flush=True)
time.sleep(0.1)
print(" Готово!")
# Используем одну функцию для всех операций
progress_bar("Сканирование")
progress_bar("Взлом")
progress_bar("Обход файрвола")
Что изменилось?
- ✅ Код написан один раз
- ✅ Изменения делаются в одном месте
- ✅ Легко добавить новые операции
- ✅ Меньше ошибок
🟢 Пример 2: Повторяющиеся проверки
❌ Плохо:
def hack_easy_system():
if difficulty == "easy":
print("🟢 Взлом легкой системы...")
return True
return False
def hack_medium_system():
if difficulty == "medium":
print("🟡 Взлом средней системы...")
return True
return False
def hack_hard_system():
if difficulty == "hard":
print("🔴 Взлом сложной системы...")
return True
return False
✅ Хорошо:
def hack_system(difficulty):
"""Взлом системы любой сложности"""
colors = {"easy": "🟢", "medium": "🟡", "hard": "🔴"}
print(f"{colors[difficulty]} Взлом {difficulty} системы...")
return True
🔵 Пример 3: Повторяющиеся данные
❌ Плохо:
# Разбросанные данные по коду
print("Хакер: Neo")
print("Уровень: 5")
# В другом месте
print("Имя: Neo")
print("Уровень: 5")
# И еще где-то
print(f"{Neo} - уровень {5}")
✅ Хорошо:
hacker = {
"name": "Neo",
"level": 5
}
# Используем данные из одного источника
print(f"Хакер: {hacker['name']}")
print(f"Уровень: {hacker['level']}")
print(f"{hacker['name']} - уровень {hacker['level']}")
🛠 Как применять DRY?
1. Используй функции
Повторяющиеся блоки кода → функция
# Было
result1 = (a + b) * 2
result2 = (c + d) * 2
# Стало
def double_sum(x, y):
return (x + y) * 2
result1 = double_sum(a, b)
result2 = double_sum(c, d)
2. Используй циклы
Повторяющиеся вызовы → цикл
# Было
hack_system("192.168.0.1")
hack_system("192.168.0.2")
hack_system("192.168.0.3")
# Стало
targets = ["192.168.0.1", "192.168.0.2", "192.168.0.3"]
for target in targets:
hack_system(target)
3. Используй параметры
Похожие функции → одна с параметрами
# Было
def hack_with_easy_password():
return try_password("1234")
def hack_with_medium_password():
return try_password("qwerty123")
# Стало
def hack_with_password(password):
return try_password(password)
4. Используй структуры данных
Повторяющиеся переменные → словарь или список
# Было
target1_ip = "192.168.0.1"
target1_port = 8080
target2_ip = "192.168.0.2"
target2_port = 8080
# Стало
targets = [
{"ip": "192.168.0.1", "port": 8080},
{"ip": "192.168.0.2", "port": 8080}
]
⚠️ Когда можно НЕ следовать DRY?
1. Код похож, но логика разная
# Это выглядит похоже, но делает разное
def encrypt_password(text):
return hash(text) # Одностороннее шифрование
def encrypt_message(text):
return caesar_cipher(text) # Двустороннее шифрование
Не стоит объединять, хоть код и похож — смысл разный.
2. Объединение усложняет код
❌ Плохо (слишком сложно):
def universal_hack(type, target, method, password=None, key=None, algorithm=None):
if type == "system":
if method == "brute":
return brute_force(target, password)
elif method == "key":
return use_key(target, key)
elif type == "database":
# ...еще 20 строк условий
✅ Лучше:
def hack_system_brute(target, password):
return brute_force(target, password)
def hack_system_key(target, key):
return use_key(target, key)
def hack_database(target, algorithm):
# Отдельная логика
Иногда несколько простых функций лучше, чем одна сложная.
📝 Чек-лист: Проверь свой код на DRY
- [ ] Есть ли в коде копипаста? (одинаковые или похожие блоки)
- [ ] Можно ли заменить повторяющийся код функцией?
- [ ] Можно ли заменить повторяющиеся вызовы циклом?
- [ ] Можно ли объединить похожие функции с помощью параметров?
- [ ] Хранятся ли повторяющиеся данные в одном месте?
- [ ] Не усложнит ли объединение кода его понимание?
🎓 Итого
Принцип DRY: Не повторяй себя — пиши код один раз, используй много раз.
Зачем?
- ✅ Меньше ошибок (исправление в одном месте)
- ✅ Легче поддержка (изменения в одном месте)
- ✅ Короче код (меньше строк)
- ✅ Проще понимать (меньше дублирования)
Как?
- Используй функции вместо копипасты
- Используй циклы вместо повторяющихся вызовов
- Используй параметры вместо похожих функций
- Храни данные в одном месте
Запомни: Хороший код читается как книга — без повторов и скучных моментов! 📚✨
Следующий шаг: Объедини DRY с принципом KISS — и твой код станет идеальным! 🚀
💬 Comments (0)
No comments yet
Be the first to share your opinion about this article!