Это шаблон дизайна? - PullRequest
       9

Это шаблон дизайна?

5 голосов
/ 14 апреля 2009

По всей нашей кодовой базе мы имеем этот повторяющийся паттерн, где есть интерфейс с одним методом. Это настоящий шаблон дизайна? Если да, что это такое и какие будут выгоды?

Вот несколько примеров:

    public interface IRunnable
    {       
        void Run();     
    }

    public interface IAction
    {
        void Perform();
    }

    public interface ICommand
    {
        void Execute(ActionArgs _actionargs);
    }

Ответы [ 8 ]

5 голосов
/ 14 апреля 2009

Я видел это как Шаблон команды .

Впервые я узнал об этом, прочитав Agile Принципы, Шаблоны и Практики в C # .

Я верю, что его элегантность - это простота. Я использовал его, когда написал сервис обработки файлов. Сервис выполняет все функции администрирования чтения / удаления файлов. Когда файл нужно было обработать, был загружен соответствующий плагин. Каждый плагин реализовал метод Process и делал все необходимое для обработки файлов такого типа. (В основном, разобрать содержимое и вставить в базу данных.)

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

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

2 голосов
/ 14 апреля 2009

Как уже было сказано, это Шаблон проектирования команд . Но это (как по мне) больше похоже на Java-способ достижения результата. В C # вы можете использовать делегаты, а в C ++ указатели на функции и функторы.

Нет большого смысла создавать все больше и больше классов, если у вас уже есть некоторая реализация реакции в каком-то методе Class. Который вы можете связать в C ++ или установить делегировать в C #. В Java, я полагаю, у вас нет другого выбора, кроме как написать код, который вы нашли.

2 голосов
/ 14 апреля 2009

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

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

Однако это само по себе является для меня лишь базовой абстракцией интерфейса, а не тем, что я бы классифицировал как шаблон проектирования.

1 голос
/ 14 апреля 2009

Существуют приложения для интерфейсов только с одним методом. Я имею в виду, что в .NET есть много - INotifyPropertyChanged, для одного (событие PropertyChanged). Это просто гарантирует, что у объекта есть определенный метод (независимо от того, к какому типу он относится на самом деле), поэтому вы можете вызвать его (опять же, независимо от типа).

Dim runnableObjects As List(Of Object)
runnableObjects.Add(New MyRunnableObject1)
runnableObjects.Add(New MyRunnableObject2)

For Each o As IRunnable In runnableObjects
  o.Run()
Next
1 голос
/ 14 апреля 2009

Если что, то это функтор. Он используется в языках без функций первого класса (указателя) для того, для чего используются функции (указатели), например, для основной функции потока.

1 голос
/ 14 апреля 2009

Вы можете удалить это повторение (или запретить его для будущего кода), используя лямбда-выражения. Лямбда-выражения как раз для этой ситуации.

1 голос
/ 14 апреля 2009

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

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

Может быть, как предлагали некоторые из предыдущих плакатов: http://en.wikipedia.org/wiki/Command_pattern

0 голосов
/ 14 апреля 2009

Возможно, я что-то упускаю, но первые два выглядят так, как будто они могут быть частью стратегии . По сути, объект имеет член типа IAction, и этот член назначается / переназначается во время выполнения в зависимости от потребностей системы для выполнения задачи определенным образом (то есть с использованием определенной стратегии).

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