2013-04-16 3 views
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 클래스에 적용해야합니까? 또는 각 유효성 검사에 대해 별도의 클래스를 만들고이를 개별적으로 호출해야합니까? 다른 제안?

+0

같은

enter image description here

뭔가 내가 스도쿠 게임을 모르지만 나는 물론 소프트웨어 디자인 패턴에 참석하는 동안 내 강사 나에게 스도쿠 예를 주었기 때문에 당신이 전략을 사용한다고 생각합니다. –

+0

Abstract로 ValidationHandle이 있어야합니다. 필요에 따라 다르게 구현하고 클라이언트 코드에 전달하십시오. 내가 기억하는 것처럼 그 무엇인가 –

답변

1

사용자는 필요에 따라 다르게 구현 한 ValidationHandle을 클라이언트 코드에 전달해야합니다. 내가 기억하는 그런 것.

IBrakeBehaveior는 IValidationHandle이어야합니다. 하위 유형은 유효성 검사 유형입니다.

자동차는 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(); 
     } 
+0

나는 이것을 실제로 가지고있다. 나는이 모든 분리 된 클래스 'IdenticalDigits', 'EntirelyFilled'를 갖는 것이 다소 이상하다는 것을 알았습니다. 그래서 고마워, 결국 이걸 구현할 것입니다! – dylanmensaert

+0

이 댓글을 쓰기 전에 코드를 보았습니까? –

+0

예, 그렇습니다. 나는 여전히 IValidate 인터페이스를 구현하는 별도의 클래스 'IdenticalDigits', 'EntirelyFilled'를 만들어야합니다. 맞습니까? IsTrulyValid 및 isSetup은 불필요한 대체가 좀 '논리적 인'캡슐화를 만들 때 유효합니다. – dylanmensaert

관련 문제