boneferz
@boneferz
Java Developer

Можно ли, из экземпляра класса иметь ссылку на его родителя и пользоваться им?

Нужен совет по ООП.

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

Допустим, у меня есть логический кусок, который я выношу в отдельный класс, но в нем достаточно часто используются члены главного класса. И появляется проблема выбора способа доступа к этим членам. Для решения рассматриваю такие варианты:

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

(какую проблему вижу) повторный код, большой список аргументов (конструктор/метод)

  • в конструкторе доп. класса объявить параметр типа родительского класса, и при создании объекта доп. класса передавать в конструктор this (то есть мы будем получать ссылку на родителя) и по этой родительской ссылке юзать нужные поля

(какую проблему вижу) На сколько я знаю, считается плохой практикой передавать ссылку на родителя в объекты. Экземпляр ничего не должен знать что происходит вверх по иерархии, манипуляции идут Только вниз по иерархии. Правильно?

Не вариант этот кусок кода оставлять на месте.

Работать будет и так и так, но как сделать лучше? I need to best practices.
  • Вопрос задан
  • 195 просмотров
Пригласить эксперта
Ответы на вопрос 3
iLLuzor
@iLLuzor
Java, Kotlin, Android Developer
в конструкторе доп. класса объявить параметр типа родительского класса, и при создании объекта доп. класса передавать в конструктор this (то есть мы будем получать ссылку на родителя) и по этой родительской ссылке юзать нужные поля

Почти так, только реализовать в "родительском" классе интерфейс, который принимать в конструкторе "дополнительного" класса.

Почитайте про dependency inversion
Ответ написан
zagayevskiy
@zagayevskiy Куратор тега Java
Android developer at Yandex
Похоже, что у тебя God object. Общих советов в такой ситуации нет, но описанная тобой ситуация это нарушение инкапсуляции.
Смотри принципы SOLID, думай, как это растащить. Сразу хорошо не получится.
Ответ написан
@ivorobioff
Software Engineer
Думаю что тебе надо все члены из основного класса переместить в доп. класс, и если в основном классе нужен доступ к этим членам, то предоставь геттеры из доп. класса.

Это конечно все в слепую без знания твоего кода но допустим у тебя было что-то типа такого:

public class Car {

    private Integer temperature;
    private Integer oil;
    private Integer fuel;

...

    public Boolean canRun() {
        return temperature < 80 && oil > 50 && fuel > 0;
    }

...

}


и ты решил создать класс Engine куда вынес бы некоторую логику:

public class Engine {

    private Integer temperature;
    private Integer oil;

...

    public Integer getTemperature() {
        return temperature;
    }

    public Integer getOil() {
        return oil;
    }
    
    ...
}


теперь твой код будет выглядеть так:

public class Car {

    private Engine engine;
    private Integer fuel;

...

    public Boolean canRun() {
        return engine.getTemperature() < 80 && engine.getOil() > 50 && fuel > 0;
    }

...

}


но еще лучше привести класс Engine к данному виду:

public class Engine {

    private Integer temperature;
    private Integer oil;

...

    public Boolean canStart() {
        return temperature < 80 && oil > 50;
    }

...

}


и следовательно класс Car будет выглядеть так:

public class Car {

    private Engine engine;
    private Integer fuel;

...

    public Boolean canRun() {
        return engine.canStart() && fuel > 0;
    }

...

}


надеюсь помогло
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы