Как называется эта модель? - PullRequest
2 голосов
/ 23 июля 2010

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

Итак, у нас есть такой код:

public void DoA(A a, Transform transform)
{
    foreach(B b in a)
        DoB(b, transform);
}

public void DoB(B b, Transform transform)
{
    if (b != null && b.IsAvailable)
        return;

    foreach(C c in b)
        DoC(c, transform)
}

public void DoC(C c, Transform transform)
{
    var cAndAHalf = DoCAndAHalf(c.FindAll(x => x.Children > 0);

    foreach(D d in cAndAHalf)
        DoD(d, transform);
}

. . .

public void DoX(X x, Transform transform)
{
    Res res = new Res();
    if (x.Selected)
    {
        res.Selected = true;
        res.ResourceCount = 1;
    }

    transform.Add(res);
}

Существуют десятки подобных методов, где каждый метод имеет длину от 3 до 5 строк с одинаковыми именами, обычно содержит тривиальную нулевую проверку или фильтр, и краткий обзор кода показывает, что ни один метод на самом деле не вызывается больше, чем один раз. Методы общедоступны для модульного тестирования.

Лично я считаю, что в этом коде очень сложно ориентироваться, потому что десятки открытых методов == десятки потенциальных точек входа в класс.

Имеет ли этот тип шаблона кодирования имя? Это анти-паттерн? Является ли этот стиль более выгодным, чем простое вложение циклов в одну функцию?

Ответы [ 5 ]

3 голосов
/ 23 июля 2010

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

Цепочка ответственности

В вашем случае это должно выглядеть так:

Action action = new Action;
action = action.SetNext(DoA);
action = action.SetNext(DoB);
action = action.SetNext(DoC);

A a = new A();
action.Process(a);
2 голосов
/ 23 июля 2010

Хлоп. Это должно определенно квалифицироваться как нечто. Не уверен, что это анти-шаблон, хотя. Я бы пошел с антирекурсией.

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

1 голос
/ 23 июля 2010

Это то, что я бы назвал хорошим стилем кодирования - маленькие методы с единственной ответственностью. Если методы имеют правильное имя, это должно привести к простоте понимания и поддержки кода.

Конечно, если многие методы очень похожи, можно найти общий шаблон и выделить его с помощью делегатов или чего-то подобного - но это действительно зависит от реального кода.

0 голосов
/ 23 июля 2010

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

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

public interface ChildProcessor { 
   public void process()
}
public A implements ChildProcessor { 
  public void process() { foreach (B b )... }
}
public B implements ChildProcessor { 
  public void process() { foreach (C c )... }
}

public void DoA(A a, Transform transform)
{
   A.process()... 
}
0 голосов
/ 23 июля 2010

Это похоже на шаблон декоратора, но только на вид.

http://en.wikipedia.org/wiki/Decorator_pattern

Найдите его и посмотрите, соответствует ли он более конкретно вашей кодовой базе.

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