Получение набора зависимостей для класса, глубоко вложенного в граф зависимостей - PullRequest
2 голосов
/ 15 февраля 2012

Итак, вот моя проблема:

Например, учтите, что:

A File имеет набор Classes, а также Imports.

A Class имеет набор Instance Methods, Static Methods и Variables.

A Instance Method имеет Parameters и Body.

У Body есть ... yadayada.

Проблема при моделировании ОО-способа заключается в том, что Body может потребоваться множество определенных зависимостей для работы:

class Body {
    ...

    public Body(Dependency1, Dependency2, Dependency_n, ...) { }

    ...
}

, что другим классам для запуска не понадобится. Вопрос, который я здесь задаю, заключается в том, как получить эти зависимости до Body без необходимости пропускать все эти зависимости через File, Class и InstanceMethod.

Я мог бы создать BodyFactory, но проблема все равно была бы той же, поскольку мне пришлось бы пропустить BodyFactory через File, Class и InstanceMethod, если я не пропустил что-нибудь.

Как решить эту проблему, не прибегая к синглетонам?

Ответы [ 3 ]

4 голосов
/ 15 февраля 2012

Пусть Body реализует интерфейс IBody и пусть InstanceMethod зависит только от IBody и IEnumerable<IParameter> (если мы предположим C # - в Java это будет интерфейс с другим именем, но принцип будет то же самое).

Повторите этот процесс рефакторинга в Facade Services вплоть до Корень композиции , где вы можете составить весь граф объектов следующим образом:

File file = new File(
    new List<IClass>
    {
        new Class(
             new List<IInstanceMethod>
             {
                 new InstanceMethod(
                     new List<IParameter>(),
                     new Body(
                         new Dependency1()
                         new Dependency2(),
                         new DependencyN()))
             },
             new List<IStaticMethod>(),
             new List<IVariable>())
    },
    new List<IImport>());
0 голосов
/ 15 февраля 2012

Что касается Java, я не думаю, что у вас есть обходной путь, если метод принимает n параметров, тогда вам придется их передавать, поэтому вам придется нести их полностью Чтобы сделать это более элегантным, нужно создать DataWrapper, назвать его BodyBean и передать его до конца.

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

0 голосов
/ 15 февраля 2012

Похоже, вы мечтаете о каком-то каркасе для инъекций. Например Spring Framework .

...