Рубрики
Без рубрики

СУХОЙ Принцип Был Пересмотрен

СУХОЙ Принцип Пересмотрен Большинство программистов-самоучек или с университетским образованием имеют по крайней мере один… Помеченный java.

Большинство программистов-самоучек или с университетским образованием в свое время соприкоснулись с принципом DRY. Его часто вводят как переход к методам и ООП. Например, если в вашей кодовой базе вы несколько раз вычисляете цену списка покупок:

    void method1(){
        ...
        for(Item item: items){
            price += item.cost;
        }
        price *= 1.13;
        price -= customer.discount();
        ...
    }

    void method2(){
        ...
        for(Item item: items){
            price += item.cost;
        }
        price *= 1.13;
        price -= customer.discount();
        ...
    }

Вас учат инкапсулировать эту логику в метод. Это помогает сохранить вашу кодовую базу небольшой, чистой и простой в обслуживании.

    int calculateCost(Item[] items, Customer customer){
        int cost = 0;
        for(Item item: items){
            cost += item.cost;
        }
        price *= 1.13;
        price -= customer.discount();
        return cost;
    }

Все это прекрасно и стильно, и большинству программистов это нравится. Однако принцип DRY применим не только к вашему коду, он также применим к стандартной библиотеке и библиотекам, которые вы используете.

Давайте начнем с примера, в котором мы хотим создать функцию, которая возвращает разницу между max и min элементом в массиве .

int maxmin_difference(int[] array){
    int min = Integer.MAX_VALUE;
    int max = Integer.MIN_VALUE;

    for(int i: array){
        min = Math.min(min, i);
        max = Math.max(max, i);
    }

    return max - min; // not worrying about integer overflow
}

Большинство разработчиков, если бы они увидели это в обзоре кода, были бы счастливы, это относительно прямолинейно и интуитивно понятно. Однако я бы сказал, что это нарушает принцип DRY, стандартная библиотека Java уже поставляется с Collections.max() и Collections.min() функция.

int maxmin_difference(List array){
    return Collections.max(array) - Collections.min(array); // not worrying about integer overflow
}

Использование этих методов очистит наш код и устранит нюансы, связанные с правильной инициализацией min/max .

PS: Большая часть вдохновения для этого поста, включая этот пример, взята из фантастического выступления Конора Хукстры.

Полагаться на закаленный в боях и тщательно протестированный код – лучший способ предотвратить ошибки и не нарушать DRYOTCAY (не повторяйте Себя или Код вокруг Вас).

Представьте программное обеспечение, которое вы создаете, как конструкцию из блоков Lego, всякий раз, когда вы выбираете деталь, вы можете использовать либо официальный Lego Block ™ , либо самодельный блок Lego.

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

В идеале в вашей программе должна быть только одна строка, вызывающая стандартную библиотеку.

public static void main(String[] args){
    Library.doMyCoolStuff(args);
}

К сожалению, это маловероятно, и потребуется написать пользовательский код. Это совершенно нормально, но пытаться изобретать велосипед для всего, когда функция/библиотека уже существует, – ПЛОХОЕ РЕШЕНИЕ. Вместо этого по-настоящему изучите стандартную библиотеку ваших языков и экосистему доступных вам библиотек. Также, когда вы ищете помощь в Google, не попадайте в проблему XY , ваша проблема, скорее всего, не так уникальна, как вы думаете.

Скопировано с http://kwojcicki.github.io/

Оригинал: “https://dev.to/kwojcicki/the-dry-principle-reexamined-4bjk”