Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Metoda_OOP.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
1.71 Mб
Скачать

5.2.4Вопросы оптимизации кода

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

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

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

/* BaseTree.java */

1 public class BaseTree implements ITree {

2 private INode root;

3 // Особенности реализации

4 public BaseTree() {

5 root = createRoot();// создание корневого узла

6 }

7 }

//~

/* LinkedTree.java */

1 public class LinkedTree extends BaseTree {

2 protected INode createRoot() {

3 return new LinkedNode();

4 }

5 }

//~

/* ArrayTree.java */

1 public class ArrayTree extends BaseTree {

2 protected INode createRoot() {

3 return new ArrayNode();

4 }

5 }

//~

Остается только один неясный момент, а именно метод createRoot() используется в классе BaseTree, поэтому его необходимо определить в этом же классе. Но в то же время мы не знаем, как этот метод должен быть реализован, поскольку это может быть уточнено только в подклассах.

Чтобы решить эту проблему в классе BaseTree необходимо только определить метод createRoot(), но вместо того, чтобы предоставлять реализацию метода – объявить его как абстрактный, тем самым, заставив подклассы определить его реализацию.

Поскольку в классе BaseTree присутствует хотя бы один абстрактный метод, то сам класс также необходимо определить как абстрактный. В этом случае для него лучшим названием будет AbstractTree. Такой принцип именования можно часто встретить в стандартной библиотеке Java. Окончательный вариант базовой реализации дерева будет выглядеть следующим образом:

1 public abstract class AbstractTree implements ITree {

2 private INode root;

3 // Особенности реализации

4 public BaseTree() {

5 root = createRoot(); // создание корневого узла

6 }

7 protected abstract INode createRoot();

8 }

На рисунке 5.6 приведена финальная диаграмма наследования классов и реализации интерфейсов INode и ITree.

Рисунок 5.6 - Диаграмма наследования классов и интерфейсов.