네임 스페이스가있는 Smurf Naming 클래스를 피하는 문제


39

스머프 명명이라는 용어를 여기 에서 뽑았습니다 (21 번). 문제를 잘 모르는 사람을 구하기 위해 Smurf 이름 지정은 관련 클래스, 변수 등을 공통 접두어로 접두어로 붙여 "a SmurfAccountViewa SmurfAccountDTOto a SmurfAccountController"등으로 끝나는 행위입니다 .

내가 일반적으로 들었던 해결책은 스머프 네임 스페이스를 만들고 스머프 접두사를 삭제하는 것입니다. 이것은 일반적으로 나에게 도움이되었지만 두 가지 문제가 있습니다.

  1. Configuration수업 이있는 도서관에서 일하고 있습니다. 호출되었을 수는 WartmongerConfiguration있지만 Wartmonger 네임 스페이스에 있으므로 그냥 호출 Configuration됩니다. 마찬가지로 Configuration호출 할 수 있는 클래스가 SmurfConfiguration있지만 Smurf 네임 스페이스에 있으므로 중복됩니다. 내 코드에는 Smurf.Configuration나란히 표시 Wartmonger.Configuration되고 정규화 된 이름을 입력하는 것이 어색하고 코드를 읽을 수 없게 만드는 장소가 있습니다. a SmurfConfiguration와 라이브러리 를 다루는 것이 더 좋을 것 WartmongerConfiguration입니다.

  2. ServiceSmurf 네임 스페이스에서 호출 될 수 있는 클래스 가 있습니다 SmurfService. Smurf 작업을 실행하는 복잡한 Smurf 라이브러리 위에 Service있는 외관 입니다. Smurf 접두사가 없으면 매우 일반적 SmurfService이기 때문에 더 나은 이름처럼 보입니다 Service. 나는 SmurfService이미 일반적이고 쓸모없는 이름이며 스머프를 없애는 것이 단지 이것을 더 분명하게 만들었 음을 받아 들일 수 있습니다 . 그러나 이름이 지정 될 수 있었다 Runner, Launcher등, 그리고 여전히 나를에 "기분"것이라고 SmurfLauncher나는 무엇을 모르기 때문에 Launcher않지만, 나는 무엇을 알고 SmurfLauncher않습니다. 당신은 무엇을하는 Smurf.Launcher것만큼이나 명백해야 한다고 주장 할 수 있다Smurf.SmurfLauncher하지만`Smurf.Launcher는 스머프를 시작하는 클래스가 아니라 설정과 관련된 클래스입니다.

이 중 하나를 처리 할 수있는 개방적이고 폐쇄 된 방법이 있다면 좋을 것입니다. 그렇지 않다면 성가심을 완화시키는 일반적인 관행은 무엇입니까?


3
Smurf.Launcher스머프를 시작 합니까 , 아니면 시작 합니까 SmurfJob? 아마도 그것은 호출 될 수 Smurf.JobLauncher있습니까?
Blorgbeard

2
클래스 XService, XManager 등의 이름을 지정하는 것은 코드 냄새입니다. 이는 아무 의미가 없습니다. Util과 같습니다. 파일 이름을 감추고 있다면 거기에 무엇이 있거나 누락되었을 수 있습니다. 안을 들여다 보지 않으면 알 방법이 없습니다. SmurfService에서 다른 것으로 완전히 이름을 바꿨습니다.
Daniel Kaplan

1
실제로 SmurfJobSmurf 설명서의 언어와 일치하도록 시작 하거나 기술적으로 실행합니다. 그와 다른 답변에 비추어로 이름 SmurfService을 바꿀 것 SmurfJobRunner입니다. 예상대로 1 번 언어에 가장 적합한 해상도가없는 것 같습니다. 나는 SmurfConfiguration올바른 통화가 될 수있는 사례를 볼 수 있지만, 제 경우 Configuration에는 번거 로움이 가장 좋다고 생각 Wartmonger.Configuration합니다.
Daniel Koverman

6
Wartmongers와 Smurfs를 모두 구성하는 데 관심이있는 단일 클래스가있는 이유를 이해하려고합니다.
Donal Fellows

Smurf.ConfigurationSmurfConfiguration다른 느낌? 확실히 그것은 여분의 문자가 아닙니다. ( Config길이가 문제라면 짧게 말입니다.) 그렇지 않은 Smurf.Configuration문제가 SmurfConfiguration있습니까?
Pablo H

답변:


16

당신은 좋은 점수를 올립니다.

  1. 중복 클래스가있는 경우 C #에서 클래스의 별칭을 지정할 수 있습니다. 예를 들어, 사용은 using ColorScheme = The.Fully.Qualified.Namespace.Outlook2007ColorScheme;보기 에 StackOverflow에이 게시물을 . 프로그래밍 언어를 표시하지 않았지만 작성한 언어에서 유추했습니다. 그래서 당신은 당신이 별명으로, 두 개의 서로 다른 프로젝트를 할 수 다루고 곳 SmurfConfigurationWartmongerConfiguration두 클래스를 모두 소모 할 때 어떤 모호함을 무료 것입니다.

  2. 서비스가 외부 응용 프로그램에 노출되면 응용 프로그램 이름으로 서비스를 브랜딩하는 데 아무런 문제가 없으므로이 경우 SmurfService소비 응용 프로그램에서 실제로 서비스 그룹을 명확하게하기 때문에 유효합니다.

이 이름 지정 스타일을 피하기 위해 네임 스페이스를 사용해야한다고 생각합니다. MyCompanyMyProductMyAreaClassName을 읽지 않으면 코드를 이해하고 클래스가 무엇인지 액면에서 확인하기가 더 어려워집니다. 앨리어싱 기술을 사용하면 필요한 곳에서 모호성을 줄일 수 있습니다. 사람들이 서비스를 소비 할 때 # 2에서 지적한 것처럼 이름 지정에 복잡성을 도입해야 할 유일한 시점입니다. 소비자가 다양한 서비스를 가지고 있다면 애매 모호함을 소비하는 것이 혼란 스러울 수 있기 때문에 이런 스타일의 이름을 갖는 것이 가장 합리적입니다.


5
별명은 일을 방해합니다. Smurf.Service 대신 SmurfService = Smurf.Service가 있습니다. 따라서 SmurfService를 처음에 그 이름으로 사용했을 수도 있습니다. 그들은 특정 문제에 대한 장소는 없지만 그러나, 아마 대답이없는 문제에 대한 가장 좋은 답변 :)
gbjbaanb

. 내 C #이 내 질문에 나왔지만 실제로는 현재 java 및를 다루고 org.apache.smurfville.wartmonger.configuration있습니다. 불행히도 이것은 별칭을 배제합니다. 2는 견실 한 점이므로 Smurf 브랜딩을 서비스 용으로 유지하겠습니다.
Daniel Koverman

25

네임 스페이스의 요점은 충돌하지 않고 다른 라이브러리에서 동일한 이름의 클래스를 가질 수 있다는 것입니다. 둘 다에서 동일한 명명 된 클래스를 사용해야하는 경우 네임 스페이스 범위로 하나 또는 둘 모두를 접두어로 모호성을 제거해야합니다.

Smurf가 당신에게 클래스에 대해 특정한 것을 말하면 많은 Smurf 클래스를 갖는 것이 그렇게 나쁘지는 않습니다. 수업 이름은 수업 내용에 대한 정보를 제공하기에 충분히 설명 적이어야합니다.

      Session
       ^   ^
      /     \
DBSession   HttpSession

마찬가지로 객체를 반환하는 객체를 사용할 DBSession수도 있습니다 . 힘도에서 작동 하고 객체.DBRequestDBResponseHttpSessionHttpRequestHttpResponse

이들은 목적을 가진 스머프 수업입니다.

그들은에서 살 수있는 MyCompany공간 만 MyCompanyHttpSession하고 MyCompanyDBSession당신이 전에했던 것보다 당신에게 더 많은 정보를 제공하지 않습니다. 이 경우 Smurf를 삭제하고 네임 스페이스로 만드십시오.

MyCompany.HttpSession

3

나는 전에 이와 같은 혼란의 지점에 부딪쳤다. 그리고 그것은 실제로 우리가 그 이름의 일부로서 어떤 종류의 것을 포함 시키는가에 대한 의문이다.

당신은 언급 SmurfConfigurationWartmongerConfiguration구성의 가능성 종류로. 당신은 형용사 (그 종류)를 네임 스페이스로 제거 했으므로 남은 것은 바닐라 Configuration입니다. 나는 그렇게하지 않을 것입니다.

딸기 아이스크림이 딸기 이름 공간의 아이스크림이고 초콜릿과 마찬가지로 아이스크림이라고 결정하는 것과 같습니다. 그러나 일어난 일은 당신이 물건 자체와 정체성을 부여하는 형용사와 이혼 한 것입니다. 딸기 카테고리에서는 아이스크림이 아닙니다. 딸기 아이스크림입니다. 일종의 아이스크림입니다.

앱에서 Strawberry.IceCream클래스 를 가져온 다음에서 직접 인스턴스화를 시작 한다고 가정 해 봅시다 IceCream.

var ic = new IceCream(); //actually I'm strawberry ice cream

이것은 다른 IceCream클래스를 가져 오는 순간까지 잘되고 좋아 보일 수 있습니다 . 이제 당신은 어떻게 든 그것들을 구별해야하는 원래의 문제로 돌아 왔습니다. 당신이 함께 원하는 것은 :

var sic = new StrawberryIceCream();
var cic = new ChocolateIceCream();

라이브러리에서 동일한 개념을 나타내는 제 3 자 간의 충돌 가능성을 피하기 위해 네임 스페이스를 사용하는 것이 좋습니다. 그러나 한 개발자가 라이브러리 나 프로젝트를 만들 때 각 개념의 이름을 고유하게 지정하고 네임 스페이스를 조직의 폴더로만 사용해야합니다. 종종 폴더의 이름은 그것이 구성하는 개념의 이름에서 찾을 수 있습니다.


2

많은 클래스에 공통 접두사가있는 경우 아마도 고유 한 네임 스페이스로 이동할 가치가 있다는 것은 분명히 좋은 규칙입니다. 문제를 해결하려면 두 네임 스페이스에서 비슷한 이름의 클래스를 사용해야 할 때 :

1) 별칭 네임 스페이스는 짧고 요점으로 자연 약어, 아마도 1 글자로 만들 것입니다.

using Sm = Smurf;
using W = Wartmonger;

그런 다음 항상 사용하는 곳마다 접두사를 지정하고 인스턴스 이름을 적절하게 지정하십시오.

Sm::Configuration smConf; 
W::Configuration wConf;

2) 다른 답변에서 제안한 것처럼 수업 별명.

using SmConf = Smurf.Configuration;

3) 제어하는 ​​라이브러리는 '구성'이라는 용어를 사용하지 않는 것을 고려하십시오. 동의어 사전을 사용하십시오 (예 : '설정', '모델', '매개 변수'). 어쨌든 상황에 더 의미가있을 수 있습니다. 예를 들어 Smurf가 일종의 수치 분석 모듈 인 경우 '매개 변수'를 작성하면 구성에 더 좋습니다. 모듈 이름과 관련된 특정 어휘를 사용하면 다른 네임 스페이스와 혼합 될 때도 고유성을 유지하는 고유 한 이름을 얻을 수 있습니다. 나는 이것이 OP 질문 2에 대한 답이라고 생각합니다.

4) 코드를 리팩터링하여 두 곳의 구성을 혼합하여 사용할 필요가 없습니다. 그 세부 사항은 당신에게 달려 있습니다.

5) 수업에 전달하기 전에 두 구성을 하나로 결합하십시오. 결합 된 conf 클래스를 사용하여 다음을 나타냅니다.

struct Conf {
    SmurfConfiguration smurf;
    WartmongerConfiguation wart;
}

짧은 멤버 변수 이름은 이제 클래스 / 네임 스페이스의 앨리어싱과 같은 것을 달성합니다.


0

이름에 하나의 포인트를 추가하면 귀찮게되는 것이 이상합니다.

Wartmonger.Configuration configuration = Wartmonger.Configuration .new();

// vs

WartmongerConfiguration configuration = WartmongerConfiguration.new();

두 경우 SmurfWartmonger구성이 한 곳에서 함께 사용할 수 있지만 separatly가 여러 장소에서 사용되는 - 다음 네임 스페이스는 확실히 좋은 방법입니다.

네임 스페이스가 있으면 내부 코드에서 "깨끗한"이름을 사용할 수 있습니다. 접두사가 붙으면 SmurfConfiguration내부 SmurfService의 내부 코드를 사용하게되므로 해당 코드를 열 때마다 성 가실 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.