2014-08-27 3 views
0

처음에는 사과드립니다. 특정 문제보다는 디자인 문제가 더 많아서 간단한 답이 없을 수도 있습니다. 어쨌든 트랜잭션을 처리하는 코드가 상당히 복잡합니다. 창고 시스템에서. 트랜잭션 자체는 화면에 입력 할 필드를 결정하는 스위치로 사용자 정의됩니다. 명령 객체를 사용하여 양식을 처리/유효성을 검사합니다. 유효성 검사 단계의 대부분은 간단하지만 일부는 약간 까다롭고 화면 필드간에 상호 종속성이 있습니다. 예를 들어 사용자가 직렬 참조를 입력하라는 메시지가 표시 될 수 있지만 그 상자가 고유하게 식별되지 않으면 그것과 함께 갈 부품에 대해 물어보십시오. 나는이 조합을 검증하기 위해 데이터베이스를 쳤다. 화면에는 사용자가 입력 할 문서 참조가있을 수도있다. 이것은 차례로 부품/시리얼과 상호 참조 될 수있다. 화면에 (데이터베이스를 치는 것에 의해) 파트/시리얼이 문서에 대한 것인지를 확인하십시오. 이것은 트랜잭션에 정의 된 내용에 따라 더 많은 상호 참조 및 유효성 검증을 통해 계속됩니다. 내가 끝내는 것은 '이것이 입력되고 이것이 입력되면 .. validate .. else .. validate'명령 객체에 내용을 입력하면 정말 못생긴 것처럼 보입니다. 그래서 제 질문은 : 유효성 검사 명령 개체 (모든 데이터베이스 검사 등) 또는 어딘가에 그것을 넣어 더 나은 거기에 내가 할 수있는 모든 내 복잡한 모든 경우/다른 사람보다 콤보 명령 개체가 주어진 콤보보다 더 할 수 있습니까? 나는 현재의 명령 객체가 좀더 스폰 할 수있는 부가적인 클래스를 만들려고 생각했다. 그것들을 검증 할 수있게 만들었고 로직을 퍼뜨릴 수 있었다. 만약 누군가가 칩을 사용하고 싶다면 토론에 감사 드린다 ..Grails commandObject - 모범 사례 설계

Joshua의 의견 나는이 완료되지이다 .. 서비스에 코드를 리팩토링 시작했습니다하지만이 정보가 올바른 선택을 수집하는 명령 개체를 사용하여 ..

답변

1

우선

@Transactional 
class TransactionValidationService { 

static enum state { 
    RECEIPT, 
    RECEIPT_SERIAL, 
    RECEIPT_DOCUMENT, 
    RECEIPT_PART, 
    RECEIPT_SERIAL_PART, 
    RECEIPT_SERIAL_DOCUMENT, 
    RECEIPT_PART_DOCUMENT, 
    ISSUE, 
    TRANSFER 
} 

def validateTransaction(TransactionDetailCommand transaction) { 

    // Set initial state .. 

    def currentState 

    switch (transaction.transactionType.processType) { 

     case ProcessType.ISSUE: 
      currentState = state.ISSUE 
      break 

     case ProcessType.RECEIPT: 
      currentState = state.RECEIPT 
      break 

     case ProcessType.TRANSFER: 
      currentState = state.TRANSFER 

    } 

    switch (currentState) { 

     case state.RECEIPT: 

      if (transaction.serialReference) { 
       // validateSerialReference 
       currentState = state.RECEIPT_SERIAL 
      } else if (transaction.documentHeader) { 
       // validateReceiptDocument 
       currentState = state.RECEIPT_DOCUMENT 
      } 

      break 

     case state.RECEIPT_SERIAL: 

      if (transaction.part) { 
       // validatePartSerial 
       currentState = state.RECEIPT_SERIAL_PART 
      } 

      if (transaction.documentHeader) { 
       // validateDocumentPart 
       currentState = state.RECEIPT_SERIAL_DOCUMENT 
      } 

      break 

     case state.ISSUE: 
      break 

     case state.TRANSFER: 
      break 

    } 

} 

을} 모양을 이루고있다.

그러나 사용자 지정 유효성 검사기로 제약 조건 내에서 복잡한 유효성 검사 논리를 구현하는 것은 다소 어려울 수 있습니다. 커맨드 객체에 서비스를 주입 한 다음 사용자 정의 유효성 검사기 내에서 유효성 검사를 서비스에 위임하는 것을 고려할 수 있습니다. 그 예를 들어

@Validateable 
@ToString(includeNames=true) 
class MyExampleCommand { 
    def myValidationService = Holders.grailsApplication.mainContext.myValidationService 

    String someThing 
    Long someValue 
    .. 
    static constraints = { 
    someThing(
     nullable: false, 
     blank: false, 
     size:1..20, 
     validator: { val, obj -> 
     obj.myValidationService.validateSomeThing(obj) 
     } 
    ) 
    ... 
    } 
    ... 
} 
+0

감사합니다 .. 나는 그것이 나를 소요 얼마나 볼 수 있습니다 - 특히 나의 경우 추한, 다른 구조 ... – user3914455

+0

당신은 할 수 있습니다와 FSM에 그 리팩토링 고려 (유한 상태 기계). –

+0

약간의 코드를 살펴보고 내가 올바른 라인에 있다면 알려주시겠습니까? – user3914455