1

我正在用 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 类中吗?或者应该为每个验证创建单独的类并单独调用它们?还有其他建议吗?

4

1 回答 1

1

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

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

Car 是客户端类,您需要客户端代码中的 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();
       }
于 2013-04-16T12:38:37.950 回答