문제

지난 몇 달 안에 나는 Java에서 Groovy로 전환 해 왔으며, 코드, 클로저, 빌더, 결국에는 성배와 같은 프레임 워크가 가능하고 테스트를 작성할 때 조롱으로 쉽게 조롱하는 것과 같은 많은 혜택을 인식 할 수 있습니다. .

그러나 나는 동료들에 의해 내 코드가 충분히 그루비가 아니라고“고발”했다. 즉, 나는 여전히 매개 변수와 필드에 대한 유형을 선언하고 오리 타이핑 등 대신 상속 및 다형성을 사용하는 경향이 있습니다. 이러한 상황에서는 역동적 대 정적뿐만 아니라 역동적 대 객체-지향 패러다임 인 것 같습니다. 일종의 딜레마. 그런 경우 나는 여전히 OO를 선호하는 경향이 있습니다. OO 패러다임은 기본 전제에 큰 가치가 있다고 생각합니다. 코드 구성을 특정 실제 개념과 추상화하고 관련시킬 수 있습니다.

따라서 다음과 같은 특별한 질문이 있습니다.

  1. 매개 변수, 필드 등에 대한 유형을 선언해야합니까?

  2. 간단한 방법이 수행 될 때 코드 블록을 폐쇄로 선언해야합니까?

  3. 다형성 동적 디스패치 대신 오리 타이핑을 언제 사용해야합니까? 예를 들어, 그루비에서 나는 동물을 할 수 있습니다. "$ action"() 또는 def Animal; 동물성 동물 대신 Animal.action (); New Dog (); Animal.action (). 개방형 원칙의 맥락에서 첫 번째 문제를 볼 수 있지만 OO 스타일 다형성을 선호하는 다른 이유가 있습니까?

  4. Groovy에서 인터페이스를 언제 사용해야합니까?

나는 내가 쓰지 못한 다른 유사한 딜레마가 있다고 확신합니다. 또한 이러한 질문은 그루비뿐만 아니라 다른 역동적 인 언어에도 유효하다고 생각합니다. 당신의 의견 것입니다?

도움이 되었습니까?

해결책

.1. 매개 변수, 필드 등에 대한 유형을 선언해야합니까?

공개 API의 일부로 사용되는 클래스, 다른 개발자가 많이 소비 할 것, 또는 Intellij의 추가 자동 완성 도움을 원하는 곳에서 유형을 선언합니다. 그렇지 않으면 나는 'def'일입니다.

.2. 간단한 방법이 수행 될 때 코드 블록을 폐쇄로 선언해야합니까?

변수로 전달할 계획이 아니라면 방법을 사용합니다. "foo. & bar"메소드 Dereference 연산자가 있지만 대부분의 개발자는 이것에 대해 알지 못하고 그들이 그것을 가로 질러 달릴 때 혼란스러워합니다. 또한 설명 목적으로 자체 방법을 넣지 않고 더 큰 방법으로 유지하는 것이 명확한 작은 코드 일 때 폐쇄를 사용합니다.

.삼. 다형성 동적 디스패치 대신 오리 타이핑을 언제 사용해야합니까? 예를 들어, 그루비에서 나는 동물을 할 수 있습니다. "$ action"() 또는 def Animal; 동물성 동물 대신 Animal.action (); New Dog (); Animal.action (). 개방형 원칙의 맥락에서 첫 번째 문제를 볼 수 있지만 OO 스타일 다형성을 선호하는 다른 이유가 있습니까?

동물 만 사용합니다. "$ action"() 양식은 해당 간접 수준이 필요할 때 양식 메소드 이름이 코드 실행 경로에 따라 다르기 때문에 (대부분 무거운 메타 프로 그램 동안) 다릅니다. 나는 Animal Animal = New Dog ()를 사용합니다. Animal.action () autocompletion에 대한 IDE의 도움을 원하거나 해당 수준의 문서가 코드 선명도에 도움이됩니다 (명백하거나 제한적 일 수있는 추가적인 장점으로 인해 상처를 입지 않음).

.4. Groovy에서 인터페이스를 언제 사용해야합니까?

