2010-05-17 3 views
3

나는 최근에 내가이도우미 캐스팅 기능 - 코드 냄새가 있습니까?

((Dictionary<string,string>)value).Add(foo); 

같은 것을 가지고 하나의 예를 들어 내 손가락에 쉽게 캐스팅하기 위해 기능을 사용하기 시작하기 시작했다 그래서 나는이

ToDictionary(value).Add(foo); 
을 할 수있는 작은 작은 도우미 함수로 변환

코드 냄새입니까?

또한 간단한 예제는 무엇입니까? 내 스크립팅 엔진의 예를 들어 내가

ToStringVar(arg).Value="foo"; 

내가 정말 inorder를 값을 캐스팅하고 즉시 당신이 그것을 묶어야합니다 그것에서 속성을 얼마나 싫어하는 일이

((StringVariable)arg).Value="foo"; 

같은 일을 생각했습니다 이중 괄호 안에. 나는 마지막 한 느낌이 나는 그렇게 생각하지 않아요 (또한 내가 내 예제는 C#을 경우에도 불가지론이 언어를 표시 한)

하지만 첫 번째

+0

* 니프 니프 *은 정향의 힌트와 함께, 계피 냄새. 다소 즐거운 꽃다발. :) 그다지 좋지는 않지만,'AddToDictionary (value, foo);'메소드에'Add '를 포함하고 싶을지도 모른다. – FrustratedWithFormsDesigner

+1

Generics가 표면 상으로는 고쳐야 할 코드 냄새가 있습니다. 나는이 코드를 둘러싼 코드에서 'value'변수에 String-> String 맵이 할당되어 있다는 것을 모르는 이유를 알고 싶습니다. 답변이 "모호한 유형을 반환하는 모듈 함수를 작성했기 때문에 제어 할 수없는 사람이 있습니다." 이 경우 두 가지 일을합니다. 1) 'some guy'와 그의 코드에 대한 작업을 계속하고 2) 할당 시간에 데이터 유형의 모호성을 제거합니다. 값을 가져 오는 메서드 또는 코드 블록의 맨 위에 Dictionary 을 선언하고 'value'를 할당합니다. – Jason

+0

@ Jason 정말 피할 수없는 일입니다. 그것은 단지 예일뿐입니다. 나의 두 번째 예도 보아라. (그것은 사실이다). 아마 두 번째 일은해야하지만 BaseVariable에서 전달되는이 함수로 인해 항상 그런 것은 아니며 때로는 IntegerVariable 또는 StringVariable로 캐스팅해야합니다. 그것은 바로 스크립팅 엔진이 현재 어떻게 작동하는지입니다. – Earlz

답변

4

실제로 캐스팅을해야 할지도 모르는 순간 (나는 개인적으로 의심 스럽다) - 실제로 "손가락을 저장"하고 싶다면 using 문을 사용하여 일반 유형의 이름을 줄일 수 있습니다. 다른 모든 using이와 파일의 상단에

:

using ShorterType = Dictionary<string, Dictionary<int, List<Dictionary<OtherType, ThisIsRidiculous>>>>; 
+0

이전에 3 레벨의 깊은 중첩 제네릭을 사용했습니다. 그리고 놀랍습니다. '사용하기'를 사용할 수 있을지 전혀 몰랐습니다! – Earlz

+0

이것은 OP가 기대했던 것처럼 언어에 구속력이 없지만 확실한 해결책입니다. –

+0

언어 불가지론자를 원하면 공칭 타이핑을 사용하여 조사 할 수 있습니다. 여기서 기본 클래스의 구현을 정확히 재사용하지만 의미가 다른 새로운 클래스를 만듭니다. 그런 복잡한지도를 어디에서나 통과한다면 아마도 내 데이터 모델의 필수 요소 일 것입니다. 내가 그 이름을주지 않으면 누가 탓할거야? 나는 당신에게 힌트를 줄 것이다 : 그것은 처음부터 일반적인 방법을 생각해 낸 사람이 아니다. – Jason

1

보다 훨씬 더 나쁘다 있습니다. 당신은 또한 일을 읽고 읽는 것이 좀 더 쉽다는 점에서 좋은 일을했습니다. Glib (C 언어)는 클래스에 캐스팅 매크로를 제공하므로 새로운 개념은 아닙니다. 너의 손가락을 구하려고 과잉 살풍을 당하지 말라.

0

일반적으로 이것은 코드 냄새라고 생각합니다. 사용자가 설명하는 캐스팅 유형이 필요한 대부분의 상황에서는 generics/templates 외에 인터페이스 (Java) 또는 가상 상속 (C++)의 올바른 사용으로 동일한 동작을 얻을 수 있습니다. 형식을 관리하는 책임은 컴파일러에 맡기는 것이 훨씬 안전합니다.

추가 컨텍스트가 없으면 포함 된 예제에 대해 말하기 어렵습니다. 당신이 설명하는 캐스팅의 유형이 어쩔 수없는 상황은 확실합니다. 하지만 규칙보다는 예외입니다. 예를 들어, 일반적인 C 라이브러리에서 매우 일반적인 장소를 설명하는 캐스팅 유형 (및 연관된 도우미 함수/매크로).

관련 문제