왜“시스템 사용”인가? 나쁜 습관으로 간주되지 않습니까?


47

저는 C ++ 배경을 가지고 있으며이 질문에 대한 답변을 완전히 이해하고 동의합니다. 왜 "사용 네임 스페이스 표준"입니까? 나쁜 연습으로 간주?

따라서 C #에 대한 경험이 있으면 정확히 반대편이 보입니다 using Some.Namespace;. 문자 그대로 모든 곳에서 사용됩니다. 유형 사용을 시작할 때마다 네임 스페이스에 대해 using 지시문을 먼저 추가합니다 (아직없는 경우). 로 .cs시작하지 않은 파일 을 본 기억 이 없습니다 using System; using System.Collections.Generic; using X.Y.Z; etc.... 실제로 Visual Studio 마법사를 통해 새 파일을 추가하면 전혀 필요하지 않더라도 일부 지시문을 사용하여 자동으로 추가합니다. 따라서 C ++ 커뮤니티에서는 기본적으로 린치가 있지만 C # 은이 작업을 권장합니다. 적어도 이것이 나에게 나타나는 방식입니다.

이제 C #과 C ++에서 지시문을 사용하는 것이 정확히 같은 것은 아니라는 것을 알고 있습니다. 또한 using namespaceC ++에서 할 수있는 가장 오래된 것 중 하나 , 즉 헤더 파일에 넣는 것 중 하나는 헤더 파일 개념이 없기 때문에 C #에서 그다지 불쾌한 대응이 없다는 것을 이해합니다 #include.

그러나 차이점에도 불구하고 C # 및 C ++에서 지시문을 사용하면 동일한 목적을 달성 SomeType하므로 훨씬 더 길지 않고 항상 입력 해야합니다 Some.Namespace.SomeType(C ::대신 ++ 대신 .). 그리고 이와 같은 목적으로 충돌의 이름을 지정하는 것 또한 위험합니다.

가장 좋은 경우 컴파일 오류가 발생하므로이를 수정해야합니다. 최악의 경우에도 여전히 컴파일되고 코드는 의도 한 것과 다른 일을 자동으로 수행합니다. 그래서 내 질문은 : 왜 C #과 C ++에서 그렇게 부적절하게 간주되는 지시문을 사용하고 있습니까?

내가 가진 대답에 대한 몇 가지 아이디어 (이 중 어느 것도 실제로 나를 만족시키지 못합니다) :

  • 네임 스페이스는 C ++ ( stdvs System.Collection.Generic) 보다 C #에서 훨씬 길고 중첩되는 경향이 있습니다 . 따라서 이런 식으로 코드의 노이즈를 줄이면 더 많은 욕구와 이득을 얻을 수 있습니다. 그러나 이것이 사실이더라도이 인수는 표준 네임 스페이스를 볼 때만 적용됩니다. 사용자 정의 이름은 C #과 C ++ 모두에서 원하는 짧은 이름을 가질 수 있습니다.

  • 네임 스페이스는 C ++보다 C #에서 훨씬 "미세한"것으로 보입니다. 예를 들어, C ++에서 전체 표준 라이브러리에 포함되어 있습니다 std(더하기 몇 가지 작은 중첩 된 네임 스페이스 같은 chronoC #에서 당신이 가지고있는 동안) System.IO, System.Threading, System.Text등 그래서, 이름 충돌을 가질 위험이 작다. 그러나 이것은 단지 직감입니다. 실제로 using namespace stdand로 가져 오는 이름의 수는 세지 않았습니다 using System. 다시 말하지만, 이것이 사실 일지라도이 인수는 표준 네임 스페이스를 볼 때만 적용됩니다. C #과 C ++ 모두에서 원하는대로 세밀하게 디자인 할 수 있습니다.

더 많은 논쟁이 있습니까? 나는 실제로 어려운 사실 (있는 경우)에 관심이 많고 의견이 많지 않습니다.


2
@Timo OP는 헤더 오염에 대해 명시 적으로 묻지 않습니다 .
Konrad Rudolph

1
나는 C ++ (주로 C 표준 라이브러리로 인한)과 같은 정도로 글로벌 네임 스페이스에 대한 경쟁이 없기 때문에 가정했습니다. 그러나 나는 가장 잘 아는 사람들의 대답을 기다립니다.
Wyck

