라이브러리에 대한 C # 네임 스페이스 및 클래스 명명 규칙


26

C #에서 다양한 작은 유틸리티 함수로 라이브러리를 작성하고 네임 스페이스 및 클래스 명명 규칙을 결정하려고합니다. 내 현재 조직은 다음과 같습니다

Company
Company.TextUtils
    public class TextUtils {...}
Company.MathsUtils
    public class MathsUtils {...}
    public class ArbitraryPrecisionNumber {...}
    public class MathsNotation {...}
Company.SIUnits
    public enum SISuffixes {...}
    public class SIUnits {...}

네임 스페이스와 클래스를 구성하는 좋은 방법입니까, 아니면 더 좋은 방법이 있습니까? 특히 네임 스페이스와 클래스 이름 (예 : Company.TextUtils네임 스페이스 및 TextUtils클래스) 에서 동일한 이름을 가진 것처럼 보이는 것은 중복 된 것이며 스키마가 더 나을 수 있음을 나타냅니다.



5
Microsoft 지침에서는 열거 형에 대해 단수 이름을 권장하므로 (단자 SISuffix대신 SISuffixes) 단수를 읽는 것이 좋습니다. "접미사 A" Suffix.A 로 읽습니다 . 또한 일반적으로 계층 구조의 레벨에서 이름이 반복되는 것을 피합니다. 즉, 대신에Company.SIUnits.SISuffixesCompany.SI.SuffixCompany.SI.Unit
Harrison Paine

답변:


9

네이밍 전략이 나머지 코드와 얼마나 효과적으로 분리되어 있는지 판단하기는 매우 어렵습니다.

네임 스페이스는 코드베이스의 광범위한 구조에 적합한 위치에 대한 아이디어를 제공해야하며 클래스 이름은 일반적으로 해당 영역 내에서 어떤 종류의 기능 또는 개념을 나타내는 지 설명합니다.

특정 예에서, ' Company.Utils.Maths유틸리티 '유형 클래스가 훨씬 더 많을 가능성이있는 경우주의를 기울여야합니다 . 여러 유틸리티 영역에 공통적 인 기능을 추가해야하는 경우 이미 자연스러운 위치.


1
그거 좋은 아이디어군요. 너무 걱정하지 말고 "Company.Util"에 모두 입력하십시오.
사용자

30

Microsoft : Framework Design Guidelines 에 따라 따라야하는 많은 규칙이 포함 된 유용한 문서가 있습니다 .

변경해야 할 사항 : 클래스 이름을 네임 스페이스로 지정 하지 마십시오 . 그러면 컴파일러 믹스 업이 발생합니다. 하지마 네임 스페이스의 클래스에 대한 더 나은 이름을 찾으십시오.


3
네임 스페이스 지침에 대한 직접 링크 : msdn.microsoft.com/en-us/library/ms229026(v=vs.110).aspx
Pagotti

1
또한 우연히도 주제에 관한 훌륭한 책의 이름과 동일하며 DotNet 프레임 워크 제작에 참여한 Microsoft 사람들이 작성했으며 올바른 일과 잘못 된 부분에 대한 몇 가지 언급이 있습니다. 읽을만한 가치 : amazon.com/Framework-Design-Guidelines-Conventions-Libraries/dp/…
Machado

@nvoigt, 친구 Pagotti가 제공 한 링크에서 인용문을 추가하기 위해 답을 편집 해 주시겠습니까? " 네임 스페이스와 네임 스페이스의 유형에 동일한 이름을 사용 하지 마십시오 . 예를 들어 디버그를 네임 스페이스 이름으로 사용하지 마십시오. 그런 다음 동일한 네임 스페이스에 Debug라는 클래스를 제공합니다. 일부 컴파일러에서는 이러한 유형을 정규화해야합니다. "
Machado

2
주의 사항 : 때로는 제품 이름이 회사 이름을 사용하는 것보다 낫습니다. 회사를 매입 한 몇 가지 시나리오에 처해 있었고 전체적으로 새로운 네임 스페이스를 생성하고 다시 릴리스해야했습니다. 나는 이것이 매우 작지만 지적하고 싶었다.
Jon Raynor

1
Microsoft의 프레임 워크 디자인 지침은 의문의 여지가 많으며 .NET의 작동 방식에 대한 잘못된 설명이 포함되어 있으며 종종 Microsoft 자체가 따르지 않습니다. 그들의 명명 지침은 좋지만, 전체 지침을 "따라야한다"는 진술과 연결하는 것을 피하고 싶습니다.
Carl Leth

6

