Вы можете использовать шаблон стиля цепочка ответственности , где есть серия классов, каждый из которых отвечает за проверку одного аспекта достоверности и сообщает тип ошибки.
вы передадите ваш Prod
первому классу, который проверит достоверность, если он будет недействительным, он сообщит и вернет false. если он был действительным, он возвращал бы проверку достоверности преемника текущего экземпляра (если он был).
тогда ваш код может просто получить Prod
и передать его в корневую проверку правильности и продолжить, если он сообщил о ложном.
Это также позволит вам легко добавлять новые валидаторы в будущем, потенциально имея возможность делать это без перекомпиляции, в зависимости от того, как вы реализовали построение цепочки валидаторов.
как-то так: (псевдокод, не проверен / не скомпилирован)
public interface IValidator
{
bool IsValid(Product product);
IValidator Successor{get;set;};
}
public class AbstractValidator : IValidator
{
IValidator m_successor=null;
public abstract bool IsValid(Product product);
IValidator Successor
{
get
{
if(m_sucessor==null)
return new AlwaysValidSuccessor();
else
return m_successor;
}
set
{
m_successor=value;
}
}
}
public class NullValidator : AbstractValidator
{
public bool IsValid(Product product)
{
if (product!=null)
{
return Successor.IsValid(product);
}
return false;
}
}
public class ExpiredValidator : AbstractValidator
{
public bool IsValid(Product product)
{
if (product.Expired==false) //whatever you need to do here
{
return Successor.IsValid(product);
}
return false;
}
}
тогда вы используете его:
IValidator validatorRoot = new NullValidator();
validatorRoot.Successor = new ExpiredValidator();
// construct the chain with as many as you need
//then use it
if (validatorRoot.IsValid(Prod)==false)
{
continue;
}