1

Тема: Запропонуйте варіанти поліпшення коду Java

https://replace.org.ua/uploads/images/8929/35f110b5193414a23ec54f4c5970f6b6.jpg

Appl клас використовує об'єкти класу Square. Примінити техніку "інкапсуляції полів" до полів в Square класу і змінити існуючий код. Будь ласка запропонуйте інші рішення для поліпшення якості коду

Таке завдання мені попалося на співбесіді
Такий код може задовольнити інтерв'юера?


public class Square {
    private double x, y;
    private double width;

    public double getX() {
        return x;
    }

    public void setX(double x) {
        this.x = x;
    }

    public double getY() {
        return y;
    }

    public void setY(double y) {
        this.y = y;
    }

    public double getWidth() {
        return width;
    }

    public void setWidth(double width) {
        this.width = width;
    }

    public Square() {
    }

    public Square(double x, double y, double width) {
        this.x = x;
        this.y = y;
        this.width = width;
    }

    public double getPerimetr() {
        return 4*width;
    }
}



public class Appl {
    public void work() {
        Square square = new Square();
        square.setX(2);
        square.setY(3);
    }
}

2

Re: Запропонуйте варіанти поліпшення коду Java

Гетери-сетери - це, загалом, поганий спосіб інкапсуляції. Але тут мало класів для організації взаємодії. Ну і в будь-якому разі ви гетери не використовуєте, так що їх можете пропустити.
Щоб інкапсуляція (та й взагалі ООП-модель) була адекватною, треба мислити саме об'єктами. Ось це

        square.x=2;
        square.y=3;

як можна описати? Напевно, це переміщення квадрата. Так і зробимо:

    public void moveTo(double x, double y) {
        this.x = x;
        this.y = y;
    }
...
    square.moveTo(2,3);

Якщо ж мається на увазі пересування на певний вектор, то можна зробити

    public void moveBy(double x, double y) {
        this.x += x;
        this.y += y;
    }

Головне - при ООП-дизайні думати не про купку даних, а про об'єкт як ціле.

Подякували: leofun011

3

Re: Запропонуйте варіанти поліпшення коду Java

Гетери-сетери - це, загалом, поганий спосіб інкапсуляції
1. Чому поганий?

2. Я так зрозумів ми вважаєте що цей метод

public void work() {
        Square square = new Square();
        square.setX(2);
        square.setY(3);
  }
Потрібно замінити на
public void moveTo(double x, double y) {
        this.x = x;
        this.y = y;
    }

і все, так ?

4

Re: Запропонуйте варіанти поліпшення коду Java

1. Тому що ідея ООП в тому, щоб змусити програміста думати про об'єкти, а не про реалізацію. Реалізацію можна потім замінити, а все має працювати так само, бо інтерфейс залишився незмінним. А якщо у вас не буде x та y, а будуть r та alpha - полярні координати? А якщо координат стане 3? Всюди по коду переписувати .setX()+setY() може бути складно. А от якщо додати клас Point і передавати не 2 координати, а його, то така зміна не призведе до переписування коду, де точки і квадрати якось взаємодіють. Гетери і сетери натякають користувачу, на що він має розраховувати всередині. Але ж розраховувати треба лише на те, що це - квадрат.
2. Не вгадали, перечитайте ще раз.

Подякували: capitaNemo, leofun012