2009-07-03 2 views
1

그런 언어 (예 : C#, Java)로 무언가를 작성하고 오리 입력을 놓친 경우가 있습니까? (오리 타이핑에 대한 논쟁은 this question을 참조하십시오)강력한 타입의 OOP 언어로 된 오리 타이핑을위한 인수는 무엇입니까?

+1

강하게 입력 된 것이 아니라 정적으로 입력 된 것이라고 생각하십니까? – Kylotan

+1

Kylotan, 아니, 그건 모순이 될거야. 동적 <-> 정적, 강한 <-> 약한 직각. – Svante

+2

그게 제가 지적한 요지입니다. 질문의 표현은 강하게 타이핑 된 언어에는 오리 타이핑이 없다는 것을 의미합니다. 그들 중 일부는, 즉. 파이썬. – Kylotan

답변

2

다른 질문은 오리 타이핑과 관련이 없습니다. 어쨌든, 이것이 닫히지 않는다고 가정 할 때, 나는 커다란 API를 가지고 클래스를 테스트하려고 할 때 오리 타이핑을 정말로 놓친다는 것을 말하고 싶습니다. 우리는 다른 프로그래밍 언어에서 당신이 필요로하는 것에 대한 기초적인 기본을 구현하는 자체 서술 된 수업을 전달할 수있는 반면에 그들의 프레임을 만들기 위해 별도의 프레임 워크가 필요합니다.

예를 들어, 프레임 워크없이 java에서 JDBC ResultSet을 모의하려고 시도하면 약간의 고통이 있습니다.

3

소유하지 않은 코드로 작업 할 때마다 적절한 추상화 (HttpContext anyone?)가 필요하지 않을 때가 있습니다. HttpContext 타입에는 그런 종류의 추상화가 없기 때문에 당신이 사용할 수있는 메소드가 IHttpContext를 가질 수 없기 때문에, 어댑터 및/또는 팩토리 등을 위해 정해 줘야합니다. 코드에서 IHttpContext 계약을 정의하고 HttpContext처럼 보이게하고, IHttpContext를 수락하도록 메서드를 설정하고, 실제 HttpContext 개체를 IHttpContext로 전달할 수 있다면 매우 좋을 것입니다.

+0

내가보기에 당신의 첫 번째 대답 : – ripper234

+0

당신은 더 열심히보고 있어야합니다 :) –

2

'90 년대부터 파이썬과 '01 년 이후로 자바를 사용 해왔다.

Java에서 오리 입력을 놓친 적이없는 이유는 여기에 있습니다.

"Duck Typing in Java Question"은 실제로 다형성을 이해하는 데있어 절대적인 실패입니다. 어떤 종류의 런타임 타입 식별이나 "isinstance"기능이 필요하다고 생각된다면, 다형성을 이해하지 못했고 잘못하고있는 것입니다.

Programmer Ignorance Pet Peeve 질문을 참조하십시오. 다형성을 파악하지 못하는 것은 큰 문제이며 "Java에서의 오리 타이핑"실수로 이어집니다.

다형성을 이해하면 오리 입력이 필요하지 않으며 Python과 Java간에 전환 할 때 실수하지 않습니다.

관련된 노트에서 정수가 아닌 정수를 얻을 때 정수가 필요한 함수를 만들기 위해 파이썬의 isinstance() 만 어설 션을 사용합니다. isinstance()은 오리 형식의 작업을 수행하기 위해 Java에서 시도 할 때 가끔 사용됩니다.

요점은 내가 늙고 (52) 매우 똑똑하지 않다는 것입니다. 그래서 저는 파이썬에서 "강하지"한 클래스 계층 구조를 유지해야합니다. 그렇지 않으면 혼란 스럽습니다. 필자는 필연적으로 더 엄격한 클래스 계층으로 리팩터링하기 위해 항상 파이썬 디자인에 공간을 남겼습니다.

+3

isinstance를 사용하여 오리를 입력하지, 사실 그것은 오리 타자를 subverts. class A {메소드 foo() {...}} 클래스 B {메소드 foo() {...}} 함수 not_duck_typed (x) {if (x isinstance A) {x.foo()} } function duck_typed (x) {x.foo()} 오리 타이핑의 who 포인트는 공통 조상을 공유하지 않는다는 사실에도 불구하고 A 또는 B 중 하나의 인스턴스를 duck_typed로 전달할 수 있다는 것입니다. 공식적인 인터페이스. 덕 타이핑은 여전히 ​​다형성입니다. –

+2

오리 유형 지정과 런타임 유형 식별/isinstance를 혼동스럽게합니다. Java에서 인터페이스는 명시 적으로 정의됩니다. 오리 유형 언어에서는 객체가 노출하는 메소드에 의해 암시 적으로 정의됩니다. –

0

(C# foreach 구조의 경우와 같이) 언어가 디자인 약점을 해결하려고 할 때 외부에서 메서드 서명을 기반으로하는 오리 유형 수행이 필요하지 않습니다. 다른 한편으로, 인터페이스로 오리 - 타이핑과 유사한 것을하는 것이 도움이되는 많은 경우가 있습니다. 예를 들어, IWalkLikeDuckIQuackLikeDuck 인터페이스를 구현하도록 제약 된 일반 매개 변수를 사용하는 UseDuck 메서드가있는 경우 IWalkLikeDuckIQuackLikeDuck을 모두 구현하도록 제한되는 제네릭 형식의 변수가있는 코드는 UseDuck으로 전달할 수 있습니다. 그러나 코드가 종료 된 후 Wowzo으로 전달 될 수있는 형식으로 코드를 유지하는 좋은 방법은 없습니다.다른 인터페이스에서 상속받은 IWalkAndTalkLikeDuck 오리 유형을 정의 할 수 있다면 매우 유용 할 것이지만 IWalklikeDuckITalkLikeDuck을 모두 구현하는 클래스에 의해 자동으로 구현 된 것으로 간주되므로 참조를 저장할 수 있습니다. IWalkLikeDuckITalkLikeDuck을 구현하는 것으로 알고있는 모든 유형은 List<IWalkAndTalkLikeDuck>입니다.