문제

나는 연구와 실험을 더 그루비와 나가려는 나의 주위에 마음의 장점과 단점을 구현하는 것을 끝내는 내용할 수 있습니다 하지 말라에서 Java.동적 프로그래밍은 여전히 단지 개념을 나 때문에 나는 깊이 가득한 정적이고 강력한 언어입니다.

멋있는 기능을 제공하는 오리-유형, 수는 없지만 정말 보는 값입니다.는 방법은 오리 입력보다 더 많은 생산성을 정적 타?어떤 종류의 것들을 할 수 있습니 내 코드는 연습을 나에게 도움을 파악하의 혜택은?

나는 이 질문으로 묘한 마음에 그러나 나는 그것을 이해하지 않는 반드시 그루브한 질문에 그래서 저는 오답에서 모든 코드 캠프입니다.

도움이 되었습니까?

해결책

다음은 더 나은:EMACS 또는 vi?이것은 하나의 종교적인 전쟁이다.

이런 식으로 생각:모든 프로그램 , 될 것입니다,올바른 언어의 경우 정적으로 입력한다.무슨 정체되 입력하지 않은 컴파일러가 있는 충분한 정보를 감지하는 유형의 불일치를 컴파일 시간에는 대신 실행 시간입니다.이 짜증을 수 있는 경우에 당신의 일을 증 종류의 프로그래밍하지만,(나 유지하는)경우에 당신은 분명히 생각에 대해 귀하의 프로그램으로 그것이 문제가 되지 않는;다른 한편으로는 경우에,당신은 정말 큰 프로그램을 운영 체제와 같 또는 전화로 스위치,수십 또는 수백 수천명의 사람들이 그것에 노력하고,또는 정말로 신뢰성 높은 요구사항,그때 그는 컴파일러를 감지할 수 있는 큰 문제의 클래스에 대한 필요없이 당신 테스트 케이스 운동하는 딱 맞는 코드의 경로입니다.

