2

我知道设计模式是由设计而不是由特定代码设置的,但有时我会担心我过多地弯曲模式并且不再遵循设计。

例如,规范模式如下所示:

 public interface ISpecification<T>
{
    bool IsSatisfiedBy(T candidate);
}

但对我来说,这不是很可读:

 _customerAccountIsActive
.And(_hasReachedRentalThreshold)
.And(_customerAccountHasLateFees)
.IsSatisfiedBy(this); 

所以我将其更改为在构造函数中传递候选人:

public abstract class Specification<TEntity> : ISpecification<TEntity>
{
    protected TEntity _candidate;

    public Specification(TEntity candidate)
    {
        _candidate = candidate;
    }

    public bool IsSatisfied()
    {
        return IsSatisfiedBy(_candidate);
    }
}

我什至重载了布尔运算符,所以我可以写这样的东西:

_customerAccountIsActive 
&& _customerAccountHasLateFees
&& _hasReachedRentalThreshold

现在我想从对设计模式更有经验的人那里知道我是否扭曲了太多以及我应该注意哪些风险。

4

1 回答 1

1

您可以在这里找到类似的问题如何调整规范模式来评估对象的组合?. 我和你有同样的问题,我能想到有 2 种改编。

我的问题是在一个规范中比较 2 种不同类型的 TEntity 的 2 个对象。

现在,我正在尝试将第二个实体添加到 IsSatisfied(T 候选人),如下所示: IsSatisfied(T firstCandidate, K secondCandidate)

所以规范将成为规范,但我认为我将失去将规范与规范结合的能力。

到目前为止,我还没有任何关于将第二个候选者添加到规范中的好主意。

我可以想到两种解决方法:

  1. 使用参数对象并将此对象用作候选对象:

    public class ParameterObject<T,K>
    {
      public T FirstObject { get; set; }
      public K SecondObject { get; set; {
    }
    
    
    public SomeSpecification: Specification<ParameterObject<Order, Customer>>
    
    public bool IsSatisfied(ParameterObject candidate)
    {
       // do some check between order and customer candidates.
    }
    
  2. 使用构造函数注入:

    public class OutOfRangeOrderSpeficiation: Specification<Order>
    {
       private ICriteria _criteria;
    
        public OutOfRangeOrderSpeficiation(ICriteria criteria)
        {
           _criteria = criteria;
        }
    
        public bool IsSatisfied(Order candidate)
        {
          // comparing between order candidate and _criteria.
          return false;
        }
    }
    
于 2014-04-29T07:54:10.330 回答