Принципы проектирования ОО (серия) — DRY
DRY — это факторизация кода.
Эта статья является первой в серии, посвященной передовым методам проектирования. Он обращается к принципу DRY, который переводится как «Не повторяйся». Несмотря на то, что приведенные здесь примеры написаны на Java, принцип DRY является общим для всех языков программирования.
Быстрое определение
Как из книги «Прагматичный программист:
Каждая часть знаний должна иметь единственное, недвусмысленное, авторитетное представление в системе.
Другими словами, каждая бизнес-логика или алгоритм должны существовать в приложении уникальным образом.
Нарушения СУХОГО
Давайте теперь рассмотрим некоторые случаи нарушения этого принципа в языке java.
Дублирование бизнес-логики
В приведенном ниже фрагменте кода бизнес-логика отображения массива элементов дублируется.
Не
public void someMethodWithoutDRY1(String[] arr) {
for (String stringValue : arr) {
System.out.println(stringValue + " ");
}
}
public void someMethodWithoutDRY2(Integer[] arr) {
for (Integer intValue : arr) {
System.out.println(intValue + " ");
}
}
Что делать
Вот код после правильного применения принципа DRY
public void displayWithDRY(Object[] arr) {
for (Object objectValue : arr) {
System.out.println(objectValue + " ");
}
}
public void someMethodWithDRY1(String[] arr) {
displayWithDRY(arr);
}
public void someMethodWithDRY2(Integer[] arr) {
displayWithDRY(arr);
}
Дублирование алгоритма
Давайте теперь рассмотрим ситуацию, когда алгоритм дублируется.
Не
class Rectangle {
double width;
double length;
Rectangle(double width, double length) {
this.length = length;
this.width = width;
}
public double calculateArea() {
return width * length;
}
}
class Square {
double side;
Square(double side) {
this.side = side;
}
public double calculateArea() {
return side * side;
}
}
public static void main(String[] args) {
Rectangle r = new Rectangle(2, 3);
Square s = new Square(2);
System.out.println(r.calculateArea());
System.out.println(s.calculateArea());
}
В приведенном выше фрагменте кода алгоритм, используемый для вычисления площади прямоугольника, дублируется как в классах Rectangle, так и в Square.
Давайте посмотрим, как это исправить.
Что делать
Мы изменим класс Square следующим образом:
class SquareDRY extends Rectangle {
double side;
SquareDRY(double side) {
super(side, side);
}
}
public static void main(String[] args) {
Rectangle r = new Rectangle(2, 3);
Rectangle s = new SquareDRY(2);
System.out.println(r.calculateArea());
System.out.println(s.calculateArea());
}
Вот и все для этого краткого обзора принципа DRY.
Следите, чтобы узнать больше!