지 않는 경우 동적인 입력이 새롭고 다른 것은:C 는,예를 들어,효과적으로 동적으로 입력할 수 있기 때문에 항상 캐스팅 foo*bar*.그것은 단지 그것의 다음 나의 책임으로는 C 프로그래머지를 사용하는 코드를 적절에 bar* 을 때 주소는 정말 가리키는 foo*.그러나 결과적으로의 문제로 대규모 프로그램,C 를 성장 같은 도구를 보풀(1),강화 유형을 시스템 typedef 결국 개발된 강력한 형식의 변형에서는 C++.(물론,C++차례로 개발된 방법을 강력한,모든 종류의 캐스트 및 제네릭/템플릿과 함께 나온.

다른 하나의 기록을 유지한다.---혼동하지 말라"민첩한 프로그래밍""동적 언어로". 민첩한 프로그래밍 는 방법에 대해 사람들이 함께 작업에서 프로젝트:할 수 있는 프로젝트의 변화에 적응하는 요구 사항을 충족 고객의 요구를 유지하면서 인간적 환경에 대한 프로그래머?그것은 할 수 있는 동적으로 입력한 언어 자주 그들이 할 수 있기 때문에,생산성 향상(예를 들어,루비,Smalltalk),하지만 그것을 할 수 있습니다,성공적으로,C 고 심지어 어셈블러.사실, 집회 개발 도를 사용 민첩한 방법(스크럼에서 특정)하는 마케팅을 마련하였습니다.

다른 팁

많은에 대한 의견의 오리 입력하지 않는 진짜로 입증합니다.지 않"걱정하"대형하지 않은 지속가능한 유지 보수 또는 응용 프로그램을 만드는 확장 가능.나는 진짜로 좋은 기회를 참조배에서 활동을 통해 나의 마지막 계약과 매우 재미있는 보니다.모두는 행복에 대한 이익을에서 할 수있는"만들기-응용 프로그램"을 얻을 것-슬프게도 그것은 모든 것에 당신을 다시 끝입니다.

묘한 것하고 같은 방법으로 나입니다.지를 작성할 수 있는 아주 간결한 코드고 거기에 몇 가지 좋은 설탕에서 우리가 어떻게 작업 속성 컬렉션,등등....지 않는 비용을 아는 무엇이 다시 전달되고 앞으로가 더 나빠졌다.어떤 점에서 당신의 머리를 긁적이 왜 이 프로젝트가되고있 80%테스트 및 20%작동합니다.공과는"작은하지 않는다"을 위해"더 읽을 수 있는"코드입니다.죄송 사람,간단한 논리 더 많이 알고 있는 직관적으로 다음은 더 복잡한 프로세스 이해하는 코드가됩니다.그것은 왜 GUI 의 데이 떨어져 지나치게 되는 상징적 인 수년에 걸쳐-지 꽤 있지만 WTH 는 것에 항상 명확한 것은 아닙니다.

사람들이 그 프로젝트에 대한 듯 말썽"못을 박는 아래로"배운 교훈을,하지만 당신은 방법을 반환 하나의 요소의 T 형식의 배열을 T 상태로 또는 null...그것은 오히려 명백하다.

한 가지 작업을 끝내는 그러나 나에게 멋진 시간 woot!

아무 잘못이 없으로 정적인 입력을 사용하는 경우 특성을 나타내고 있는 놀라운 정적 유형 시스템입니다.그러나 사용하는 경우,같은 언어 자바 C++는 정말 심각형 시스템,오리 입력하는 것은 확실히 개선합니다.

상상 사용하려고 무언가가 그렇게 간단으로"지도"자바(없이,내가 의미하지 않는 데이터 구조).도 제네릭은 오히려 제대로 지원됩니다.

오리 입력하는 장애인의 가장 현대적인 IDE 의 정적 검사할 수 있는 점과 오류가 있습니다.일부를 고려하이 장점이다.원 IDE/컴파일러는 저에게 말하는 내가 만든 어리석 트릭 프로그래머로 가능합니다.

나의 가장 최근의 마음에 드는 인수 오리 입력하에서 온배 프로젝트 DTO:

class SimpleResults {
    def results
    def total
    def categories
}

results 로 밝혀 같은 뭔가 Map<String, List<ComplexType>>, 할 수 있는 발견에 의해서만 흔적을 다음과 같은 메소드 호출의 다른 클래스를 찾을 때까지 당신은 그것을 만들었습니다.에 대한 말기 호기심, total 의 합의 크기 List<ComplexType>s categories 의 크기 Map

수도 있다는 취소를 원래 개발자,그러나 가난한 유지 관리 사람(나)손실을 많이의 머리를 추적이다.

그것은 조금 어려운 값을 볼 수 있는 덕 입력할 때까지 당신은 그것을 사용했습니다.당신은 그것을 사용하고,당신이 얼마나 많은 부하가 당신의 마음을 처리하지 않는 인터페이스 또는에 대해 걱정할 필요가 정확히 무엇을 입력입니다.

이럴의 장점은 오리 입력하면 된다 확대할 때 준수하는 몇 가지 협약과 같은 이름을 변수와 방법에서 일관된 방법입니다.예를서 켄 G, 에,나는 것이라고 생각을 읽을 최:

class SimpleResults {
    def mapOfListResults
    def total
    def categories
}

자의 말을 정의 계약에 일부 가동'라는 이름 calculateRating(A,B)'A 와 B 가을 준수하는 다른 계약입니다.에서 의사 코드,그것을 읽을 것입니다.

Long calculateRating(A someObj, B, otherObj) {

   //some fake algorithm here:
   if(someObj.doStuff('foo') > otherObj.doStuff('bar')) return someObj.calcRating());
   else return otherObj.calcRating();

}

을 구현하려는 경우 이 자바에서,모두고 B 을 구현해야 합니다 일부는 종류의 인터페이스를 읽는 무언가 이것을 좋아한다:

public interface MyService {
    public int doStuff(String input);
}

외,일반화하려면 당신은 계약을 계산하기 위한 평가(당신이 다른 알고리즘에 대한 평가 계산),당신은 또한 인터페이스를 만드:

public long calculateRating(MyService A, MyServiceB);

오리와 함께 입력할 수 있는 도랑 인터페이스 고 다만 의존하는 것에 runtime,모두고 B 이 정확하게 응답하신 doStuff() 호출합니다.가 필요 없는 특정 계약에 정의합니다.이 당신을 위해 일할 수 있지만 그것은 또한 수업입니다.

단점은 조심해야에서 순서를 보장하는 코드는 휴식하지 않을 때 다른 사람이 변화(예,다른 사람이 알고 있어야의 암묵적 계약에 메서드 이름과 인수).

이를 악화에 특별히 자바는 구문으로 간결 될 수 있(에 비해 Scala 예를 들어).카운터-의 예이 리프트 framework, 는 곳,그들이 말하는 SLOC 수의 프레임워크과 유사한 레일, 지만,테스트 코드는 더 적은 라인 때문에 그들이 필요로 하지 않을 구현하는 유형을 확인합 내에서 테스트합니다.

여기에 하나의 시나리오에 오를 입력 작업을 저장합니다.

여기에 아주 사소한 클래스

class BookFinder {
    def searchEngine

