2010-07-22 4 views
6

저는 프로그래머가 인터페이스에서 불변 조건 (사전 조건 및 사후 조건)을 지정할 수있는 Java 프레임 워크를 만들려고했습니다. 그 목적은 코드를보다 강력하게 만들고 동일한 인터페이스의 여러 구현에 대해 작성해야 할 단위 테스트 수를 줄이는 것입니다.Java에서 인터페이스에 불변량 추가

프로그래머가 작성하는 불변량을 사용하여 메소드에 주석을 추가하는 몇 가지 방법을 만듭니다. E.G.

interface Sort { 
    int [] sort(int [] nums); 
} 

는 모든 구현은 정렬 된 목록을 반환 할 수 있도록 주석 장식 될 것이다. 이 주석은 모든 구현에 대해 컴파일 타임에 실행될 수있는 단위 테스트와 연결됩니다.

이것은 미친 아이디어입니까, 아니면 더 광범위한 프로그래밍 커뮤니티에 유용할까요?

+0

단위 테스트를 연결하는 것이 컴파일 타임 동안 좋은 방법인지 확실하지 않습니다. _ 시험이 통과 되었기 때문에 무언가를 알았습니까? 애스펙트 위버를 사용하는 것이 더 나은 방법 일 수 있습니다. (다음 질문은 성능이 될 것입니다.) – yclian

+2

@yclian, 저는 생각합니다. 이러한 생각은 순서와 순서로 쓰여질 필요가있는 단위 테스트의 수를 줄이기 위해 다양한 정적 분석을 수행하기 위해 사전 조건과 사후 조건을 사용하는 것이라고 생각합니다. 동등한 적용 범위를 얻을 수 있습니다. 정적 분석이 안전하다고 증명할 수 없다는 진술을 보호하기 위해 런타임 어설 션을 사용할 수는 있지만 실행 시간이 될 것이라는 암시는 전혀 볼 수 없었습니다. – Gian

답변

4

JMLESC/Java과 관련이있는 것처럼 들리는데,이 두 가지 기술은 일반적인 기술로 제공되는 것보다 약간의 소프트웨어 품질을 필요로하는 프로젝트에서 합리적으로 널리 채택 된 것으로 나타났습니다.

+0

감사합니다. JML – Tarski

+1

을 한번 들었습니다. 들어 본 적이 없습니다. "합리적으로 널리 채택"- 데이터, 제발. 내가 한 두두 가지 프로젝트를 제외하고는이 진술에 대한 근거가 없다는 걸 확신 할 수 있습니다. – duffymo

+1

@duffymo, 나는 공격적인 음색이 필요하다고 생각하지 않습니다. 나는 "합리적으로 널리 보급 된"입학 자격을 얻었습니다. 나는 그것이 적어도 내가 알고있는 몇몇 대학에서 가르쳐졌으며 JML 도구의 생태계는 매우 건강하다는 사실에 근거하여 (http://en.wikipedia.org/wiki/Java_Modeling_Language#Tool_Support), 대부분의 전문 엔지니어는 최소한 JML에 대해 잘 알고있을 것입니다. JML (http://scholar.google.com/scholar?hl=en&q=java+modeling+language)을 다루는 피어 리뷰 간행물도 꽤 많이 있습니다. – Gian

0

어떤 위대한 프로그래밍 아이디어가 미친 짓 아니야 !!! 나는 그것이 유용 할 것이라고 생각한다.

+2

동의하지만, 이것이 코멘트가 아니어야합니까? – whiskeysierra

1

Bertrand Meyer의 계약 아이디어 프로그래밍은 대부분 죽었습니다. 그는 에펠에 사전 조건과 사후 조건을 만들었지 만, 그 언어는 사용법에있어서 라틴어 밑에있다.

계약 라이브러리에 의한 Java 프로그래밍이 있습니다. Contractor은 하나입니다. 그러나 그 날은 이미 지나갔습니다. 실은 런타임 비용이 그만한 가치가 없었기 때문에 에펠 (eiffel)조차도 제품을 생산하지 못하게하는 방법이있었습니다.

스택 오버플로에 대한 6 개의 에펠 질문 - 참으로 작은 비율. "계약서"가있는 SO 태그를 검색하면 매우 작은 숫자가 표시됩니다. 이 사이트의 주제에별로 관심이 없습니다. 그것은 세계에서 가장 많은 전문 프로그래머들을 끌어 들이고 있다고 주장합니다.

+0

흥미로운 전망. 테스트 주도 개발은 계약에 의한 설계보다 나은 접근 방법이라고 생각하십니까? – Tarski

+0

"테스트 주도 개발은 계약에 의한 설계보다 더 나은 접근이라고 말합니까?" - 절대적으로. 런타임 패널티는 없습니다. 그들은 수업의 행동에 관한 더 나은 정보를 제공합니다; 그들은 계약보다 훨씬 잘 문서화한다. 선택의 여지가 있다면 차라리 테스트를 해보겠습니다. – duffymo

+3

나는 그들이 계약보다 훨씬 잘 문서화하고 있다고 말하지 않을 것이다. TDD를 사용하면 기능을 확장하기 위해 몇 가지 입력을 테스트 할 수 있지만 연락처는 기능이 실제로하는 기능을 추상적으로 정의 할 수 있습니다. 예 : sum (1, 2) = 3 – Tarski

2

계약에 의한 디자인은 좋은 아이디어라고 생각합니다. 자바에서 그 기능을 제공하는 프레임 워크를 훑어 보았습니다. 나는 이런 종류의 프레임 워크를 팀에서 구매하는 것이 어려울 수 있다는 점을 다시 생각하게되었습니다. 나는 학문적 관심사로만 인식되는 것이 이상하다고 생각합니다. 실제로 코드 내에 단위 테스트를 포함하는 것과 같습니다.

자바의 주된 논점 인 assert 문은 몇 년 전부터 사용되었지만 거의 사용되지 않습니다. 자주 작성한 코드에서만 사용됩니다. 어설 션을 사용할 때 (특히 단위 테스트와 결합하여) 많은 마일리지가 있으며, 몇 가지 버그를 발견했습니다. 사람들이 사용하지 않는 것이 유감입니다.

건배,

이안.

+0

나는 주장이 불충분하다고 당신에게 동의합니다. 방금 SCJP 시험을 마쳤으며 Sun은 개인 방법에 대한 사전 조건을 확인하기 위해 어설 션을 사용하도록 권장합니다. 그러나 실제로, 사후 조건을 확인하기 위해 이들을 사용하는 것을 막을 수있는 방법은 없습니다. 어설 션과 관련된 문제는 기본적으로 비활성화되어 있다는 것입니다. 시간 확인을 컴파일하는 프레임 워크를 사용하고 싶습니다. – Tarski