Specification pattern: Difference between revisions

Content deleted Content added
'Image:' > 'File:' update-standardize. WP:LINKs: update-standardize, needless WP:PIPEs > WP:NOPIPEs, section MOS:HEADings deWP:LINK. Template:Furthers add. Small WP:COPYEDITs WP:EoS: WP:TERSE, clarify, 1st MOS:PERSON we fix-cut. Template:Design Patterns Patterns update > Template:Design patterns. WP:CATEGORYs: adds, move. MOS:COMMENT add.
Improve code
Line 56:
public class AndSpecification : CompositeSpecification
{
private ISpecification leftCondition_leftCondition;
private ISpecification rightCondition_rightCondition;
 
public AndSpecification(ISpecification left, ISpecification right)
{
leftCondition_leftCondition = left;
rightCondition_rightCondition = right;
}
 
public override bool IsSatisfiedBy(object candidate)
{
return leftCondition_leftCondition.IsSatisfiedBy(candidate) && rightCondition_rightCondition.IsSatisfiedBy(candidate);
}
}
Line 73:
public class AndNotSpecification : CompositeSpecification
{
private ISpecification leftCondition_leftCondition;
private ISpecification rightCondition_rightCondition;
 
public AndNotSpecification(ISpecification left, ISpecification right)
{
leftCondition_leftCondition = left;
rightCondition_rightCondition = right;
}
 
public override bool IsSatisfiedBy(object candidate)
{
return leftCondition_leftCondition.IsSatisfiedBy(candidate) && rightCondition_rightCondition.IsSatisfiedBy(candidate) != true;
}
}
Line 90:
public class OrSpecification : CompositeSpecification
{
private ISpecification leftCondition_leftCondition;
private ISpecification rightCondition_rightCondition;
 
public OrSpecification(ISpecification left, ISpecification right)
{
leftCondition_leftCondition = left;
rightCondition_rightCondition = right;
}
 
public override bool IsSatisfiedBy(object candidate)
{
return leftCondition_leftCondition.IsSatisfiedBy(candidate) || rightCondition_rightCondition.IsSatisfiedBy(candidate);
}
}
Line 107:
public class OrNotSpecification : CompositeSpecification
{
private ISpecification leftCondition_leftCondition;
private ISpecification rightCondition_rightCondition;
 
public OrNotSpecification(ISpecification left, ISpecification right)
{
leftCondition_leftCondition = left;
rightCondition_rightCondition = right;
}
 
public override bool IsSatisfiedBy(object candidate)
{
return leftCondition_leftCondition.IsSatisfiedBy(candidate) || rightCondition_rightCondition.IsSatisfiedBy(candidate) != true;
}
}
Line 124:
public class NotSpecification : CompositeSpecification
{
private ISpecification Wrapped_wrapped;
 
public NotSpecification(ISpecification x)
{
Wrapped_wrapped = x;
}
 
public override bool IsSatisfiedBy(object candidate)
{
return !Wrapped_wrapped.IsSatisfiedBy(candidate);
}
}
Line 169:
public class AndSpecification<T> : CompositeSpecification<T>
{
private ISpecification<T> left_left;
private ISpecification<T> right_right;
 
public AndSpecification(ISpecification<T> left, ISpecification<T> right)
{
this.left_left = left;
this.right_right = right;
}
 
public override bool IsSatisfiedBy(T candidate) => left_left.IsSatisfiedBy(candidate) && right_right.IsSatisfiedBy(candidate);
}
 
public class AndNotSpecification<T> : CompositeSpecification<T>
{
private ISpecification<T> left_left;
private ISpecification<T> right_right;
 
public AndNotSpecification(ISpecification<T> left, ISpecification<T> right)
{
this.left_left = left;
this.right_right = right;
}
 
public override bool IsSatisfiedBy(T candidate) => left_left.IsSatisfiedBy(candidate) && !right_right.IsSatisfiedBy(candidate);
}
 
public class OrSpecification<T> : CompositeSpecification<T>
{
private ISpecification<T> left_left;
private ISpecification<T> right_right;
 
public OrSpecification(ISpecification<T> left, ISpecification<T> right)
{
this.left_left = left;
this.right_right = right;
}
 
public override bool IsSatisfiedBy(T candidate) => left_left.IsSatisfiedBy(candidate) || right_right.IsSatisfiedBy(candidate);
}
public class OrNotSpecification<T> : CompositeSpecification<T>
{
private ISpecification<T> left_left;
private ISpecification<T> right_right;
 
public OrNotSpecification(ISpecification<T> left, ISpecification<T> right)
{
this.left_left = left;
this.right_right = right;
}
 
public override bool IsSatisfiedBy(T candidate) => left_left.IsSatisfiedBy(candidate) || !right_right.IsSatisfiedBy(candidate);
}
 
Line 225:
{
ISpecification<T> other;
public NotSpecification(ISpecification<T> other) => this.other_other = other;
public override bool IsSatisfiedBy(T candidate) => !other.IsSatisfiedBy(candidate);
}
Line 525:
 
<syntaxhighlight lang="csharp">
var overDueoverdue = new OverDueSpecificationOverdueSpecification();
var noticeSent = new NoticeSentSpecification();
var inCollection = new InCollectionSpecification();
 
// Example of specification pattern logic chaining
var sendToCollection = overDueoverdue.And(noticeSent).And(inCollection.Not());
 
var invoiceCollectioninvoices = ServiceInvoiceService.GetInvoices();
 
foreach (var currentInvoiceinvoice in invoiceCollectioninvoices)
{
if (sendToCollection.IsSatisfiedBy(currentInvoiceinvoice))
{
currentInvoiceinvoice.SendToCollection();
}
}