    def findBookByTitle(String title) {
         return searchEngine.find( [ "Title" : title ] ) 
    }
}

지금에 대한 단위 테스트:

void bookFinderTest() {
    // with Expando we can 'fake' any object at runtime.
    // alternatively you could write a MockSearchEngine class.
    def mockSearchEngine = new Expando()
    mockSearchEngine.find = {
        return new Book("Heart of Darkness","Joseph Conrad")
    }

    def bf = new BookFinder()
    bf.searchEngine = mockSearchEngine
    def book = bf.findBookByTitle("Heart of Darkness")
    assert(book.author == "Joseph Conrad"
}

우리는 할 수 있었을 대체하는 Expando 에 대한 SearchEngine 기 때문에 부재의됩니다.정적 유형을 확인하는 것이 있었는지 확인 SearchEngine 었는 인터페이스,또는 적어도 추상 클래스를 만들 전체를 조롱의 구현니다.는 노동 집약적인,또는 당신이 사용할 수 있는 정교한 단일 용도의 조롱 framework.하지만 오리 입력하는 일반 목적,우리를 도왔다.

기 때문에 오리의 입력,단위 테스트를 제공할 수 있는 모든 오래된 개체는 장소의 종속성으로 구현하는 메소드 get 호출됩니다.

을 강조한-이렇게 할 수 있습에 정적으로 입력되는 언어와의 인터페이스 클래스 계층 구조입니다.하지만 오리와 타이핑을 할 수 있으로 생각하고 적은 키 입력.

그의 장점이 오리 입력합니다.그것이 의미하지는 않는 동력은 바로 패러다임에서 사용하는 모든 상황입니다.서 그루브한 프로젝트,내가 좋아하는 스위치로 돌아 Java 는 상황에서는 컴파일러에 대한 경고 유형은 나를 도울 것입니다.

으로, TDD+100%범위 코드 +IDE 도구는 지속적으로 실행하 테스트를,나는 느끼지 않는다 필요의 정적 타니다.이 없는 강력한 종류,내 유닛 테스트가되었다 그래서 쉽(단순히 사용하지도를 만들기 위한 모의 객체).특히,사용하는 경우 제네릭,차이 볼 수 있습니다:

//Static typing 
Map<String,List<Class1<Class2>>> someMap = [:] as HashMap<String,List<Class1<Class2>>>

//Dynamic typing
def someMap = [:]   

그것은 오리 입력보다 더 많은 생산성을 정적 입력으로 많은것은 단순히 다릅니다.으로 정적 입력 항상 당신을 걱정하는 데이터를 올바른 형식으로 되어 있으며 자바에서 그것을 통해 보여줍 캐스팅을 권 유형입니다.오리 입력하는 방식은 중요하지 않습니다만큼 그것은 올바른 방법,그래서 그것은 정말 그냥 많이 제거의 번거 로움을 주며 변환 유형입니다.

@크리

그것은 정적 타의 생산성보다 오리 입력하는 만큼 그것은 단순히 다릅니다.오리와 타이핑 당신은 항상 당신을 걱정하는 데이터가 올바른 방법과에 자바스크립트나 루비 표시의 많은 통해 방법을 테스트합니다.으로 정적 타지 않는 문제로 그것은 올바른 인터페이스,그래서 그것은 정말 그냥 많이 제거의 혼 테스트 및 변환 사이 종류.

죄송하지만 나는 그것을 할 수...

내 의견:

동적으로 입력하거나 오리 형식의 언어에는 장난감입니다.당신이 얻을 수 없습니다 Intellisense 고 당신이 컴파일 시간(또는 편집 시간을 사용할 때 실시 IDE 같이 대하지는 쓰레기 다른 사람들이 생각하는 것은 Ide)코드 유효성 검사를 수행합니다.

편의 모든지 않는 언어에 정적으로 입력한 다른 모든 것은 그냥 평범한 오게 된다

나에게,그들은 끔찍하게 다른 경우 동적으로 입력되는 언어로 단순히 형태의 정적 타는 모든 상속에서 충분히 추상적인 기본 클래스입니다.

문제가 발생할 때,많은 사람들이 지적한 것처럼,당신은 받기 시작한다.누군가가 지적을 반환하는 함수의 단체,수집,또는 null 입니다.기능 돌아에 특정 유형되었습니다.사용하여 여러 기능을 위한 단일 대 컬렉션입니다.

그것이 무엇으로 귀결하는 사람이 쓸 수 있는 잘못된 코드.정적 타입 훌륭한 안전 장치,하지만 때로는 헬멧에서 얻는 방법 당신은 당신의 머리에 바람.

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