Добавление рекурсии в алгоритм раскрытия родительских узлов дерева


Исходный код

if currIndex=2 then begin
    // разкрываем выделенные узлы
    TreeView_U.Items[r].Expanded:=true;
    if TreeView_U.Items[r].Parent <> nil then begin
        TreeView_U.Items[r].Parent.Expanded:=true;
        if TreeView_U.Items[r].Parent.Parent <> nil then begin
            TreeView_U.Items[r].Parent.Parent.Expanded:=true;
            if TreeView_U.Items[r].Parent.Parent.Parent <> nil then
                TreeView_U.Items[r].Parent.Parent.Parent.Expanded:=true;
    end
end

Что не так в исходном коде

Рекурсивный по сути алгоритм реализован в виде линейного кода.

Здесь также присутствует запах «завистливый метод», который слишком много знает о внутреннем устройстве узла дерева. Устранять его следует с помощью извлечения метода.

Вариант рефакторинга исходного кода

if currIndex=2 then begin
    TreeView_U.Items[r].Expand;
end
procedure TreeView.Expand;
begin
  Expanded := true;
  if Parent <> nil then
    Parent.Expand
end

Извлечение процедуры сделало очень простым превращение алгоритма в рекурсивный.

Теория