C # 또는 .NET 생태계와 함께 일한 지 오래되었지만 현재 권장되는 모범 사례가 무엇인지 말할 수 없습니다. 다음과 같이 이름을 변경하는 것이 좋습니다.

Company
Company.Text
    public class TextUtils {...}
Company.Math
    public class MathUtils {...}
    public class ArbitraryPrecisionNumber {...}
    public class MathsNotation {...}
Company.SI
    public enum SISuffixes {...}
    public class SIUnits {...}

여기서 한 것은 네임 스페이스 이름에서 "유틸리티"를 제거하는 것입니다. 네임 스페이스에 Company.Text언젠가는 텍스트 유틸리티 클래스 가 아닌 클래스를 포함 할 수 있기 때문에 "Util"은 네임 스페이스에 없어야한다고 생각합니다 . Company.Math네임 스페이스는 이미 포함 ArbitraryPrecisionNumber은 "유틸리티"하지 않는 것있다.

네임 스페이스에서 "Util"을 제거하면 동일한 이름을 가진 두 가지 이름을 가질 수 있으므로 혼란이 사라집니다 (Robert의 답변 : https://softwareengineering.stackexchange.com/a/340440/13156 )

코드를 구성 할 수있는 또 다른 방법은 다음과 같습니다.

Company
Company.Util
    public class TextUtils {...}
    public class MathUtils {...}
Company.Math
    public class ArbitraryPrecisionNumber {...}
    public class MathsNotation {...}
Company.SI
    public enum SISuffixes {...}
    public class SIUnits {...}

이 경우 모든 유틸리티 클래스는 동일한 네임 스페이스에 있습니다. Company.Text유틸리티 클래스가있는 유일한 네임 스페이스 는 없습니다 .

개인적으로 첫 번째 옵션이 좀 더 명확합니다.


4

네임 스페이스와 클래스 내부에 동일한 이름을 사용하면 문제가 발생합니다.

  • 네임 스페이스에 둘 이상의 클래스가 포함되어 있으면 왜 다른 클래스를 추가해야합니까? 네임 스페이스의 이름의 목표는 단지 클래스가 아닌 그 안에있는 모든 클래스 를 설명하는 것이기 때문에 옳지 않다. 당신이있는 경우 예를 들어 JsonSerialization, BinarySerializationXmlSerialization네임 스페이스의 클래스를, 그것은 의미 네임 스페이스에 이름을 만들 것 XmlSerialization?

    일반적으로 발생하는 것은 존재하는 네임 스페이스에서 클래스를 추출하거나 여러 클래스 또는 다른 재구성 간의 병합으로 인해 주요 클래스가 포함 된 네임 스페이스를 찾는 것입니다 . 작은 클래스는 원래 클래스와 약간 관련되어 있으므로 점진적으로 진행됩니다. 예를 들어, 네임 스페이스는 LogParser하나의 클래스가 포함될 수 LogParser하고 누군가 풋 LogConverter가 매우 다음, 파서 관련이 있기 때문에, LogSearcher등 여기에서의 문제는 네임 스페이스의 이름이 변경되지 않았 음이다 : 빨리으로 LogConverter추가되었으며, 이름이 LogsProcessing또는 으로 변경 되었어야합니다 Logs.

  • 네임 스페이스에 클래스가 하나만 있으면 코드 조직 내에서 문제의 징후 일 있습니다.

    적절한 SOLID 원칙을 가진 단일 클래스가 코드 기반의 다른 클래스와 매우 다르고 전용 네임 스페이스에 배치 된 상황을 몇 배나 보았지만 그러한 경우는 거의 없습니다. 더 자주 이것은 문제를 나타냅니다. 마찬가지로, 단일 메소드를 포함하는 클래스를 가질 수있는 것은 없지만, 그렇지 않은 경우가 종종 있습니다.

    네임 스페이스에 클래스가 하나만 포함되어 있더라도 일반적으로 클래스 이름을 지정할 때 더 구체적으로, 네임 스페이스를 지정할 때 더 일반적인 방법이 있습니다. 주어진 순간에 ABC 형식으로 작성된 파일을 DEF 형식으로 변환해야하는 응용 프로그램을 상상해보십시오. 변환은 비즈니스 오브젝트와의 직렬화 해제 / 직렬화가 필요하지 않으며, 변환 클래스 자체 내에 넣을 수있을 정도로 짧은 정규 표현식을 적용하여 수행됩니다.AbcToDefConverter. 모든 변환 논리는 약 10 개의 상호 의존적 방법에서 약 80 개의 LLOC를 사용합니다. 기존 클래스를 분할하거나 추가 클래스를 만들 필요가없는 상황처럼 보입니다. 응용 프로그램의 나머지 부분은 변환과 관련이 없으므로 클래스는 기존 네임 스페이스의 다른 클래스와 그룹화 할 수 없습니다. 따라서이라는 네임 스페이스를 만듭니다 AbcToDefConverter. 본질적으로 잘못된 것은 없지만,보다 일반적인 이름을 사용할 수도 있습니다 Converters. 더 짧은 이름이 선호되고 반복이 발생하는 Python과 같은 언어에서는조차도 될 수 있습니다 converters.Abc_To_Def.

따라서 네임 스페이스에 포함 된 클래스와는 다른 네임 스페이스에 다른 이름을 사용하십시오. 클래스 이름은 클래스가 수행하는 작업을 나타내며 네임 스페이스 이름은 클래스에 포함 된 모든 클래스에서 공통적 인 사항을 강조해야합니다.


그건 그렇고, 유틸리티 클래스는 본질적으로 잘못되었습니다 : 임의의 정밀 산술과 같은 특정 무언가를 포함하는 대신 다른 클래스에서 발견되지 않은 모든 것을 포함합니다 . 이것은 Miscellaneous데스크톱 의 디렉토리 처럼 조직의 부족을 나타내는 잘못된 이름 지정 입니다.

명명은 이유가 있습니다. 나중에 물건을 찾아야 할 때 인생을 더 쉽게 만들기 위해서입니다. 차트를 그려야 할 경우“차트”또는“플롯”을 검색 할 수 있습니다. 앱에서 인보이스를 생성하는 방식을 변경해야하는 경우 "인보이스 [e / ing]"또는 "청구서"를 검색합니다. 마찬가지로“음,이 기능은 기타에있을 것입니다.”라고 스스로에게 말할 경우를 상상해보십시오. 난 못해

.NET Framework를보십시오. 대부분의 클래스는 유틸리티 클래스가 아닌가? 비즈니스 영역과 관련이 거의 없습니다. 금융 앱이나 전자 상거래 웹 사이트 또는 차세대 교육 플랫폼에서 작업하는 경우 XML을 직렬화하거나 파일을 읽거나 SQL 쿼리를 수행하거나 트랜잭션을 수행하는 것은 모두 유용한 일입니다. 그러나 UtilitySerialization또는로 호출 UtilityTransaction되지 않으며 Utility네임 스페이스에 없습니다 . 그들은 적절한 이름을 가지고 있으므로 필요할 때 찾을 수 있습니다 (그리고 .NET 개발자에게 감사합니다!).

동일은을 위해 오는 당신의 당신이 일반적으로 귀하의 응용 프로그램에 재사용 클래스. 그들은 유틸리티 클래스가 아닙니다. 그것들은 특정한 일을하는 수업이며, 실제로하는 일은 실제로 수업의 이름이어야합니다.

단위와 단위 변환을 다루는 코드를 만들었다 고 상상해보십시오. 당신은 그것을 이름을 Utility짓고 동료들로부터 미워할 수 있습니다 . 또는 당신은 그것을 이름을 수 UnitsUnitsConversion.


7
"유틸리티 클래스는 본질적으로 잘못되었습니다". 흥미 롭군 Math 함수 유틸리티 클래스와 같은 것에 어떤 솔루션을 제안합니까? 기본 산술 연산자 이외의 함수를 사용하려면 Math 객체 의 인스턴스 가 실제로 필요합니까?
FrustratedWithFormsDesigner

1
동의하지만 대안으로 무엇을 제안 하시겠습니까?
사용자


4
"유틸리티"라이브러리를 가장 길게 만드는 것을 지연 시켰지만 결국 포기해야합니다. 대안은 약 3 줄의 코드로 구성된 DLL을 사용하는 것이 번거롭고 node.js의 종속성을 상기시킵니다. ) 또는 유틸리티 메소드를 복사하여 붙여 넣을 필요가있는 모든 단일 클래스에 붙여 넣기 ( "임의의 메소드 콜렉션"클래스를 사용하지 않도록). 결국 IMO는 필요한 악입니다.
Matti Virkkunen

3
@FrustratedWithFormsDesigner : 간단히 ... Math? Utility모든 것에 접미사를 추가 하는 것이 어떻게 우리 삶을 더 편하게 할 수 있는지 모르겠습니다 . .NET의 System.Math.Min()방법을 사용할 때 SystemUtility.MathUtility.Min()대신 쓰기 를 선호 합니까? 모든 경우에, 나는 내 답변을 크게 편집 했으므로 지금은 더 명확해야합니다.
Arseni Mourzenko
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.