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


Интересна Java? Кликай по ссылке и изучай!
Если тебе полезно что-то из того, чем я делюсь в своем блоге - можешь поделиться своими деньгами со мной.
с пожеланием
столько времени читатели провели на блоге - 
сейчас онлайн - 

суббота, 11 июня 2011 г.

Рефакторинг: Замена рекурсии делегированием. Часть 2

В первой части было сформулировано задание - избавиться от рекурсии. Тут я приведу лишь результат рефакторинга, а в результате этом остался всего один класс. Его я назвал OOPTree и поместил в новый пакет. Описание того, как это было пошагово сделано - выложу позже.
package com.binarytree.oop;

import com.binarytree.Node;

public class OOPTree implements Node {
    
    private int value;
    private Node left;
    private Node right;

    public OOPTree(int value) {
        this.value = value;
        left = null;
        right = null;
    }
        
    @Override
    public int getMaxLeafDepth() {
        int depth = 0;
        
        if (left != null) {
            depth = left.getMaxLeafDepth();
        } 
        
        if (right != null) {
            depth = Math.max(depth, right.getMaxLeafDepth());
        } 
                    
        return 1 + depth;            
    }    
    
    @Override
    public void addValue(int newValue) {
        if (newValue < value) {
            if (left == null) {
                left = new OOPTree(newValue);
            } else {
                left.addValue(newValue);
            } 
        } else if (newValue > value) {
            if (right == null) {
                right = new OOPTree(newValue);
            } else {
                right.addValue(newValue);
            } 
        }
    }
    
    @Override
    public String toString() {
        return String.format("(%s, %s, %s)", value, left, right); 
    }    
}

Может показаться, что от рекурсии мы не избавились, потому как каждый из методов (addValue, getMaxLeafDepth и toString) вызывают в своем теле те же методы. Но разница с прошлым в том, что тут вызываются одноименные методы *других объектов*, а это уже скорее делегирование чем рекурсия.

1 комментарий:

  1. Этот комментарий был удален администратором блога.

    ОтветитьУдалить