2
@ThomasWeller C ++에서는 분명하다. C #에서는를 통해 확장 프로그램을 Ext(this T t, long l)통해 호출 하는 것을 고려하십시오 t.Ext(0). 그런 다음 확장 메소드가 포함 된 다른 네임 스페이스를 추가하면 해당 네임 스페이스가 Ext(this T t, int i)대신 호출됩니다. 그러나 나는 C # (아직)의 전문가가 아닙니다.
sebrockm

2
@Franck 내가 그 점을 인정하더라도 C ++과 같은 주장이 적용되며 C ++과 C #의 차이점을 보지 못한다는 내 의문을 더 밀어
붙인다

3
@Franck C ++는 모호한 경우 컴파일러 오류를 발생시킵니다. C #뿐만 아니라
Timo

답변:


28

왜“시스템 사용”인가? 나쁜 습관으로 간주되지 않습니까?

"시스템 사용;" 되어 있지 보편적으로 나쁜 관행으로 간주되지. 예를 들어 C #에서 'using'지시문을 사용하지 않는 이유는 무엇입니까?

그러나 그것은 아주 간주되지 않습니다 사실 수 있습니다 나쁜로using namespace std. 아마도 다음과 같은 이유로 인해 :

  1. C #에는 헤더 파일이 없습니다. 전처리기를 사용하여 한 C # 소스 파일을 다른 C # 소스 파일에 "포함"하는 것은 일반적이지 않습니다.

  2. std네임 스페이스는 거의 평평합니다. 즉, 거의 모든 표준 라이브러리 함수, 유형 및 변수가 포함됩니다 (파일 시스템 하위 네임 스페이스와 같은 예외는 거의 없음). 매우 많은 수의 식별자를 포함합니다. 내 이해 System에는 훨씬 적은 이름이 포함되어 있으며 대신 더 많은 하위 네임 스페이스가 있습니다.

  3. C #에는 전역 함수 나 변수가 없습니다. 따라서 전역 식별자의 수는 일반적으로 C ++과 대조적으로 상당히 적습니다. 또한 네임 스페이스가없는 C 라이브러리 (일반적으로 간접)를 사용하여 모든 이름을 전역에 배치하는 것이 일반적입니다 네임 스페이스.

  4. 내가 아는 한 C #에는 인수 종속 조회가 없습니다. 이름 숨기기, 오버로드 등과 함께 ADL은 일부 프로그램이 이름 충돌의 영향을받지 않는 반면 다른 프로그램은 미묘한 영향을받는 경우를 생성 할 수 있으며 모든 코너 케이스를 잡는 것은 테스트를 통해 실현할 수 없습니다.

이러한 차이점 때문에 "시스템 사용"; 이름 충돌 가능성이보다 적습니다 using namespace std.


또한, 네임 스페이스 "가져가"자기 영속 대회는 방법이다 : 그것은 표준 네임 스페이스를 가져올 기존의 경우, 프로그래머는 종래 것입니다 하려고 문제를 줄이는 데 도움이 자신의 식별자에 대한 네임 스페이스에서 이름을 선택 피하기 위해 그러한 협약.

이러한 가져 오기가 나쁜 습관으로 간주되면 프로그래머는 가져온 네임 스페이스와의 충돌을 피하려고 시도조차하지 않을 것입니다. 따라서, 선택 사이의 논쟁의 무게가 원래 미묘하더라도 관습은 관행에 대해 또는 실천에 대해 양극화되는 경향이있다.


3
네임 스페이스를 여는 데있어 잠재적 인 단점 만 고려합니다. 그것은 시작이지만, 우리는 장점도 고려해야한다고 생각합니다 .C ++의 경우 대부분의 경우 5 문자 ( std::)를 절약 합니다. C #에서는 훨씬 더 많습니다 ( System.“7 자만”이지만 다른 중첩 된 네임 스페이스에는 더 많은 문자 가 있으므로 어디서나 쓰면 코드를 완전히 읽을 수 없습니다).
Konrad Rudolph

C # 과부하 해상도가 C ++의 해상도보다 친절하고 컴파일러 오류를 통해 많은 모호성이 도출되는 경우가 아닙니까? (정답이 아닌 답변에 대한 비판을 의미하지는 않습니다.)
Bathsheba

