Сравнение шаблонов спецификаций, предикатов Func , а также труб и фильтров

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

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

Рассмотрим следующий интерфейсный контракт для сервисного уровня:

public interface IFooDataService
{
   ICollection GetFoosBySpecification(Specification specification);
   ICollection GetFooByPredicate(Func predicate);
   ICollection GetFooBySearchArgs(FooSearchArgs searchArgs);
}

Итак, некоторые начальные точки: заставляет код говорить по-английски

  • Довольно много кода (интерфейсы, абстрактные классы). Если бы я использовал это, я бы поместил абстракции в общую сборку (чтобы в моем решении не было набора статических файлов).
  • Легко изменить требования, изменив только спецификацию, а не уровень обслуживания.
  • Высочайшая тестируемость логики предметной области (спецификации).
  • Мои мысли о методах расширения (трубы и фильтры):

    • «Весовой» в логике, но все же приводит к той же простоте.
    • Изолировать логику запроса от уровня обслуживания до статические методы
    • По-прежнему требуется «отражение» сортировки (проверка предоставленных аргументов поиска и создание запроса)
    • Позволяет сначала кодировать архитектуру (хранилище, сервисный уровень),

      Что ты думаешь? У кого-нибудь из вас были проблемы с любым из вышеперечисленных методов? Любые рекомендации?

      О том, чтобы начать новый проект, так что эти типы соображений имеют решающее значение.

      Спасибо за помощь.

      РЕДАКТИРОВАТЬ для разъяснения по шаблону спецификации

      Здесь то же самое использование шаблона спецификации.

      Specification someSpec; // Specification is an abstract class, implementing ISpecification members (And, Or, Not, IsSatisfiedBy).
      someSpec = new AllFoosMustHaveABarSpecification(); // Simple class which inherits from Specification class, overriding abstract method "IsSatisfiedBy" - which provides the actual business logic.    
      ICollection foos = fooDataService.GetFoosBySpecification(someSpec);
      

    7
    задан RPM1984 27 August 2010 в 07:09
    поделиться

    2 ответа

    Из моего небольшого опыта:

    1. Требования пользователей всегда меняются, и я не знаю, почему мой босс всегда допускает эти изменения. Так что +1 к Спецификации
    2. Программист здесь больше похож на «работника физического труда», чем на «работника умственного труда». Вы знаете .. тот, кто печатает весь день. Используя спецификацию, я могу убедиться, что все "типируют". Это подтверждается характером моего проекта. Для одной и той же цели требуется много разных реализаций. Не спрашивайте меня, почему.
    3. Используйте шаблон проектирования, обеспечивающий максимальную модульность и гибкость, и, конечно же, возможность тестирования. Вот небольшая история.
      В один прекрасный день мой приятель сказал мне, что он написал класс, который позволяет нам вычислять 32 способа вычисления X. И он уже все это реализовал. Хо-хо, я думаю, это было такое героическое программирование. Он провел несколько недель, делая это посреди ночи. Он считал себя хорошим программистом, поэтому настаивал на том, чтобы все использовали его шедевр.
      В то время мы не заботились о модульном тестировании, поэтому использовали его шедевр. Что случилось потом? Код все время вылетал. Что ж, с того времени я понял, насколько важны юнит-тесты и модульность.
    2
    ответ дан 7 December 2019 в 18:38
    поделиться

    Ну, сначала я бы написал метод Predicate, даже если он используется только как частная деталь реализации для двух других:

    private ICollection<Foo> GetFoosBySpecification(Specification<Foo> spec) 
    { 
        return GetFooByPredicate(f => spec.IsSatisfiedBy(f));
    } 
    

    Функция аргумента поиска будет аналогичной однострочной .

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

    0
    ответ дан 7 December 2019 в 18:38
    поделиться
    Другие вопросы по тегам:

    Похожие вопросы: