В этой статье обсуждается принцип DRY.

Один из самых важных принципов кодирования, которому должен следовать каждый программист, — «Не повторяйся» или «СУХОЙ».

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

DRY — это принцип, сформулированный Энди Хантом и Дэйвом Томасом в их книге The Pragmatic Programmer. Этот принцип был определен следующим образом:
"Каждая часть знаний должна иметь единственное, недвусмысленное, авторитетное представление в системе"."

Не волнуйтесь, если это еще не ясно. Теперь давайте рассмотрим пример, в котором мы хотим напечатать факториал трех чисел, во-первых, мы не будем использовать DRY, вот как код будет выглядеть в java и python:

Джава:

public class Main{
   public static void main(String args []){
     int num1 = -1, num2 = 6, num3 = 3;
     int fact1 = 1, fact2 = 1, fact3 = 1;

     // trying to find the factorial of first number
     if(num1 != 0 && num1 != 1 && num1 > 0) {
      while(num1 != 0){
         fact1 *= num1;
         num1 -= 1;
       }
      System.out.println(fact1);
      }
     else if(num1 == 0 || num1 == 1) {
       System.out.println('1');
      }
     else {
      System.out.println("there's no factorial for negative");
     }

     // trying to find the factorial of second number
     if(num2 != 0 && num2 != 1 && num2 > 0) {
      while(num2 != 0){
         fact2 *= num2;
         num2 -= 1;
       }
      System.out.println(fact2);
      }
     else if(num2 == 0 || num2 == 1) {
       System.out.println('1');
      }
     else {
      System.out.println("there's no factorial for negative");
     }

     // trying to find the factorial of third number
     if(num3 != 0 && num3 != 1 && num3 > 0) {
      while(num3 != 0){
         fact3 *= num3;
         num3 -= 1;
       }
      System.out.println(fact3);
      }
     else if(num3 == 0 || num3 == 1) {
       System.out.println('1');
      }
     else {
      System.out.println("there's no factorial for negative");
     }
   }
}

питон:

num1 = -1
num2 = 6
num3 = 3
fact1 = 1
fact2 = 1
fact3 = 1
# trying to find the factorial of first number
if num1 >= 2:
    while num1 != 1:
        fact1 *= num1
        num1 -= 1
    print(fact1)
elif num1 == 0 or num1 == 1:
    print('1')
else:
    print('there is no factorial of negative number')
# trying to find the factorial of second number
if num2 >= 2:
    while num2 != 1:
        fact2 *= num2
        num2 -= 1
    print(fact2)
elif num2 == 0 or num2 == 1:
    print('1')
else:
    print('there is no factorial of negative number')
# trying to find the factorial of third number
if num3 >= 2:
    while num3 != 1:
        fact3 *= num3
        num3 -= 1
    print(fact3)
elif num3 == 0 or num3 == 1:
    print('1')
else:
    print('there is no factorial of negative number')

как вы можете видеть, мы пишем слишком много строк кода для вывода факториала, и если вы посмотрите глубже, вы можете обнаружить, что мы повторяли логику три раза, каждый раз просто заменяя num1 на num 2, а затем с num3.

Приведенный выше пример соответствует подходу WET, который означает «Писать все дважды». ВЛАЖНЫЙ подход противоположен СУХОМУ подходу.

Но что, если вы хотите найти факториал для более чем десяти чисел, вы можете себе представить, насколько огромным был бы код.

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

Джава:

package test;

public class Main{

    public static void fact(int num) {
     int fact = 1;
     if(num != 0 && num != 1 && num > 0) {
      while(num != 0){
         fact *= num;
         num -= 1;
       }
      System.out.println(fact);
      }
     else if(num == 0 || num == 1) {
       System.out.println('1');
      }
     else {
      System.out.println("there's no factorial for negative");
           }
      }

   public static void main(String args []){
     int num1 = -1, num2 = 6, num3 = 3;
     fact(num1);
     fact(num2);
     fact(num3);
   }
}

Питон:

num1 = -1
num2 = 6
num3 = 3
def fact(num):
""" find the factorial of a given number """
    fact = 1
    if num >= 2:
        while num != 1:
            fact *= num
            num -= 1
        print(fact)
    elif num == 0 or num == 1:
        print('1')
    else:
        print('there is no factorial of negative number' )


fact(num1)
fact(num2)
fact(num3)

вы можете заметить разницу в количестве строк, и если мы хотим найти факториал других чисел, нам не нужно снова писать один и тот же блок кода. Вызов функции и готово.

Но преимущество использования драйва не только в том, что он пишет меньше строк кода, но и во многом другом:

ремонтопригодность:

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

повторное использование:

Функция «факт», которую мы создали для вывода факториала числа, она не только для этой программы, на самом деле, если она нам понадобится в совсем другой программе, мы можем использовать эту функцию, и она будет работать нормально.

читабельность:

В результате организации вашего кода на отдельные части и меньшего количества строк вам и другим будет намного проще следовать вашему коду.

И это полезно для некоторых сложных тем, таких как тестирование.

Итак, постарайтесь сделать свой код СУХИМ и избегайте МОКРОГО.