3
@KonradRudolph 단점이 중요하다고 간주되고 타이핑의 양이 타이핑의 양과 똑같이 비슷한 경우 네임 스페이스를 비 별칭으로 오염시키는 std::것이 일반적인 스타일이 아닌가? using Sys = System;using
eerorika

2
@ "authoritative"에 관한 @Bathsheba, 나는 C #에 대해 거의 알지 못한다고 주장하고 싶습니다. C #에 대한 지식과 C #에 대한 몇 가지 Google 검색에 대한 답변입니다. 누군가가 C # 부분을 확인하면 감사하겠습니다. :)
eerorika

2
ADL 부분 : C #에는 확장 메서드가 있습니다. ADL과 다른 디자인이지만 이름 충돌과 관련하여 동일한 문제를 공유합니다.
Timo

-2

그러나 이러한 차이점에도 불구하고 C # 및 C ++에서 지시문을 사용하면 동일한 목적을 달성 할 수 있습니다. 이는 훨씬 긴 Some.Namespace.SomeType (C ++에서 :: 대신 : :)을 사용하는 대신 항상 SomeType을 입력하면됩니다. 그리고 같은 목적으로 충돌의 이름을 짓는 것 또한 위험합니다.

예, 그러나 다음 과 같은 이유로 해당 위험을 보내지 않았습니다 (읽기 : 다른 사람이 처리하도록 강요).

이제 C #과 C ++에서 지시문을 사용하는 것이 정확히 같은 것은 아니라는 것을 알고 있습니다. 또한 C ++에서 네임 스페이스를 사용하여 수행 할 수있는 가장 불쾌한 일 중 하나, 즉 헤더 파일에 넣는 것은 헤더 파일 개념과 #include의 개념이 없기 때문에 C #과 동일하지 않다는 것을 이해합니다.

그것은 오히려 다른 범주의 것입니다.

또한 C ++은 C #과 같은 방식으로 IDE에서 개발되도록 "설계되지"않았습니다. C #은 기본적으로 항상 Intellisense와 함께 Visual Studio에서 작성됩니다. 그것은 그것을 만든 사람들이 그런 식으로 사용하도록 설계되었습니다. C ++로 개발하기 위해 IDE를 사용하는 사람의 수에 관계없이,이 사용 사례를 압도적으로 염려하는 것은 아닙니다.

네임 스페이스는 C ++보다 C #에서 훨씬 더 "미세한"것으로 보입니다.

그렇습니다. using namespace stdusing System.Collection.Generic비교할 수 있습니다.

따라서 비교하지 마십시오!


2
이 명시 적입니다 OP의 관심, 응답하지 않을 수 없습니다 헤더에 네임 스페이스를 개방에 대해,하지만의 구현 파일 .
Konrad Rudolph

2
@KonradRudolph using namespace stdC ++에서 피해야 할 충고 는 대부분 헤더 파일에 관한 것입니다. 대답 C #에는 적용되지 않는다는 것입니다.
날개를 가진 소행성

8
@AsteroidsWithWings 피해야 할 충고 using namespace std는 확실히 헤더에 관한 것이 아닙니다. 헤더에 사용하면 위험합니다. 구현에 사용하는 것은 권장되지 않습니다.
토미 안데르센

1
using namespace ...C ++에서 피해야 할 조언 은 명명 충돌을 피하는 것 using입니다 .C # 의 지시문은 명명 충돌의 가능성을 소개합니다. 왜 피하지 않습니까? 비록 구현이 다르더라도.
토미 안데르센

@TommyAndersen, 그러한 충돌이 발생하면 해결하기가 얼마나 어렵습니까? 1 초가 걸립니다. C # using선언은 단일 유형 / 클래스를 정의하는 파일 단위 이므로 일반적으로 유형은 상대적으로 좁은 응용 프로그램 도메인 개념 (이상적으로 단일 책임 원칙)과 관련이 있기 때문에 이러한 네임 스페이스 충돌 가능성은 매우 낮습니다. 그러나 일어날 때 쉽게 고칠 수 있습니다. 일반적인 .NET 개발 도구 / IDE는이를 통해 많은 도움을줍니다. 최고의 여러 개발 활동을 결합하여 생산성을 높이도록 설계된 전체 개발 에코 시스템을 고려하십시오
AKornich
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.