2010-04-12 7 views
8

System 네임 스페이스에 사용자 지정 코드를 배치하면 안된다는 모범 사례가 있습니까? System 및 해당 하위 항목은 Microsoft 코드 용으로 예약해야합니까?시스템 네임 스페이스에 사용자 지정 코드 배치

많은 프로젝트에서 사용되는 클래스 라이브러리를 작성 중이므로 System.InteropServices (P/Invoke를 처리하기 때문에)에 배치하여 일관성있게 유지하려고합니다.

답변

11

네임 스페이스의 주요 장점 중 하나 인 네임 스페이스 충돌을 방지하기 때문에 좋지 않습니다. 프레임 워크의 최신 버전이 해당 네임 스페이스에 동일한 이름의 유형을 도입하면 어떻게 될까요?

System 지시어가있는 다른 많은 코드에서 가져온 이름 공간이 특히 좋지 않으며 이러한 이름 공간에 사용자 정의 유형을 도입하면 예기치 않은 식별자가있는 다른 소스 파일의 이름 범위가 오염됩니다.

사용자 정의 interop 관련 유형을 분류하려면 MyProduct.InteropServices과 같은 새 이름 공간을 생성 할 수 있습니다.

+0

나는 그것을 피하기 위해'System.InteropServices'의 하위 네임 스페이스를 만들려고했지만, 여전히 좋은 생각은 아닙니다. –

2

System.InteropServices에 새 클래스를 추가하면 using System.InteropServices; 절이있는 모든 파일이 클래스를 사용하게되어 프로그래머를 혼동시킬 수 있습니다. 프로그래머가 이것으로부터 자신을 방어 할 수 없기 때문에 나는이 나쁜 습관을 고려할 것이다.

2

나는 모든 사람이 동의하지 않습니다.

제한된 부분 집합 (주로 확장 메서드 사용)에서는 시스템 네임 스페이스에 코드를 배치하는 것이 매우 합리적이라고 생각합니다.

    :


    좋아, 그래서 여기에 인수의 내 측면이있다 : 여기

    우리가 시스템 네임 스페이스 확장 방법을 논의했던 이메일 스레드에서 인수의 내 측면에 걸쳐 EPS에서입니다
  1. 정말 코드를 최소화하고 싶습니다. 그것은 사용을 포함합니다.

  2. 그렇습니다. ReSharper는 확장 방법을 선택하여 사용자를 추가하지만 일부 사용자에게는 ReSharper가 없으며 게다가 실제로는 (실제로는 아는 한) Coderush를 선호합니다. 네임 스페이스.

  3. 두 가지 유형의 확장 방법이 있습니다. 도메인 및 응용 프로그램 별 헬퍼를 포함하여 우리의 응용 프로그램을위한 도우미 메서드인데, 우리는 언어가 있어야한다고 생각하는 기능과 구문을 캡슐화 한 것들입니다.

후자의 좋은 예는 오히려 String.Join(someStringList.ToArray(), ", ")을하는 것보다 "a {0} {1}".Format("b", "c") 또는 someListOfStrings.Join(", ")을 할 수있는 능력이다. 논쟁의 여지가있는 다른 사례로는 IEnumerable<T>.ForEachIsNull() 확장자가있어 서투른 object.ReferenceEquals(null, someVar) 구문을 대신 할 수 있습니다.

내 주장은이 후자의 분류를 배치해야 할 이유가 있다는 것입니다. 귀하의 팀은 해당 네임 스페이스 (System, System.IO, System.Linq 등)에 광범위하게 동의해야하지만 동의하지 않아야한다고 동의합니다.).우리는 foreach와 yield 키워드가 항상 보이기를 좋아하는 것처럼 모든 기능을 모든 곳에서 사용할 수 있기를 바랍니다. 응용 프로그램에 따라 다르지만 자체 네임 스페이스에 있어야합니다. 특정 애플리케이션 도우미 확장의 90 %는 확장이 아니어야하며 정적이 아니어야합니다. 함수 이름에 별칭을 제공하기 위해 확장 메서드를 사용하여이 문에서 제외했습니다.

물론 시스템 전체의 확장이 포함 된 어셈블리를 호출 할 때 약간의 문제가 발생할 수 있습니다. 내 무효 IEnumerable<T>.ForEach 메서드를 포함하는 어셈블리를 참조하고 내 자신의 루비 같은 R IEnumerable<T, R>.ForEach (실제로 그냥 선택이지만 그것을 잊어 버리고 싶다)을 만들고 싶다고 가정 해 보겠습니다. 이것은 문제가 될 것입니다! 이 문제를 완화하기 위해 내 확장 클래스를 내 프로젝트로만 사용할 수 있도록 내부 클래스로 정의하는 것이 좋습니다. 이것은 문제를 능숙하게 해결합니다.

관련 문제