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 つが必要です。数独の検証に使用されるのはこれだけではありません。では、このすべての検証を 1 つのクラスに入れるだけでよいでしょうか? または、検証ごとに個別のクラスを作成し、個別に呼び出す必要がありますか? 他の提案はありますか?

4

1 に答える 1

1

必要に応じて異なる方法で実装し、クライアント コードに渡す必要があります。私が覚えているように、そのような何か。

サブのものは検証タイプです。

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 に答える