Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/302.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在处理验证时,通常需要关注哪些模式?_C#_Validation_Design Patterns - Fatal编程技术网

C# 在处理验证时,通常需要关注哪些模式?

C# 在处理验证时,通常需要关注哪些模式?,c#,validation,design-patterns,C#,Validation,Design Patterns,我正在用c#创建一个数独游戏 用户可以创建一个新的数独。 我的数独课: public class Sudoku { #region Datamembers private Field[,] grid; private byte blockRows; private byte blockColumns; private Hashtable peers; 用户可以保存新创建的数独。执行此操作时,会执行一些验证。例如:查看是否所有字段都已填充,查看是否所有字

我正在用c#创建一个数独游戏

用户可以创建一个新的数独。 我的数独课:

public class Sudoku
{
    #region Datamembers

    private Field[,] grid;
    private byte blockRows;
    private byte blockColumns;
    private Hashtable peers;
用户可以保存新创建的数独。执行此操作时,会执行一些验证。例如:查看是否所有字段都已填充,查看是否所有字段都为空,查看同一行、列、块中是否没有相同的数字

我的验证结果如下:(它位于数独类)

我想将验证从数独中分离出来,使之成为OOP

我研究了战略模式,因为这看起来像是我可以使用的东西,并且在验证中使用了很多。但就我所理解的模式而言,这毕竟不是我所需要的;这是因为它基于基于某些因素选择验证。我可能错了,但我似乎不明白在我的情况下为什么我需要这样

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

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

iBrakeBehavior应该是您的IValidationHandle 子类是验证类型

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

诸如此类

     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();
       }

您应该有一个ValidationHandle作为抽象,根据您的需要以不同的方式实现它,并将其传递给您的客户机代码。像我记得的那样

iBrakeBehavior应该是您的IValidationHandle 子类是验证类型

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

诸如此类

     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();
       }

我不知道数独游戏,但我认为你们应该使用策略,因为我的导师在我参加软件设计模式课程时给了我一个数独的例子。你们应该有一个ValidationHandle作为抽象,根据你们的需要不同地实现它,并将它传递给你们的客户代码。我记得我不知道数独游戏,但我认为你们应该使用策略,因为我的导师在我参加软件设计模式课程时给了我一个数独的例子。你们应该有一个ValidationHandle作为抽象,根据你们的需要以不同的方式实现它,并将它传递给你们的客户代码。就像我记得的那样,我现在确实有这个。我只是觉得让所有这些分离的类“IdenticalDigits”、“EntirelyFilled”有点奇怪。。所以,谢谢你,我还是会这么做的!是的,嗯;我仍然需要创建单独的类“IdenticalDigits”、“EntirelyFilled”。。它实现了IValidate接口,对吗?IsTrulyValid和isSetup在不必要的替换中有效,以创建一种“逻辑”封装。如果不分离文件,它开始看起来像Façade。Façade通常用于提供API和隐藏混乱的代码。所以分离似乎更适合重用。我现在确实有了这个。我只是觉得让所有这些分离的类“IdenticalDigits”、“EntirelyFilled”有点奇怪。。所以,谢谢你,我还是会这么做的!是的,嗯;我仍然需要创建单独的类“IdenticalDigits”、“EntirelyFilled”。。它实现了IValidate接口,对吗?IsTrulyValid和isSetup在不必要的替换中有效,以创建一种“逻辑”封装。如果不分离文件,它开始看起来像Façade。Façade通常用于提供API和隐藏混乱的代码。所以分离似乎更适合重用。