JavaRush /Java блог /Random /Кофе-брейк #269. Рефакторинг проблемы if-else hell с помо...

Кофе-брейк #269. Рефакторинг проблемы if-else hell с помощью объектно-ориентированного программирования Java. Для чего нужен HashMap и как он работает

Статья из группы Random

Рефакторинг проблемы if-else hell с помощью объектно-ориентированного программирования Java

Источник: Stack Academic В этой статье рассмотрен практический пример по реорганизации кода if-else hell к более элегантному и объектно-ориентированному дизайну. Кофе-брейк #269. Рефакторинг проблемы if-else hell с помощью объектно-ориентированного программирования Java. Для чего нужен HashMap и как он работает - 1В мире программирования if-else hell является распространенной проблемой, с которой сталкиваются разработчики при работе с условными операторами. По мере увеличения кода управление длинными цепочками операторов if-else становится настоящей головной болью при обслуживании. Исправить такой код можно, прибегнув к объектно-ориентированным принципам программирования. Давайте рассмотрим практический пример с системой обработки онлайн-заказов.

Проблема: if-else hell


public class PaymentProcessor {

    public void processPayment(Order order, String paymentMethod) {
        if ("credit_card".equals(paymentMethod)) {
            processCreditCardPayment(order);
        } else if ("paypal".equals(paymentMethod)) {
            processPayPalPayment(order);
        } else if ("bitcoin".equals(paymentMethod)) {
            processBitcoinPayment(order);
        } else {
            System.out.println("Unsupported payment method");
        }
    }

    private void processCreditCardPayment(Order order) {
        System.out.println("Processing credit card payment for order: " + order.getId());
    }

    private void processPayPalPayment(Order order) {
        System.out.println("Processing PayPal payment for order: " + order.getId());
    }

    private void processBitcoinPayment(Order order) {
        System.out.println("Processing Bitcoin payment for order: " + order.getId());
    }
}

Решение: принятие объектно-ориентированных принципов

Чтобы выполнить рефакторинг этого кода и избежать if-else hell, мы можем использовать объектно-ориентированные принципы. Начнем с определения интерфейса PaymentMethod:

public interface PaymentMethod {
    void processPayment(Order order);
}
Теперь мы создаем отдельные классы для каждого типа транспортных средств, реализуя интерфейс PaymentMethod:

public class CreditCardPayment implements PaymentMethod {
    @Override
    public void processPayment(Order order) {
        System.out.println("Processing credit card payment for order: " + order.getId());
    }
}

public class PayPalPayment implements PaymentMethod {
    @Override
    public void processPayment(Order order) {
        System.out.println("Processing PayPal payment for order: " + order.getId());
    }
}

public class BitcoinPayment implements PaymentMethod {
    @Override
    public void processPayment(Order order) {
        System.out.println("Processing Bitcoin payment for order: " + order.getId());
    }
}
Наконец, реорганизованный класс PaymentProcessor теперь принимает объект PaymentMethod в качестве параметра и вызывает его метод processPayment:

public class PaymentProcessor {

    public void processPayment(Order order, PaymentMethod paymentMethod) {
        paymentMethod.processPayment(order);
    }
}

Преимущества объектно-ориентированного рефакторинга

  • Гибкость: Добавить новый способ оплаты очень просто. Создайте новый класс, реализующий интерфейс PaymentMethod, и существующий код останется неизменным.
  • Разделение ответственности: Каждый способ оплаты инкапсулирован в свой класс в соответствии с принципом единой ответственности.
  • Читаемость: Код более читабелен и следует естественному потоку, что упрощает понимание и поддержку.
  • Тестируемость: Модульное тестирование становится более управляемым, поскольку каждый способ оплаты можно тестировать независимо.
Благодаря объектно-ориентированному подходу код обработки платежей становится более модульным, расширяемым и удобным в обслуживании. Этот дизайн позволяет легко интегрировать новые способы оплаты и соответствует принципам объектно-ориентированного программирования.

Для чего нужен HashMap в Java и как он работает

Источник: Medium Благодаря этому руководству вы улучшите понимание принципов работы HashMap в Java, узнаете его функции и способы более эффективного использования. Будучи одним из самых популярных языков программирования, Java предоставляет разработчикам богатую коллекцию структур данных, облегчающих эффективную и организованную обработку інформации. Одной из таких важных структур данных является HashMap.

Что такое HashMap?

HashMap является частью Java Collections Framework и входит в пакет java.util. Он принадлежит интерфейсу Map и предназначен для хранения пар ключ-значение (key-value). Основное преимущество использования HashMap заключается в его способности обеспечивать постоянную производительность для основных операций, таких как get() и put().

Ключевые характеристики HashMap

1. Пары ключ-значение:

HashMap хранит данные в виде пар ключ-значение (key-value). Каждый ключ связан с уникальным значением, а пара представляет собой единую единицу информации.

2. Нулевые значения:

HashMap допускает нулевые значения как для ключей, так и для значений. Такая гибкость может быть полезной в определенных сценариях, но требует осторожного обращения для предотвращения непредвиденных последствий.

3. Неупорядоченность:

HashMap не гарантирует соблюдения какого-либо определенного порядка элементов. Если порядок важен, рассмотрите возможность использования LinkedHashMap, который поддерживает порядок вставки.

4. Производительность:

HashMap обеспечивает постоянную сложность базовых операций, таких как put() и get(). Однако фактическая производительность может варьироваться в зависимости от таких факторов, как коэффициент нагрузки и стратегии разрешения конфликтов.

Как использовать HashMap в Java

Инициализация:


// Создание HashMap
Map<String, Integer> hashMap = new HashMap<>();

Добавление элементов:


// Добавляем пары ключ-значение
hashMap.put("apple", 10);
hashMap.put("banana", 5);
hashMap.put("orange", 8);

Получение значений:


// Получение значения ключа
int applesCount = hashMap.get("apple");

Итерация через HashMap:


// Перебираем пары ключ-значение
for (Map.Entry<String, Integer> entry : hashMap.entrySet()) {
    System.out.println("Key: " + entry.getKey() + ", Value: " + entry.getValue());
}

Удаление элементов:


//  Удаление пары ключ-значение
hashMap.remove("banana");
Если вы желаете улучшить свое понимание HashMap, рассмотрите возможность изучения документации Oracle по HashMap.
Комментарии
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