2010-08-18 5 views
4

Java 프로젝트에서 계약을 사용하고 있습니다. (Contract = 메소드의 시작과 끝에서 체크를 함)추상 메소드에 대한 계약을 작성하려면 어떻게해야합니까?

제네릭 메서드에 대한 계약을 작성하는 좋은 방법이나 패턴이 있는지 궁금합니다. 예를 들어 :

public abstract class AbstractStringGenerator{ 
    /** 
    * This method must return a new line as it's last char 
    * @return string output 
    */ 
    public abstract string generateLine(String input); 
} 

는 내가 원하는 generateLine 만족 계약의 출력 (이 경우는, 마지막 문자는 줄 바꿈 문자를해야합니다) 확인하는 좋은 방법입니다.

나는 이것을 할 수 있다고 생각한다. (더 좋은 방법이 있는지 궁금하다.);

public abstract class AbstractStringGenerator{ 

    public string generateLine(String input){ 
     string result = generateLineHook(input); 
     //do contract checking... 
     //if new line char is not the last char, then throw contract exception... 
     return result; 
    } 
    /** 
    * This method must return a new line as it's last char 
    * @return string output 
    */ 
    protected abstract string generateLineHook(String input); 
} 

희망이 너무 애매하지 않습니다. 어떤 도움을 주셔서 감사합니다.

답변

3

Template Method design pattern을 사용할 장소와 비슷합니다. 템플릿 메서드 패턴을 사용하면 일반 알고리즘을 추상 클래스에서 구현하고 마무리 할 수 ​​있지만 일부 기능은 하위 클래스에서 구현할 수 있습니다. 당신은 하위 클래스의 동작을 제어하는 ​​알고리즘을 마무리해야합니다

  • : 템플릿 메소드를 구현하기 위해

    . 서브 클래스가 final 키워드를 통해 템플릿 메서드를 재정의하지 못하도록함으로써 템플릿의 충분한 검사를 구현하여 알고리즘의 불변성을 유지할 수 있습니다.

  • 변경할 수있는 동작을 하위 클래스가 재정의하도록 허용해야합니다. 서브 클래스는이 동작을 완전하게 오버라이드 (override) 할 수 있습니다. 그러한 메소드는 일반적으로, 부모 클래스에서 abstract이며, 서브 클래스가 훅을 구현할 수있는 장소로서 자주 사용됩니다.

템플릿 방법는 대중 방법 때문에 서브 클래스는 "최종"를 추가하는 것을 기억, 나는 그 그것을 할 수있는 좋은 서호주 생각

public abstract class AbstractStringGenerator{ 

    // marked as final. Subclasses cannot override this behavior 
    public final String generateLine(String input){ 
     String result = generateLineHook(input); 
     //do contract checking... 
     //if new line char is not the last char, then throw contract exception... 
     if(!result.endsWith("\n")){ 
      throw new IllegalStateException("Result from hook does not contain new line"); 
     } 
     return result; 
    } 
    /** 
    * This method must return a new line as it's last char 
    * @return string output 
    */ 
    protected abstract string generateLineHook(String input); 
} 


public class ConcreteStringGenerator{ 

    /** 
    * This method overrides the beh 
    * @return string output 
    */ 
    protected String generateLineHook(String input){ 
     return "blah\n"; 
    } 
} 
+0

감사합니다. 템플릿 방법 디자인 패턴이 내가 찾고있는 패턴이었습니다. –

1

바로 그 것입니다. 메서드를 만들고 final 수정자를 사용해야 만 아무도 계약을 다시 작성할 수 없습니다. 이 방법에서는 계약을 확인하고 내부 방법 (generateLineHook(String))을 호출하면 더 이상 할 일이 없습니다.

0

코드 계약을 정기적으로 사용하며 때로는 잘 정의되고 자체 설명하는 방법이있어 계약을 작성하기가 어렵습니다.

Contract.Ensures(result[result.Length-1] == @"\n"); 

또는 비슷한 ....

나 ':

나는 (I 개봉 iContract 또는 무언가를 사용하는 가정)하지만, C#에서/코드 계약 내가 할 거라고 자바에 대해 잘 모릅니다 이 일을하는 더 좋은 방법이 있다는 것을 당신이 의미하는지 모르겠습니다.

+0

고마워,하지만 템플릿 클래스 디자인 패턴 (위의 답변 [위] (http://stackoverflow.com/questions/3510946/how-can-i-write-a-contract-for-an-abstract) -method/3510997 # 3510997)). 제쳐두고, iContract (자체 구현을 사용하고 있습니다)를 추적하고 java 위키 백과에서 다소 긴 목록을 발견했습니다. http://en.wikipedia.org/wiki/Design_by_contract#Languages_with_third-party_support 건배 :) –

1

로 예에서 구현 될 수있다 귀하의 수표를 무시할 수 없습니다.

관련 문제