Почему в шаблоне команд нет стрелок зависимости от клиента к получателю и вызывающему объекту? - PullRequest
1 голос
/ 01 апреля 2020

В OOP существует зависимость, когда класс использует ключевое слово new для создания экземпляра. Относительно Википедии в нотации UML показана зависимость через стрелку с пунктирной линией:

enter image description here

Веб-сайт https://www.dofactory.com/net/command-design-pattern показывает код и его UML для шаблона Command. Код на этом сайте имеет класс клиента (я думаю, что это MainApp), который содержит три раза ключевое слово new для создания экземпляра для получателя, команды и вызывающего.

// Client
class MainApp
{
    /// <summary> 
    /// Entry point into console application.
    /// </summary>
    static void Main()
    {
        // Create receiver, command, and invoker
        Receiver receiver = new Receiver(); // <- no dashed arrow in UML
        Command command = new ConcreteCommand(receiver); // <- dashed arrow in UML
        Invoker invoker = new Invoker(); // <- no dashed arrow in UML

        // [...]
    }
}

abstract class Command
{
    // [...]
}

class ConcreteCommand : Command
{
    public ConcreteCommand(Receiver receiver) : base(receiver)
    {
        // [...]
    }

    // [...]
}

class Receiver
{
    // [...]
}

class Invoker
{
    // [...]
}

You полный код можно найти здесь: https://www.dofactory.com/net/command-design-pattern

Почему UML на этом веб-сайте показывает только зависимость клиента от конкретного command? Потому что клиент также использует ключевое слово new на получателя и вызывающего. Я также ожидаю, что стрелки-получатели будут вызываться и вызываться в UML.

enter image description here

Ответы [ 3 ]

2 голосов
/ 01 апреля 2020

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

1 голос
/ 02 апреля 2020

С точки зрения шаблона проектирования не имеет значения, как объект Command получает от Client, который его создает, до Invoker, который его выполняет. Если Client напрямую передает его в Invoker (и, следовательно, имеет прямую зависимость), это нормально. Если Client сохраняет Command в базе данных, а Invoker позже получает его, это тоже хорошо.

С точки зрения UML, между Client и Invoker нет строки. потому что не должно быть. Добавление этой строки может означать, что необходима зависимость.

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

0 голосов
/ 02 апреля 2020

Всегда есть пользователь или клиент, который использует ваш шаблон где-то в вашем коде. некоторые методы, такие как DI, используют другой способ создания вашего объекта, помещения его в оперативную память и внедрения его в ваш код.

По этой причине и для упрощения во всех UML, где показаны шаблоны Gof, клиент, использующий «новое ключевое слово» в вашем коде для создания объекта.

Так что он просто использует ключевое слово New для покажи нам используя в клиенте. в реальном мире мы используем DI для внедрения нашей зависимости в классы.

Существует также еще одна ценная ссылка, которую вы можете увидеть:

Шаблон команды

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