Вопрос дизайна Java - PullRequest
       3

Вопрос дизайна Java

4 голосов
/ 23 ноября 2010

Я работаю над приложением в качестве хобби-проекта. Он написан на Java и является частью системы для расчета схемы декомпрессии для подводного плавания. У меня проблема в классе, в котором хранится мой план погружения, но это не проблема, так как он работает нормально, но у меня сложилось впечатление, что он может быть разработан лучше, поэтому я хотел бы попросить некоторую обратную связь.

Теперь я получил следующее.

Класс DivePlan, который имеет ArrayList of DiveOpperations (ArrayList<DiveOpperation>). Класс DivePlan имеет 3 функции. Один для планирования спуска, один для планирования восхождения и один для планирования плоского погружения на той же глубине. Все эти функции добавляют объект DiveOpperation в ArrayList. Однако подъемы и спуски имеют некоторые другие атрибуты, такие как погружение, которое остается на той же глубине. Например скорость в м / с подъема / спуска. Я установил скорость 0 для плоских погружений, но это не так. Я знаю, что должен создавать отдельные классы, расширяющие DiveOpperation, но таким образом я не знаю, является ли это классом ascent, descent или flatdive, когда я получаю его из массива.

Каким будет хороший дизайн для такой функциональности?

Ответы [ 4 ]

2 голосов
/ 23 ноября 2010

Полиморфное решение этой проблемы - расширить класс DiveOperation на AscentOperation, DescentOperation и FlatOperation и сохранить существующую типизацию ArrayList.Я не уверен, что вам нужно делать это здесь, учитывая, насколько проста реализация.

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

1 голос
/ 23 ноября 2010

Как насчет разрешения переменной verticalSpeed?

При значении 0 DiveOperation представляет собой плавание, а при положительном или отрицательном значении - соответственно подъем или спуск?

Если у вас есть другие свойства, кроме скорости всплытия / спуска, вы, вероятно, захотите превратить DiveOperation в абстрактный класс и создать три подпункта AscentOperation, DescentOperation и FlatDiveOperation. Однако, если я вас правильно понимаю, у вас возникнут проблемы, например, с итерацией, поскольку вы не знаете фактический тип DiveOperation. Эту проблему можно решить либо с помощью большого количества проверок instanceof (некрасиво!), Либо с помощью шаблона посетителя (намного лучше, imo) Возможно, в этом случае у вас может быть что-то вроде DecompressionCalculatorVisitor, которое посещает каждого DiveOperation по очереди.

Взгляните на мой ответ здесь для подробного примера шаблона посетителя.

0 голосов
/ 23 ноября 2010

Расширьте это.Вы можете определить, что это за подкласс (подъем, спуск, плоскость), взяв его из массива и проверив (object instanceof AscentDive) и т. Д.Таким образом, ArrayList, который вы определили в реальности, содержит только «Объекты» с точки зрения JVM.Универсальный шаблон для проверки времени компиляции.Если вы подкласс DiveOperation и определите ArrayList<DiveOperation>, вы всегда можете добавить подкласс в этот список.

0 голосов
/ 23 ноября 2010

Я не уверен, что я точно понял вашу проблему, но 1. Я не думаю, что вы должны знать, что такое настоящий тип DiveOperation.Используйте шаблон команды и просто вызовите метод команды.Команда выполнит свою работу.2. Если вам все еще нужно знать тип, вы можете получить его, используя оператор instanceof.

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