Организация архитектуры программы

245
25 июля 2021, 22:10

У меня есть абстрактный класс

abstract class Parent
{
    private static AtomicLong nextId = new AtomicLong(0); 
    private long id=nextId.incrementAndGet(); // unique object id 
    private long in_id=0;
    private long out_id=0;
    protected long GetInId(){return this.in_id;}
    protected long GetOutId(){return this.out_id;}
    protected void SetInId(long in_id){this.in_id=in_id;}   //left index
    protected void SetOutId(long out_id){this.out_id=out_id;} //right index
}

Есть класс унаследованный от Parent

Каждый экземпляр класса унаследованного от Parent, имеет уникальный идентификатор Переменные in_id и out_id нужны для того чтобы можно было связать между собой несколько объектов в "цепочку", (в дальнейшем нужно для определения порядка вызова некоторых методов этих объектов). Однако появилась проблема, для некоторых объектов in_id и out_id могут быть массивами, я назову дальше эти объекты "нестандартными"

В классе Parent есть много методов, которые нужны в этих нестандартных объектах и было бы логично унаследоваться от него, однако это не даст мне возможности сделать in_id и out_id массивами. Я вижу несколько вариантов решения данной проблемы:

  1. Поля in_id и out_id и методы GetInId(), GetOutId() убрать из абстрактного класса и перенести в наследники, но это дает много избыточного кода
  2. Определить поля in_id и out_id массивами, но для объектов, где не требуется массив делать размер массива 1, но мне кажется это не самым хорошим стилем.
  3. Создать еще 2 интерфейса с методами GetInId() и GetOutId(), которые будут возвращаться long и long[] соответственно. И имплементировать их нужным классам
  4. Создать 2 абстрактных класса ParentSingleValue, ParentArrayValue в них определить методы GetInId() и GetOutId(), чтобы они возвращали long и long[] соответственно и наследоваться их нужными классами

4 решение мне кажется наиболее логичным, т.к. я храню все объекты в HashMap и при работе с объектами из этой Map я могу описать разное поведение по (... instanseof ParentSingleValue) и по (... instanseof ParentArrayValue)

3 вариант мне не очень нравится т.к. он дает мне возможность узнать реализует ли объект интерфейс, но мне придется писать избыточный код реализации GetInId() и GetOutId() в каждом классе.

Может быть есть какие то еще варианты решения данной задачи, или в целом замечания по архитектуре? Возможно есть способы связывания объектов между собой без использования лишних полей, таких как in_id и out_id?

Язык Java.

READ ALSO
Socket pc and Android

Socket pc and Android

Вообщем на компьютере запускается серверК нему должен подключатся клиент с телефона через socket

586
<identifier> expected

<identifier> expected

компилятор выдает

276
Совместить Freemarker и Vue.js

Совместить Freemarker и Vue.js

Есть MVC проект с использованием FreemarkerСтоит задача перевести на микросервисы

136