나는 "정적 분석을 수행하지 않거나 종종 수행 할 수 없다"는 주장이 어디에서 왔는지 모른다. 주장의 첫 부분은 분명히 잘못되었습니다. 두 번째는 "종종"의 의미에 달려 있습니다. 차라리 말 것 종종 , 그것은 정적 분석을 수행하고 거의 그것에서 실패하지 않습니다. 일반적인 비즈니스 응용 프로그램에서는 거의 결코 가까이 다가 가지 않습니다 .
첫 번째 이점은 다음과 같습니다.
이점 1 : 정적 분석
일반적인 어설 션과 인수 확인에는 단점이 있습니다. 코드가 실행될 때까지 연기됩니다. 반면에, 코드 계약은 코딩 단계에서 또는 애플리케이션을 컴파일하는 동안 훨씬 이전 단계에서 나타납니다. 오류를 빨리 발견할수록 오류를 수정하는 데 비용이 적게 듭니다.
이점 2 : 항상 최신 문서 종류
코드 계약은 또한 항상 최신 의 일종의 문서를 제공 합니다. 메소드의 XML 주석이 0보다 우수하거나 0이어야한다고 SetProductPrice(int newPrice)
지시 newPrice
하면 문서가 최신 상태가 되길 바라지 만 누군가가 메소드를 변경 newPrice = 0
하여을 발생 ArgumentOutOfRangeException
시키지만 해당 문서를 변경하지 않았 음을 발견 할 수도 있습니다 . 코드 계약과 코드 자체의 상관 관계를 고려할 때 동기화되지 않은 문서화 문제가 없습니다.
코드 계약에서 제공하는 문서는 XML 주석이 수용 가능한 값을 잘 설명하지 못하는 경우가 많습니다. 몇 번이나 궁금 경우였다 null
거나 string.Empty
또는 \r\n
방법에 대한 권한이 부여 된 값이고, XML 코멘트는에 침묵했다!
결론적으로 코드 계약이 없으면 많은 코드가 다음과 같습니다.
일부 값은 허용하지만 다른 값은 허용하지 않지만 설명서가있을 경우 추측하거나 읽어야합니다. 실제로 문서를 읽지 마십시오. 구식입니다. 모든 값을 반복하면 예외가 발생하는 것을 볼 수 있습니다. 당신은 또한 반환 될 수있는 값의 범위를 추측해야합니다. 왜냐하면 내가 그것에 대해 조금 더 이야기 할지라도 지난 몇 년 동안 나에게 수백 가지의 변화가 있었기 때문에 사실이 아닐 수도 있습니다.
코드 계약을 통해 다음과 같이됩니다.
title 인수는 길이가 0..500 인 널이 아닌 문자열 일 수 있습니다. 뒤에 오는 정수는 양수 값이며, 문자열이 비어있는 경우에만 0이 될 수 있습니다. 마지막으로 IDefinition
null을 반환 하지 않는 객체를 반환합니다 .
이점 3 : 인터페이스 계약
세 번째 이점은 코드 계약이 인터페이스에 권한을 부여한다는 것입니다. 다음과 같은 것이 있다고 가정 해 봅시다.
public interface ICommittable
{
public ICollection<AtomicChange> PendingChanges { get; }
public void CommitChanges();
...
}
어설 션과 예외 만 사용하여 비어 있지 않은 CommitChanges
경우에만 호출 할 수 있도록하려면 PendingChanges
어떻게해야합니까? 그것이 PendingChanges
결코 결코 보장 되지 null
않습니까?
이점 4 : 분석법 결과 시행
마지막으로, 네 번째 이점은 Contract.Ensure
결과를 얻을 수 있다는 것 입니다. 정수를 반환하는 메서드를 작성할 때 값이 결코 열등하거나 0이 아닌지 확인하려면 어떻게해야합니까? 5 년 후 많은 개발자들의 많은 변화를 겪고 나서? 메소드가 여러 개의 리턴 포인트를 가지 자마자 Assert
유지 보수의 악몽이됩니다.
코드 계약은 코드의 정확성을위한 수단 일뿐만 아니라 코드를 작성하는보다 엄격한 방법으로 고려하십시오. 비슷한 방식으로, 독점적 인 동적 언어를 사용하는 사람은 왜 언어 수준에서 유형을 적용 할 것인지 묻지 만 필요한 경우 어설 션에서 동일한 작업을 수행 할 수 있습니다. 할 수는 있지만 정적 타이핑은 사용하기 쉽고 많은 주장에 비해 오류가 적으며 자체 문서화가 가능합니다.
동적 타이핑과 정적 타이핑의 차이는 일반적인 프로그래밍과 계약에 의한 프로그래밍의 차이에 매우 가깝습니다.