2010-06-30 2 views
3

나입니까? 아니면 C++이 'if'문을 사용한 다음 C#을 더 많이 사용하는지 묻습니다.C++ if 문 대안

나는이 코드베이스를 가지고 있으며 이와 같은 일들이 많이 포함되어

내가 궁금
if (strcmp((char*)type,"double")==0) 

그것이 '코드 냄새'문 경우 너무 많은 거기에 약간의하지를?

나쁘지는 않지만 문자열 비교와 같은 문자열이 많이 포함되어있어 다르게 수행 할 수 없습니까?

if 문 시퀀스를 작성하는 대신 사용할 수있는 방법이 있습니까?

이것은 단지 예시되고, IT는 될 수있는 임의의 종류의 IF 제표 대신 :

if (string a == "blah") then bla 
if (string b == "blah") then blo 
+4

'if '수 대신 표현식의 복잡성을 의미합니까? 코드를 분기 할 필요가있을 때 상대방에 비해 적은 수의 'if'로 어떻게 멀리 나갈 수 있습니까? 귀하의 질문에 문자열 비교를 묻는 것 같습니다. 혼란스러워. –

+0

사실 나는 여러 곳에서 if 문이 있는지 알고 싶었습니다. 문자열은 단지 예일뿐입니다. 나는 OOP 실행에 대해 많은 것을 배웠고, 아마도 OOP로 일을하는 방법이 더 많을 것이라고 생각했습니다. if 문 대신. –

+0

아, 알겠습니다. 질문을 'C++ if statement alternatives'로 변경하면 더 잘 해답을 얻을 수 있습니다. –

답변

5

이 코드 냄새이다.

최소화하려면 (이 경우) std::string을 사용해야합니다. 코드는 다음이된다 : 바로 includestd::을 제거 C# 코드에서이 샘플 코드를 컴파일 :

#include <string> 
// [...] 
std::string type = "whatever"; 
// [...] 
if (type == "double") 

이것은 C#을 동등한 거의 동일합니다.

일반적으로 C *에서 char *를 직접 사용하는 코드를 찾으면 대개 인데, 다소 희귀 한 경우를 제외하고는 일 것입니다.

: Mike DeSimone addressed the problem of further refactoring this (대답은 여기에서 언급하지 않겠습니다.)).

+1

C + +에서 char *를 사용하지 않는다고 말하는 +1. – Brian

+0

+1 코드 냄새입니다. 이전 스타일의 캐스트는 제 의견으로는 다른 코드 냄새입니다. –

1

C++이 C#보다 더 많은 "ifs"를 필요로한다고 생각하지 않습니다. 프로그램의 if 문 수는 실제로 코딩 스타일의 문제 일뿐입니다. 다형성, 테이블 기반 메소드 등과 같은 기술을 통해 항상 if를 제거 할 수 있습니다. 이러한 동일한 기술은 C++ 및 C#에서 사용할 수 있습니다. 이 두 언어로 작성된 프로그램간에 차이가 있다면 C#과 C++ 프로그래머의 사고 방식과 관련이 있다고 생각합니다.

필자는 "if"제거를 반드시 권장하지는 않습니다. 내 경험상, 진술이 대안보다 명확한 경향이 있다면. 두 번째 요점을 직접적으로 다룰 것 : DFSA를 사용하는 것과 같은 연속 된 문자열 비교를 제거하는 방법. 그러나 대부분의 경우 문자열 비교가 완벽하게 적합합니다.

+0

+1 이것은 C++ 문제가 아니지만 코드를 작성하는 방식으로 (어떤 언어로든) –

13

if (strcmp((char*)type,"double")==0)을 사용하는 이유는 "double"을 case-expression으로 만들 수없고 switch 문을 사용할 수 없기 때문입니다. 즉, lot 문자열 일치의 이러한 종류의 일을하고 있다면 std::map<std::string, int> 또는 비슷한 것을 사용하고 그지도를 사용하여 문자열을 색인으로 변환 한 후 switch으로 보낼 수 있습니다.

이러한 경우 개인적으로 저는 std::map<std::string, int (Handler::*)(void)>과 같은 것들을 좋아합니다. 클래스 메소드의 핸들러 맵을 만들 수 있지만 YMMV입니다.

편집 : 언급하는 것을 잊어 버렸습니다. 메서드에 문자열 맵을 사용하는 것에 대한 다른 좋은 점은 런타임에 변경할 수 있다는 것입니다.예를 들어 파서는 구문 분석 할 파일의 종류를 알고 난 후 런타임에 키워드 목록과 해당 처리기를 변경할 수 있습니다.

+0

예 제가 생각하기에 이것이 최선의 방법이라고 생각합니다. –

+0

+1. 함수의 if/else 문 수가 매우 큰 경우 일반적으로 이러한 거대한 함수를 유지하지 않고 각 실행 분기를 별도로 코딩하고 유지 관리 할 수있는 솔루션을 필요로합니다. – stinky472

+0

문자열을 메서드에 매핑하는 데 +1이 사용됩니다. –

0

if 진술 문은 switch...case으로 바꿀 수 있으면 코드 냄새가납니다. 그렇지 않으면 if을 사용하여 문제가 발생하지 않습니다.

아마도 C++ 코드가 더 순차적이지만 C#에서 더 많은 이벤트 중심 프로그래밍을 사용했을 수도 있습니까?

1

그것은 내가 알아 차 렸던 것이 아닙니다. 저는 10 년 동안 C++과 4 년 동안 C#을 해왔습니다! if의 수는 C#과 C++의 차이보다는 코드의 디자인과 관련이 있습니까?

+0

그건 사실일지도 모르지만 내가 알게 된 일이있어.하지만 내가 틀릴 수도있어. –

+1

나는 C에서 순진하게 코딩 된 명령 실행 시스템을 보았습니다. 즉, 단일 함수에서 가능한 각 명령 문자열을 확인하는 데 수백 가지의 if/elses가 있었을 것입니다. – stinky472

+0

아마도 C#과 비교하여 C++ 응용 프로그램을 설계하는 방법의 차이점에 이릅니다. 그냥 생각 - 나는 내 스타일이 수년에 걸쳐 변화했다는 것을 알고 있습니다.나는 현재 내가 작업하고있는 앱에 두 언어가 눈에 띄는 차이가 있는지 알아봐야 할 것이다. – JLWarlow

1

두 언어 중 하나에서 조건식을 제거하려면 Inversion of Control pattern을 고려하십시오. 그것들을 줄이는 부작용이 있습니다.

1

'bla'및 'blo'의 특성에 따라 문자열을 키로 사용하여 항상 std :: map을 사용할 수 있습니다.

0

if (strcmp...) 문을 끝없이 설정하는 것보다 더 나은 방법으로 문자열 파서를 구현할 수 있습니다.

하나의 접근법은 문자열과 함수 포인터 또는 펑터 객체 사이의 맵일 수 있습니다.

또 다른 설계에는 문자열이 일치하는 항목을 결정하거나 함께 전달할 개체 체인에 전달되는 책임 패턴의 체인이 포함될 수 있습니다.

나는 다른 언어보다 "남용"하는 경향이있는 C++에 대해서는 전혀 몰라.