2010-03-18 4 views
2

예 학대를 받아서는 안되며 C#이 기본 언어로 사용된다는 것을 알고 있습니다. 하지만 진지하게 여러분이 파이썬 스타일로 코드를 더럽거나 역동적 인 것을 만들 수 있다면, 그렇지 않습니까?ExpandoObject (역학) 나의 가장 큰 친구 또는 나의 새로운 가장 큰 적?

내 마음은 시간이지나면서 파이썬의 역학을 사랑하는 데 시간을 보내고 있습니다. 뒷문을 통해 어두운면으로 넘어 가고 있습니까?

정적 입력에 대한 인수가이 명백한 추가 기능을 갖춘 죽은 것입니까?

우리가 모두 어른이되었을 때 단위 테스트가 약간 어리석은 이유는 무엇입니까?

다이나믹이 추가되어 강력하고 정적 인 유형의 잘 디자인 된 언어가 망가졌습니다.

+0

일부 파이썬 또는 C# "dynamic do hicky"의 예를 들어 줄 수 있습니까? 필자는 파이썬을 오랫동안 사용 해왔고 메타 프로그래밍을위한 속성을 동적으로 추가해야했습니다. 이는 코드를 더럽 히지 않는 것과 같습니다. –

+0

그래 "할 히키"나는 동적 생각 "네 상상력을 야생하게하자":), 그물 1.1의 시대에 C#으로 메타 프로그래밍을하고 파이썬에서 그것을하고있는 정적 타이핑은 기음#. 인터페이스와 추상적 인 유형을 만들기 위해 대부분의 시간을 보내고 싶었을 때 비트 런타임이 필요했습니다. 나는 파이썬이 훨씬 더 멋지다는 것을 알았고, 타입 시스템을 다루는 것과는 대조적으로 당면 과제에 집중할 수있었습니다. staticlly 타입의 언어에서 "더러운"느낌이 들었습니다. :) – WeNeedAnswers

+0

확실한 C#은 강력한 형식입니다. 그러나 나는 그것을 "잘 설계된 언어"라 부를 수 있을지 확신하지 못한다. 특히 초창기에는 C++과 Java에서 그 모든 단서를 가져 갔다. – pblasucci

답변

6

유형 유추를 사용하기 시작할 때 동적 유형을 사용하려는 욕구가 사라졌습니다.

+0

타입 추론은 모든면에서 설탕으로 코팅 된 장점입니다. 그러나 여러분은 달성하려는 타입에 도달하기 위해 타입 시스템과 싸워야합니다. 오리 타이핑은 좋은 것입니다. 나쁜 방식으로 잘못된다 :) – WeNeedAnswers

+5

"타입 시스템과의 싸움"에 관한 한, 많은 사람들이 처음 시작할 때 경험이 있다고 생각하지만 일단 익숙해지면 타입 검사기가 가장 친한 친구가된다. . 나는 F #이 구조적 타이핑을 OCaml만큼 쉽게 지원했으면 좋겠다. – Juliet

+1

+1, 나는 타입 검사기가 말하는 것을 읽는 법을 배우게되면 환상적으로 유용하다는 것에 만 동의합니다. –

6

C#은 동적 유형 지정의 일부 측면을 포함하여 확장되었지만 그렇다고해서 정적 입력이 중지되지 않았다는 의미는 아닙니다. 단순히 C#이 모든 설득력의 개발자가 여러 가지 방법으로 모든 종류의 문제를 해결할 수있는 도구를 추가했다는 것을 의미합니다.

나는 하나의 타입 시스템이 다른 시스템보다 "더 나은"개념이라는 개념에 문제가 있습니다. 그것은 망치가 스크루 드라이버보다 낫다는 것과 같습니다. 당면 과제의 내용을 알지 못하면 그 결정을 내릴 수 없습니다! 특정 문제와 상황에 대해서는 동적 입력이 보다 좋으며도 마찬가지입니다. 이 접근법의 우월성은 전적으로 문제의 상황에 전적으로 달려 있습니다.

내 도구를 유추하면 망치와 스크루 드라이버가 들어있는 도구 상자를 사용하는 것이 가장 효율적이며 각 도구를 효율적으로 사용하는 방법을 알고 있습니다. 그러면 직면 한 문제를 해결할 수있는 최적의 방법으로 더 나은 개발자가 될 것입니다. C#의 새로운 동적 타이핑 추가 기능은 이러한 도구를 편리한 단일 패키지로 제공하여 사용자를 돕기위한 것입니다.

+0

해머가있는 문제는 미묘하지는 않지만 대부분의 문제를 해결할 수 있습니다. 다이내믹은 망치이고, 그 다음은 일부입니다. 내가 사용하는 비유는 스태틱이 mechano와 같고 역동적 인 것은 레고 벽돌 (techo lego :)이 아니다.) – WeNeedAnswers

+0

@WeNeedAnswers - 내가 생각한 것보다 조금 더 비유 할 수 있다고 생각한다. :) –

0

예.
No.
No.
예.
No.

