2010-12-07 3 views
9

나는 컴퓨터 공학을 공부하기 전에 레일스에서 ​​많은 웹 프로그래밍을 해왔다.다이내믹 타이핑을 보완하기위한 의미없는 테스팅이 싫증이났다.

그 이후로 저는 C로 많은 학교 수업을했으며 Objective-C (Mac 관련 자료)에서 개인적인 것들을 많이했습니다. 정적 타이핑을 좋아했습니다.

하지만 지금은 전문적인 웹 개발 (프리랜싱)을해야하고 레일스를 다시 한 번 픽업했습니다. 비 의미 론적 유형 검사를 작성하는 것이 정말 귀찮다. C 및 Objective-C 컴파일러에서 무료로 가져 왔습니다. 나는 Build를 치는 것을 좋아하고 시스템이 A가 B를 호출 할 수 있음을 알기 위해 모든 코드를 검사하도록하고, B는 불분명 한 라이브러리 C 등을 호출 할 수있다. 의미론을 테스트하기 만하면된다. 하지만 Rails를 사용하면 컴파일러가됩니다. :(

는 사람이 동일한 경로를 트레드 가지고 몇 가지 제안, 또는 일부 공감을 찾고 C# 및 자바 + X 프레임 워크와 웹 개발 ASP.NET MVC에 대한 내 유일한 옵션은 ...?? P

그런데 Ruby보다는 Rails에 대한 구체적인 언급을하고 있습니다. Ruby가 스크립팅과 같은 단순한 작업에 대해 역동적 인 성격을 지니지 않았기 때문입니다.하지만 Rails는 매우 많은 보석에 의존하고 있기 때문에 보통 다른 보석 동적 타이핑이 문제가된다

감사

편집 :.!

필자는 pst의 제안을 추적하여 스칼라를 살펴 보았습니다. 언어 창작자 마틴 오더스키 (Martin Odersky)가 저술 한 스칼라에서의 프로그래밍 (Programming in Scala)을 읽으면서, 여러면에서 내 관심사와 약간을 표현한 텍스트 전체를 보았습니다. 아주 재미있는 독서.

스칼라에서 마틴 오더 스키의 프로그래밍의 52 페이지에서 촬영 :

스칼라 정적 정적 타입 시스템은 가 개최 값의 종류에 따라 변수와 식을 분류

를 입력한다 을 계산하십시오. 스칼라는 유형 시스템으로 매우 정교한 정적 언어 으로 돋보입니다. 중첩 된 클래스 유형 인 Java의 부터 시작하여 유형을 제네릭으로 매개 변수화하고 교차를 사용하여 유형을 결합하고 추상 유형을 사용하여 유형의 세부 사항을 숨길 수 있습니다. 이것들은 건물에 대한 강력한 기반을 제공하고 은 자신의 유형을 구성하므로 은 동시에 사용할 수있는 안전하고 유연한 인터페이스를 설계 할 수 있습니다.

동적 언어와 같은 펄, 파이썬, 루비, 또는 그루비를 좋아하는 경우에, 당신 이 스칼라의 정적 타입 시스템의 장점 중 하나로 을 나열이 약간 이상하다는 사실을 발견했습니다. 이후에 정적 유형이 없으므로 시스템이 동적 언어의 주요 이점 인 으로 일부 인용되었습니다. 정적 유형에 대한 가장 일반적인 주장은, 프로그램이 너무 상세하게 그들이 원하는대로 자신을 표현에서 프로그래머를 방지하고, 소프트웨어 시스템의 동적 수정 불가 특정 패턴을 만드는 것이 있습니다.

그러나, 종종 이러한 인수는 일반 정적 유형의 아이디어에 대해 이동하지 않습니다,하지만 너무 자세한거나 너무 유연하지 못한 것으로 인식되는 특정 유형의 시스템에 대하여. 인스턴스의 경우, Alan Kay의 발명가 인 은 스몰 토크 언어에 대해 한 번 언급했습니다. "형식에 맞지 않지만 어떤 유형의 시스템인지는 알 수 없습니다. 완전한 고통이므로 아직 마음에 들었습니다. 동적 입력 완료 고통 "우리는되는 에서 스칼라의 타입 시스템이 훨씬 것을이 책 에서 당신을 설득 희망

" "사실, 주소 정적 타이핑에 대한 일반적인 우려의 친절이.. : 추론을 피하고 자세한 내용은 을 통해 패턴 매칭과 유형을 쓰고 작성하는 새로운 방법을 여러 개 사용했습니다. 이러한 장애물이없는 상태에서 정적 유형 시스템의 기존 이점을 더 잘 이해할 수 있습니다. 이 중 가장 중요한 것 중 의 혜택은 프로그램 추상화, 안전 리팩터링 및 입증 된 설명서의 검증 가능한 속성입니다.

검증 가능한 특성

정적 타입 시스템은 특정 런타임 오류의 없음을 증명할 수 있습니다. 예를 들어, 그들은 과 같은 속성을 증명할 수 있습니다. boolean은 결코 정수에 을 추가하지 않습니다. private 변수 은 클래스 외부에서 액세스되지 않습니다. 함수는 올바른 수의 인수에 에 적용됩니다. 문자열 만 문자열 세트에 추가됩니다.

다른 유형의 오류는 오늘날의 정적 유형 시스템에 의해 감지되지 않습니다 ( ). 인스턴스의 경우 일반적으로 종료되지 않는 함수, 배열 경계 위반 또는 0으로 나누기를 감지하지 않습니다. 또한 프로그램이 사양을 따르지 않음을 감지하지 못합니다 ( 사양이 있다고 가정하면!). 따라서 정적 유형 시스템 은 일부 에 의해 매우 유용하지 않은 것으로 해산되었습니다. 인수 유형이 인 경우 이러한 유형 시스템은 은 단순 오류 만 탐지 할 수 있지만 단위 테스트는 더 광범위한 범위를 제공하지만 왜 정적 유형 을 사용해야합니까?

우리는이 논점들이 포인트가 이라고 생각합니다.정적 유형 시스템은 확실히 단위를 대체 할 수는 없지만 단위를 처리하여 필요한 단위 테스트 수를 줄이면 테스트해야합니다. 마찬가지로, 단위 테스트 정적 입력을 바꿀 수 없습니다. 어쨌든 Edsger Dijkstra가 말한 것처럼 테스트는 오류의 존재를 증명할 뿐이며 결코 부재 할 수 있습니다. 따라서 은 정적 입력이 이 단순 할 수 있음을 보장하지만 실제로는 형식의 보증을 제공하지 않고 테스트를 제공 할 수 있습니다.

안전 리팩토링

정적 타입 시스템은 당신이 높은 신뢰도와 코드베이스를 변경 할 수있는 안전망을 제공합니다. 메서드에 매개 변수를 추가하는 리팩토링을 예로 들어 보겠습니다. 정적으로 유형화 된 언어에서 변경을 수행 할 수 있습니다. 시스템을 다시 컴파일하고 유형 오류의 원인이되는 모든 행을 으로 수정하면됩니다. 이 작업을 끝내면 은 을 변경해야하는 모든 장소를 찾았습니다. 같은 많은 다른 간단한 리팩토링은 메서드 이름을 변경하거나 메서드를 한 클래스에서 다른 클래스로 이동하는 것과 마찬가지입니다. 모든 경우에 정적 유형 검사 은 새로운 시스템이 이전처럼 작동한다는 충분한 보증을 제공합니다.

문서

정적 유형 정확성에 대해 컴파일러에서 체크 프로그램 설명서 있습니다. 일반 주석과 달리 유형 주석은 날짜를 벗어날 수 없습니다 (적어도 소스 파일이 최근에 컴파일러를 통과 한 경우는 제외). 또한 컴파일러와 통합 개발 환경 은 더 나은 컨텍스트 도움말을 제공하기 위해 에 유형 주석을 사용할 수 있습니다. 예를 들어, 통합 된 개발 환경은 선택이 만들어 해당 유형의 모든 구성원을 찾는 되는 식의 정적 유형을 결정 하여 선택 가능한 모든 멤버를 표시 할 수 있습니다.

+0

Rails를 개발할 때 이러한 유형의 테스트가 필요한 이유를 보여주는 예가 있습니까? – zetetic

+0

zetetic : 레일의 자체 테스트 스위트는 데프 assert_raise (하면 ArgumentError) {계정을 test_count_with_too_many_parameters_raises https://github.com/rails/rails/blob/master/activerecord/test/cases/calculations_test.rb로 inumerous 예를 가지고 .셀 (1, 2, 3)} 단부 https://github.com/rails/rails/blob/master/activerecord/test/cases/associations_test.rb DEF test_include_with_order_works assert_nothing_raised {Account.find (첫째 : order => 'id', : include => : firm)} assert_nothing_raised {Account.find (: first, : order => : id} : 포함 => : 회사)} 끝 – Alexandre

+0

아무도 글을 쓰려고 시도하지 않았습니까? F #과 ASP MVC? – Gabe

답변

7

이것은 동적 언어에 대한 나의 "불만"중 하나입니다. 나는 타입 에러가 아닌 의미론 테스트를 원한다 .- 좋은 테스트 프레임 워크/셋업은 모든 사소한 상황에서 반드시 필요하며 좋은 코드 커버리지와 테스트 된 요구 사항은 중요하다.

JVM의 정적 입력 경로 (내가 가지고있는) 아래로 가고 싶다면 Scala을 살펴 보는 것이 좋습니다. 루비에서 오는 것은 자바에가는 것보다 훨씬 덜 고통스럽고 (실제로 다양한 방식으로 재미 있습니다). 표현식 기반의 구문, 클로저, 여러 장소에서 유형을 생략 할 수있는 능력 (Ruby처럼 열리지 않지만 컴파일 타임 형식 검사를받을 수 있습니다 .--), 당연히 받아들이는 것들을 "유지"할 수 있습니다. 모든 것 (*) - 객체 OO, 통합 접근 자 메소드, DSL을 쉽게 생성하고 설탕을 만들 수있는 기능, 로컬 유형 유추, 패턴 일치, 상대적으로 풍부한 콜렉션 프레임 워크로 정적 유형의 언어의 이점을 얻으십시오. Java와의 적절한 통합 (수많은 웹 프레임 워크를 포함하여 Scala 언어를 활용하는 스칼라 고유의 프레임 워크가 있습니다).

C# 3.0/4.0 (및 .NET3.5 +)도 이 아니며 (LINQ/클로저, 기본 유형이 도입 된 C# 2.0은 이제는 유물입니다.) 유추 및 기타 멋진 언어 기능 대부분의 작업에서 "받아 들일 수있는"것으로 나타났습니다 (Java를 언어로 평가하는 방법을 추측 해보십시오 ;-). 그러나 C#은 CLR 대상 언어입니다 (.NET Scala 포트가 있었지만 상태는 확실하지 않습니다.하지만 주요 대상 플랫폼은 아닙니다).

내가 Scala에 대해 언급 한 이래로, "Functional with OO"접근법을 OCaml과 비슷하게하는 F # (현재는 "공식".NET 언어)에 대해서도 언급해야합니다. Scala는 그 반대이고, 그것은 기능성을 가진 "OO"입니다. 나는 F #에 대한/F #에 대한 인수가 C# w.r 형식 시스템에 비해 들었지만 F #에 대해서는 실무 경험이 없다고 들었다. 당신은 패러다임 전환을 좋아할 수도 있고 그렇지 않을 수도 있습니다.

해피 코딩.

+0

안녕 pst. my를 Scala로 안내해 주셔서 감사합니다. Scala에서 프로그래밍하기 책을 읽기 시작했습니다. 내 모든 불평을 사로 잡는 것 같습니다. 이 책의 일부 텍스트로 업데이트 된 질문을보십시오. – Alexandre

1

이 유형의 테스트는 일반적으로 레일스에서 ​​수행되지 않습니다. 그것을해야하는 것에 짜증을내는 대신에 그것에 대해 걱정하지 않는 것을 고려하십시오. 또는 대부분의 Rails 프로그래머가 그렇지 않기 때문에 왜 이것이 문제라고 생각하는지 설명하는 것이 더 낫습니다. test_include_with_order_works을 쓴 사람은 레일이 특별한 경우의 문자열로 상징에 동일한 해석 것이라고 확신하고있다

업데이트. Rails는 이미이 기능을 제공하고 테스트했기 때문에 테스트하지 않아도 될 것 같지 않습니다.솔직히 말해서, 심볼이 문자열처럼 기능 할 것인가에 대해서조차 걱정할 것입니다. 우리는 그것이 할 수 있고 종종 그렇게한다는 것을 압니다.

일반적으로 레일스 프레임 워크는 사용자가 구현하지 않아도되는 것을 보장해야한다고 생각합니다. 동적 유형의 언어에서 작동하는 철학은 클라이언트 코드가 호출하는 메서드를 손상시킬 매개 변수를 전달하지 않는다고 생각합니다. 그들이하는 경우, 그들은 방법을 부르는 데 아무 쓸모가 없습니다. 메소드가 너무 쉽게 매개 변수를 무시할 수있을 때 매개 변수를 너무 많이 제공 할 때 메소드가 예외를 던질 수 있도록 시간을 낭비 할 필요가 없습니다.

그래서 제공된 예제가 Rails에서 의미없는 테스팅의 필요성을 실제로 보여 주는지 확신 할 수 없습니다.

+0

안녕하세요 Samo, 내 질문에 zetetic의 의견에 대한 답글을 게시하여 귀하의 의견도 언급합니다. Rails의 자체 테스트베이스에는 그러한 테스트와 같은 수많은 테스트가 있습니다. – Alexandre

+0

@Alexandre : 업데이트 내 대답 – Samo

2

레일스에 대해 언급하면서 스칼라에 관심이 생겼을 때 확실히 Lift을 확인해야합니다. 여기에 작성자가있는 2008 interview2009 presentation (비디오)이 있습니다. 이전에도 불구하고 Lift를 다른 언어의 대체물과 비교하기 때문에 링크했습니다.

리프트가 당신의 것이 아니라면, other Scala web frameworks이 있다는 것을 확신하십시오.

관련 문제