문제

정적/강력한 유형의 프로그래밍 언어에서 가장 귀중한 점은 리팩토링에 도움이 된다는 것입니다.API를 변경하면 컴파일러는 해당 변경 사항이 무엇인지 알려줄 것입니다.

런타임/약한 형식의 언어로 코드를 작성하는 것을 상상할 수 있습니다.하지만 컴파일러의 도움 없이 리팩토링하는 것은 상상할 수 없고, 리팩토링 없이 수만 줄의 코드를 작성하는 것도 상상할 수 없습니다.

이것이 사실입니까?

도움이 되었습니까?

해결책

유형이 확인 된 방식으로 확인되면 혼동되고 있다고 생각합니다. 런타임 타이핑이 반드시 약한 것은 아닙니다.

정적 유형의 주요 장점은 정확히 당신이 말하는 것입니다. 그들은 철저합니다. 컴파일러가 그 일을하도록함으로써 모든 통화 사이트가 유형을 준수 할 수 있다고 확신 할 수 있습니다.

정적 유형의 주요 제한은 그들이 표현할 수있는 제약 조건이 제한이 있다는 것입니다. 이는 대부분의 언어가 비교적 간단한 유형 시스템 (C, Java)과 매우 강력한 유형 시스템 (Haskell, Cayenne)을 갖는 언어에 따라 다릅니다.

이 제한 유형으로 인해 자체적으로 충분하지 않습니다. 예를 들어, Java 유형에서는 유형 이름이 일치하는 것을 확인하는 데 다소 제한됩니다. 이는 확인하려는 제약 조건의 의미가 어떤 종류의 이름 지정 체계로 인코딩되어야하므로, Java 코드에 공통적 인 간접 및 보일러 플레이트가 있습니다. C ++는 템플릿이 조금 더 표현할 수 있지만 종속 유형으로 할 수있는 일에 가깝지는 않습니다. 더 강력한 유형 시스템의 단점이 무엇인지 잘 모르겠지만 분명히 업계에서 일부 또는 더 많은 사람들이 사용해야합니다.

정적 타이핑을 사용하더라도 관심있는 모든 것을 확인하기에 충분히 표현되지 않으므로 테스트도 작성해야합니다. 정적 타이핑이 보일러 플레이트에서 필요한 것보다 더 많은 노력을 절약 할 수 있는지 여부는 오랜 세월 동안 격렬한 논쟁이며 모든 상황에 대한 간단한 대답이 없다고 생각합니다.

두 번째 질문에 대해 :

런타임 타이핑 언어로 어떻게 안전하게 요약 할 수 있습니까?

답은 테스트입니다. 테스트는 중요한 모든 사례를 다루어야합니다. 도구는 테스트가 얼마나 철저한 지 측정하는 데 도움이 될 수 있습니다. 적용 범위 확인 도구 코드 라인은 테스트에 의해 다루어 졌는지 여부를 알려줍니다. 테스트 돌연변이 도구 (Jester, Heckle)는 테스트가 논리적으로 불완전한 지 알 수 있습니다. 승인 테스트는 요건을 기록한 내용을 알려주고 마지막으로 회귀 및 성능 테스트는 각각의 새로운 버전의 제품이 마지막의 품질을 유지하도록합니다.

정교한 유형의 간접에 의존하는 적절한 테스트와 제자리에 적절한 테스트를하는 데있어 가장 큰 장점 중 하나는 디버깅이 훨씬 간단해진다는 것입니다. 테스트를 실행할 때 Obtuse 컴파일러 오류 명령문 (C ++ 템플릿 오류를 생각하십시오) 대신 수행하는 작업을 명확하게 표현하는 테스트 내에서 구체적인 실패 된 어설 션을 얻습니다.

어떤 도구를 사용하든 상관없이 : 자신에 대해 자신의 코드를 작성하려면 노력이 필요합니다. 아마도 많은 테스트를 작성해야 할 것입니다. 버그에 대한 페널티가있는 경우 매우 항공 우주 또는 의료 제어 소프트웨어와 같은 높은 높이는 소프트웨어의 동작을 증명하기 위해 공식적인 수학적 방법을 사용해야 할 수도 있습니다.

다른 팁

나는 당신의 감정에 전적으로 동의합니다.동적 유형 언어가 뛰어나다고 여겨지는 바로 그 유연성이 실제로 코드를 유지 관리하기 어렵게 만드는 이유입니다.실제로 코드를 변경하지 않고 데이터 유형이 사소하지 않은 방식으로 변경되어도 계속 작동하는 프로그램 같은 것이 있습니까?

그 동안 전달되는 변수의 유형을 확인할 수 있으며 예상된 유형이 아니면 어떻게든 실패할 수 있습니다.이러한 사례를 근절하려면 여전히 코드를 실행해야 하지만 적어도 뭔가를 알 수 있습니다.