0

강력한 입력은 여전히 ​​큰 프로젝트를 진행하는 가장 좋은 방법입니다. 코드 완성 (IntelliSense)을 훨씬 향상시킬뿐만 아니라 컴파일시 명백한 문제를 알려줍니다. 예를 들어 socket.Write은 문자열을 사용한다고 가정합니다. C#에서는 숫자를 전달하려고하면 프로그램을 실행할 수 없지만 Python에서는 프로그램이 충돌 할 때만 버그를 알 수 있습니다.

한편, expando 객체처럼 동작하는 JSON 파서를 사용하면 JSON에 지정된 속성을 자동으로 확장하는 것이 얼마나 유용할지 상상하기 쉽습니다.

내 요점을 좀 더 자세히 설명하기 위해 C#은 동적 타이핑의 악으로부터 안전하게 보호받을 수 있다고 생각합니다. 이것은 시스템이 유형이 전적으로 선택적인 (또는 조언 만하는) 다른 동적 언어와는 달리 모든 유형에서 여전히 유형을 권장하기 때문입니다. C#에서는 오리 입력, 확장 속성 및 기타 동적 입력을 통해 "할 일"을 할 수 있지만 자막 포함을 유지하는 데 도움이되는 dynamic 키워드로 잘 표시됩니다.

+0

* Strong * typing * Dynamic * 타이핑은 완전히 다른 것들입니다. javascript 및 TCL과 같은 언어는 "약한 형식"입니다. 일반적으로 모든 유형이 런타임시 문자열로 해석되므로 '3.5hello'와 같은 것을 할 수 있습니다. 동적이지만 Python , 강력하게 입력됩니다. int가 필요한 곳에서는 문자열을 사용할 수 없습니다. –

+0

yup python rocks, GIL과 근본적인 성능 문제를 해결할 수 있다면. 정적 언어에서 확고한 믿는 사람이었습니다. 위에서 언급 한 내용을 깨닫기 전까지는 실수로 오류가있는 것이 가장 좋습니다. 정적 타이핑과 똑같지는 않습니다. 파이썬을 사용하는 몇 가지 프로젝트가 하스켈과 함께 나를 좀 더 역동적 인 캠프로 옮겼습니다. 비록 내가 성능 벤을 볼 수 있습니다. 정적 오버 다이나믹 역동적 인 것은 C#에서 훌륭하다고 생각하지만, 내가 얻으려는 요점은 적절하게 교육받지 않으면 나쁜 것일 수 있다는 것입니다. – WeNeedAnswers

+0

예, JSON 및 XML을 구문 분석하기위한 오브젝트를 확장 할뿐만 아니라 MongoDB 및 CouchDB와 같은 schemalessdb와 상호 작용하기위한 오브젝트를 확장하십시오. 또는 스키마가있는 db이지만 런타임에이 스키마를 알 수 없습니다. – TTT

1

필자가 이해하는 것처럼 동적 키워드는 파이썬과 같은 언어에서 발견되는 동적 유형 지정이 아닌 런타임시 알 수없는 유형에 대한 interop 및 메소드 호출을 용이하게하기 위해 더 많이 도입되었습니다.

이전에 알려지지 않은 유형의 메소드를 호출하기 위해 이전에 InvokeMember를 호출해야했던 곳에서는 대신 동적 객체를 만들고 런타임에 해석 될 메소드를 호출합니다. 코드를 읽기가 훨씬 쉬워집니다. 왜 알 수없는 유형의 메소드 (또는 속성에 액세스)를 호출하겠습니까? 글쎄, WPF는 항상 데이터 바인딩을 사용합니다.

약한 바인딩을 사용하여 interop dll을 사용하려는 경우 (예 : 사무실 상호 운용성을 사용하는 코드를 작성하려는 경우) 하나 이상의 Office 버전을 지원하려는 경우에도이 기능을 사용합니다. 나는 이것을하기 전에해야만했고, 그 코드는 끔찍한 것이다. 동적 키워드는 그러한 코드를 읽고 이해하기가 훨씬 쉬울 것입니다.

대한 추가 정보를 원하시면이 문서를 참조하십시오 :

http://www.hanselman.com/blog/C4AndTheDynamicKeywordWhirlwindTourAroundNET4AndVisualStudio2010Beta1.aspx

+0

expando 오브젝트 또는 사전 을 살펴보면 동적 인 것들로 거친 것을 할 수 있습니다. 예를 들어 사전 개체를 공용 필드 및 메서드가있는 개체로 처리 할 수 ​​있습니다. 사전 항목에 대리자/람다를 추가하여 공용 개체 인 것처럼 호출 할 수 있습니다. dict [ "callme"] ("Ishmael "); – WeNeedAnswers

1

는 지금까지 내가 기억하는 입력 오류가 발견 된 모든 오류의 약 5 ~ 10 %이다, 그래서 우리는 정적 타이핑과 언어에 대한 오류를 줄일 수 있습니다 비어 있는. 단위 테스트 및 회귀 테스트는 정적 유형 지정에 대해 약간 더 작습니다.