나는 그들을 거의 사용하지 않습니다. 공개 API 호출에 대한 예상 필드의 문서화 또는 아마도 한 클래스 세트와 다른 클래스 세트를 메타 프로 그램 관점과 구별하는 데 도움이되는 마커 인터페이스로 사용하는 것을 볼 수있었습니다. 그들은 자바보다 그루비에서 훨씬 덜 유용합니다.

다른 팁

이것은 항상 대중적인 의견은 아니지만 코드가 더 명확하고 명확할수록 더 나을 수 있다고 생각합니다.

나는 당신이 무슨 일이 일어나고 있는지 추측하는 구조물을 싫어합니다 ...

나는 루비에서 1 년 동안 일했고 전혀 마음에 들지 않았습니다. 나는 그것이 탁월한 곳이 없다고 말하는 것이 아니라, 나는 단지 물건을 깨끗하고 명백하게 유지하는 것을 좋아하고 루비가 목표로 그것을 가지고 있다고 느끼지 않았다고 말하고 있습니다.

내가 파악한 한 가지는 당신이하는 타이핑의 양이 전반적인 개발 속도와 동일하지 않습니다. 반복되는 코드가 많이있는 복잡한 코드베이스는 개발이 매우 느리게 만들어 지지만, 복제를 제거하지 않고 입력 한 내용을 단순히 줄이는 것은 쓸모가 없으며 더 길고 명확하며 더 명확한 코드를 입력하는 것은 일반적으로 더 빠르게 될 것입니다 ( 프로젝트의 길이)는 간결하고 공식적인 언어로 작성된 동일한 코드보다.

타이핑이 개발 속도와 관련이 없다고 생각하지 않는 경우, 다음에 프로젝트를 해제 할 때 코드 수를 계산하고 지출 한 사람 (디버깅 및 테스트 포함)으로 나뉘 었습니다. 다시 말해, 하루에 얼마나 많은 코드가 입력되었는지. 결과는 매우 적은 숫자라는 것을 알 수 있습니다.

Groovy를 사용하면 가장 간단한 방법을 선호하고 상황이 요구할 때만 Groovier 기능에 빠지게되어야한다고 생각합니다. (Clojure에서 매크로를 작성하거나 멀티 메모드를 만들 때와 같이, 당신이 그 도구에 많은 도움이되면 스스로 의문을 제기해야합니다.) 당신의 신중한 접근 방식은 나에게 괜찮은 것 같습니다. . (처음이 아닐 것입니다.)

Groovy와 같은 융통성있는 언어를 갖는 것에 대한 좋은 점은 필요할 때 더 강력한 대안을 가지고 있다는 것을 알기 위해 신중한 접근 방식으로 시작할 수 있다는 것입니다. "가장 간단한 일이 가능할 수있는 가장 간단한 것"

보다 구체적으로 인터페이스보다 오리를 입력하고 매개 변수의 유형을 방해하지 않는 것이 좋은 것 같아서 테스트에 모의를 공급하는 것이 훨씬 쉬워 질 수 있습니다.

사람들이 편안한 것에 달려 있습니다. 나는 Java에서 편안하기 때문에 유형 감소와 방법 호출을 사용하는 것을 좋아합니다. 내가 쓴 코드는 많은 역동적 인 프로그래밍 경험을 가진 사람들이 유지해야하므로 고급 그루비 기능을 사용해야할만한 충분한 이유가 없다면 일반 Java 코드에 가깝게 유지해야합니다. 그룹이 Groovy의 특정 특징을 일반적으로 사용 해야하는시기를 설명하려는 코딩 표준을 작성 해야하는 것처럼 들립니다.

객체 지향 언어에는 두 가지 유형의 유형이 있습니다.

의 언어 시뮬라 67 C ++ 및 Java와 같은 패밀리는 정적으로 유형 된 변수, 컴파일러 및 링커 및 방법 vtables를 선호합니다.

의 언어 잡담 Ruby와 같은 가족은 함수 포인터 테이블 대신 동적으로 유형 된 변수, 해석 및 메시지 통과를 선호합니다.

둘 다 객관적 지향적이지만 객체 지향 개념을 매우 다르게합니다.

--

아니

이 질문에 대한 실제 대답이 없다는 것을 알고 있습니까?

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