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

127
09 июня 2019, 01:40

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

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

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

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

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

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

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

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

Работать будет и так и так, но как сделать лучше? I need the best practices.

Answer 1

Вероятно сама архитектура разделения не совсем удачно вами понимается. И на самом деле ваши классы все еще слишком "большие" (это по сути все-еще один класс, хоть и разделен в два файла).

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

А, вот если идет смешение функций - то вы пытаетесь вырастить "дракона", пусть и многоглавого, но эта зверюга сожрет ваше время и силы.

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

Одна функция = один класс, один класс = одна функция!

Answer 2

В данном случае было бы неплохо знать саму задачу, а не её решения. Думаю можно было бы сделать так, чтобы родительский класс использовал дочерние. Или вообще разбить логику на несколько классов. Как вариант Ваш Родительский класс и Дочерний могут стать классами представляющими какую-либо логику, а поля и данные которые используются Родительским и Дочерним классами можно выделить в отдельный класс. Но опять же все зависит от задачи.

READ ALSO
почему не обновляет драйвера intel?

почему не обновляет драйвера intel?

Установил Помощник обновления системных драйверов от интел, он говорит, что видео драйвер стоит последнийИгрушки на компе работают, появилась...

115
Как при чтении csv файла с помощью opencsv добавить строку в конец последней прочитанной строки?

Как при чтении csv файла с помощью opencsv добавить строку в конец последней прочитанной строки?

Возник такой вопрос, допустим я построчно считываю csv файл,

120
Tomcat смена порта 8080 на 80

Tomcat смена порта 8080 на 80

Почему когда я в томкате в conf/serverxml

95
TimeUtils.millis() Java [дубликат]

TimeUtils.millis() Java [дубликат]

Данный вопрос является точным дубликатом:

96