동적 입력은 OO 언어에 적합합니다. FP 언어의 경우 (특히 HM 유형 시스템의 경우) 동적 대 정적 유형은 프로그램 설계의 의사 결정에 큰 영향을 미치지 않습니다.

그러나 멋진 코드 성능을 원하는 순간이 있으며 그 순간 동적 유형의 어두운면이 표시됩니다.

+0

당신은 당신의 통계에 관해서 어떤 참고 문헌도 가지고 있습니까, 나는 몇몇 Uni가 한 통계를 기억합니다. Bods,하지만 그들이 내 인생을 위해 누구 였는지 기억할 수는 없습니다. CLR이 강력하게 입력되었으므로 통계가 유지 될 것이라고 생각하지 않습니다. 실제로 오류는 런타임에 나타납니다. 단위 테스트에 대한 하나님 감사합니다 :) – WeNeedAnswers

+0

@WeNeedAnswers - 아니, 그런 언급이 없습니다. 그것은, 소프트웨어 결함의 분류를 연구하는 동안 그것을 찾은 것 같습니다. CLR은 런타임 형변환을 사용하기 때문에 COM interop을 코딩하거나 패널에서 제어 할 때 사용해야합니다. – ssp

+0

이것은 언어에 따라 틀림 없습니다. C#과 비슷한 언어에 대해 5 % -10 %의 소리가 들리 겠지만, F #에서는 오류 유형이 훨씬 더 많습니다. 약간의 통계를 보는 것은 매우 흥미로울 것입니다.입력 정보로 인해 IntelliSense 없이도 코드를 작성해야한다면 C#에서는 여전히 5 % -10 % 만 남았는지 여부에 대한 질문입니다. –

2

고정 유형 지정에 대한 인수가이 명백한 추가 사항이있는 죽었습니까?

우리가 모두 어른이되었을 때 단위 테스트 조금 어리석은가?

다이내믹이 추가되었거나 강하게 고정 된 형식이면서 잘 설계된 언어 ?

잠시 동안 언어는 "가능한 경우 정적으로 입력 된, 필요에 따라 동적으로 입력 된"도메인으로 점점 더 이동했습니다. 그리고 structural typing (정적으로 검사 된 오리 타이핑)을 사용하여 주류 언어로 작업하기 시작하면서, 언어가 기본적으로 정적으로 파이썬으로 검사되는 지점으로 진화하는 것을 볼 수 있습니다.

무엇을 위해, dynamically typed code is just as mindful of types as statically typed code. 관용적 인 C#은 여전히 ​​정적으로 형식이 지정되며 오랜 시간 동안 그런 식으로 남을 것입니다.

+0

나는 링크에서 당신의 작품을 읽고, 대부분 동등한 코드를 필요로하는 비트에 대해서는 조금 있지만, 나는 동의한다. 나는 당신이 개발에 시간을 절약하지 않는다는 데 동의하지만, 코드가 간결하고, 발판이 덜 필요하며, 건물은 자급 자족합니다. C#은 가장 간단한 작업을 수행하기 위해이 스 캐 폴딩을 엄청나게 요구합니다. 즉, "유형 시스템과의 전투"에 대해 언급 할 때 참조하십시오. 일상적인 프로그래밍 작업의 대부분은 정적입니다. 그러나 나는 그것이 그 날을 보내었다라고 생각한다. 오리 타이핑은 어떻게 런타임에 정적으로 선택 될 수 있습니까? – WeNeedAnswers

+0

'오리 타이핑 (duck typing)에서는 객체 자체의 유형보다는 오히려 사용되는 객체의 측면만을 고려합니다.' - wikipedia 나는 오리가 많이 타이핑하는 것을 좋아한다. 그것은 내가 객체의 택 소노 미를 알 필요가 없도록 해준다. 나는 오리 (Duck)가 아닌 무언가가 실행 시간에 그것을 요구할 경우 돌팔매 갈 수있는 아이디어와 사용 패턴을 좋아합니다. 인생을 재미 있고 어떤 경우에는 훨씬 더 쉽게 작업 할 수 있습니다. – WeNeedAnswers

+0

@WeNeedAnswers : "어떻게 오리를 타이핑 할 수 있습니까? 런타임에 선택한 것입니까?" 답변 : 구조적 타이핑. 위키피디아 링크를 참조하십시오. OCaml 같은 좋은 타입 시스템을 가진 언어는 인터페이스와 비슷하지만 즉석에서 정의 된 특정 메소드를 노출하도록 객체를 제한 할 수 있습니다. 그래서'let get_A x = x # A()'라고 쓸 수 있습니다. 여기서 x는 속성'val A : unit -> 'b'를 노출시키는 제네릭 타입''a'입니다. 메서드 서명이 다른 메서드에 개체를 전달하면 컴파일 오류가 발생합니다. C#은 구조체 타이핑이 없지만 F #은 (비록 OCaml보다 훨씬 적지 만) 수행합니다. – Juliet

관련 문제