Google의 내부 도구는 실제로 컴파일을 수행하고 아마도 Javascript에 대한 유형 검사를 수행한다고 생각합니다.그런 도구가 있었으면 좋겠어요.

우선, 저는 기본 Perl 프로그래머이므로 한편으로는 정적 유형의 그물로 프로그래밍 한 적이 없습니다. Otoh 나는 그들과 함께 프로그래밍하지 않았으므로 그들의 혜택에 대해 말할 수 없습니다. 내가 말할 수있는 것은 Refactor와 같은 것입니다.

정적 유형이 부족하다는 것은 WRT 리팩토링에 문제가되지 않습니다. 내가 문제를 발견 한 것은 리팩토링이 부족하다는 것입니다. 브라우저. 동적 언어는 코드가 실제로 실행할 때까지 실제로 무엇을할지 모르는 데 문제가 있습니다. Perl은 이것을 가장 많이 가지고 있습니다. Perl은 매우 복잡하고 거의 대체 할 수없는 구문을 가질 수있는 추가적인 문제가 있습니다. 결과 : 리팩토링 도구는 없습니다 (그러나 그들은 그것에 대해 매우 빠르게 일하고 있습니다). 최종 결과는 손으로 리팩터를 리팩터해야한다는 것입니다. 그리고 그것이 버그를 소개하는 것입니다.

나는 그들을 잡기위한 테스트가 있습니다 ... 보통. 나는 종종 테스트하기 위해 코드를 리팩터링 해야하는 닭/달걀 문제로 테스트를 거치지 않고 테스트하기 위해 테스트 해야하는 닭/달걀 문제로 테스트되지 않은 테스트가없는 코드 앞에서 종종 자신을 발견합니다. ick. 이 시점에서 나는 매우 멍청하고 높은 수준을 써야합니다.

Java 또는 C ++ 또는 C#에 구상 된 정적 유형은 실제로 작은 클래스의 프로그래밍 문제 만 해결합니다. 인터페이스가 올바른 레이블로 전달 된 데이터가 전달되도록 보장합니다. 그러나 컬렉션을 얻는 것만으로도 컬렉션에 데이터가 포함 된 데이터가 포함되어 있지는 않습니다. 정수를 얻었 기 때문에 올바른 정수를 받았다는 의미는 아닙니다. 메소드가 사용자 객체를 사용하지만 해당 사용자가 로그인 했습니까?

Classic example: public static double sqrt(double a) 입니다 Java Square Root 함수의 서명. 제곱근은 음수에서 작동하지 않습니다. 서명에서 어디에서 말합니까? 그렇지 않습니다. 더 나쁜 것은, 그 기능이 무엇을하는지 어디에 말합니까? 서명에는 어떤 유형이 필요한지와 반환 내용 만 말합니다. 그것은 그 사이에 무슨 일이 일어나고 있는지, 그리고 그것이 흥미로운 코드가 살고있는 곳입니다. 어떤 사람들은 사용하여 전체 API를 캡처하려고했습니다. 계약에 의한 디자인, 기능은 기능의 입력, 출력 및 부작용 (또는 부족)의 런타임 테스트를 포함시킬 수 있지만 또 다른 쇼입니다.

API는 단순한 기능 서명 이상의 것입니다 (그렇지 않은 경우 Javadocs의 설명적인 산문이 필요하지 않을 것입니다). 리팩토링은 API를 변경하는 것보다 훨씬 더 많습니다.

정적으로 입력 한 정적으로 편집 된 비 동력 언어는 가장 큰 리팩토링 장점은 메소드의 모든 호출이 어디에 있는지 알고 있기 때문에 매우 복잡한 리팩토링을 수행하기 위해 리팩토링 도구를 작성하는 능력입니다. 나는 꽤 부러워한다 Intellij 아이디어.

재 팩토리는 정적으로 유형 된 언어로조차도 컴파일러가 확인할 수있는 것 이상이라고 말합니다. 리팩토링은 외부 동작에 영향을 미치지 않고 프로그램 내부 구조를 변경하고 있습니다. 역동적 인 언어에서도 여전히 당신이 일어날 것으로 예상하고 테스트 할 수있는 것들이 있습니다. 컴파일러로부터 약간의 도움을 잃게됩니다.

사용하면 좋은 점 중 하나는 var C# 3.0에서는 ~할 수 있다 코드를 손상시키지 않고 유형을 변경하는 경우가 많습니다.유형은 여전히 ​​동일하게 보여야 합니다. 동일한 이름을 가진 속성이 존재해야 하고, 동일하거나 유사한 시그니처를 가진 메소드가 여전히 존재해야 합니다.하지만 ReSharper와 같은 도구를 사용하지 않고도 매우 다른 유형으로 변경할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top