看待处理验证通常有哪些模式?

时间:2013-04-16 12:30:20

标签: c# validation design-patterns

我在c#中创建了一个数独。

用户可以创建新的数独游戏。 我的数独课程:

public class Sudoku
{
    #region Datamembers

    private Field[,] grid;
    private byte blockRows;
    private byte blockColumns;
    private Hashtable peers;

用户可以保存新创建的数独。执行此操作时,将执行一些验证。例如:看看是否所有字段都填满,看看是否所有字段都是空的,看看同一行,列,块中是否没有相同的数字......

我的验证最终看起来像这样:(它位于数独类中)

    public bool IsValid()
    {
        bool isValidSetup = this.IsValidSetup();
        if (!isValidSetup) return isValidSetup;

        return this.IsTrulyValid();
    }

    private bool IsValidSetup()
    {
        bool isEntirelyFilled = this.Is_EntirelyFilled();
        bool isEntirelyEmpty = this.Is_EntirelyEmpty();
        bool hasIdenticalDigits = this.Has_IdenticalDigits();

        this.Add_SetupValidationMessages(isEntirelyFilled, isEntirelyEmpty, hasIdenticalDigits);

        return !isEntirelyEmpty && !isEntirelyFilled && !hasIdenticalDigits;
    }

    private bool IsTrulyValid()
    {
        this.Clean();
        this.Solve();
        bool hasNoSolutions = !this.Is_EntirelyFilled();

        bool hasMultipleSolutions = false;
        if (!hasNoSolutions) hasMultipleSolutions = this.Has_MultipleSolutions();

        this.Add_TrulyValidationMessages(hasNoSolutions, hasMultipleSolutions);

        return !hasNoSolutions && !hasMultipleSolutions;
    }

我想从数独分割验证,使其成为OOP。

我查看了策略模式,因为它看起来像我可以使用的东西,并且在验证中经常使用。但据我了解这种模式,它毕竟不是我需要的;原因是因为它基于根据某些因素选择验证。我可能错了,但我似乎无法理解为什么在我的情况下我会需要它。

我在另一个类中需要一个单独的验证(Is_EntirelyFilled())。这是唯一一个不仅用于验证数独的人。 那么,我应该把所有这些验证放在一个类中吗?或者应该为每个验证创建单独的类并单独调用它们?还有其他建议吗?

1 个答案:

答案 0 :(得分:1)

您应该将ValidationHandle设置为抽象根据您的需要以不同的方式实现它并将其传递给您的客户端代码。就像我记得的那样。

IBrakeBehaveior应该是你的IValidationHandle 子项是验证类型。

Car是cllient类,您需要在客户端代码中使用IValidationHandle实例。 您需要在客户端代码中调用IValidationHandleInstance.Validate() 通过多态,它知道如何执行验证。

enter image description here

像这样的东西

     public interface IValidationHandle 
     {
       bool Validate();         
     }

      //TODOs: Separate classes
      public class IsTrulyValidValidator:IValidationHandle;
      public class IsValidValitor:IValidationHandle;
      public class EntirelyFilledValidator:IValidationHandle;

      class Client
      {
           private IValidationHandle validator=null;
           public void SetValidationHandler(IValidationHandle validator)
           {
             this.validator=validator;
           }
            //Where You need call
            validator.Validate();
       }