📝 Programming

DRY: Не повторяй себя 🔄

0
Author
04e5cc8b-58ac-4bdc-bdee-661bbb
📅
Published
03.04.2026
⏱️
Reading time
4 min
👁️
Views
9
🌱
Level
Beginner

Представь: ты пишешь код для взлома 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 — и твой код станет идеальным! 🚀

Your reaction to the article

💬 Comments (0)

🔐 Sign in to leave a comment
🚪 Login
💭

No comments yet

Be the first to share your opinion about this article!

🔗 Similar

Similar articles

Continue learning with these materials

📝

Функции: Лучшие практики 🎯

Цель: Научиться писать правильные функции, которые легко читать, тестировать и использовать.

📅 03.04.2026 👁️ 7
📝

Почему комментарии часто излишни в коде? 🤔

Тебе наверняка говорили: "Комментируй свой код!". Но есть секрет: хороший код объясняет себя сам. Комментарии...

📅 03.04.2026 👁️ 6
📝

KISS: Пиши просто, пиши ясно 🎯

Твой код работает? Отлично! Но есть еще один важный критерий — читаемость. Код пишется один...

📅 03.04.2026 👁️ 7

Did you like the article?

Subscribe to our updates and receive new articles first. Grow with PyLand!