명명 클래스-모든 것을“<WhatEver> Manager”라고 부르는 것을 피하는 방법? [닫은]


1188

오래 전에 필자는 객체 이름 지정에 대한 "올바른"트랙을 다루는 기사 (블로그 항목을 믿습니다)를 읽었습니다.

예를 들어 내 응용 프로그램이 (일반적인 비즈니스 응용 프로그램) 사용자, 회사 및 주소를 처리하는 경우 User, a CompanyAddress도메인 클래스가 있고 아마도 어딘가에 a UserManager, a CompanyManager및 a AddressManager가 표시됩니다.

그래서 당신은 어떤 사람들을 말할 수있는 UserManager, CompanyManager그리고 AddressManager합니까? 아니요. Manager는 도메인 개체로 수행 할 수있는 모든 작업에 적합한 매우 일반적인 용어이기 때문입니다.

내가 읽은 기사는 매우 구체적인 이름을 사용하는 것이 좋습니다. C ++ 응용 프로그램이고 UserManager의 작업이 힙에서 사용자를 할당하고 해제하는 경우 사용자를 관리하지 않고 출생과 사망을 보호합니다. 흠, 아마도 우리는 이것을이라고 부를 수 UserShepherd있습니다.

또는 UserManager의 임무는 각 User 객체의 데이터를 검사하고 암호화하여 데이터에 서명하는 것입니다. 그리고 우리는이있을 것이다 UserRecordsClerk.

이제이 아이디어가 나와 붙어서 적용하려고합니다. 그리고이 간단한 아이디어를 놀라 울 정도로 어렵게 찾으십시오.

클래스가하는 일을 설명 할 수 있고 (빠르고 더러운 코딩에 빠지지 않는 한) 내가 작성한 클래스는 정확히 가지 작업을 수행합니다 . 그 설명에서 이름으로 가기 위해 놓친 것은 일종의 이름 카탈로그, 개념을 이름에 매핑하는 어휘입니다.

궁극적으로 패턴 카탈로그와 같은 것을 마음에두고 싶습니다 (종종 디자인 패턴은 팩토리 와 같은 객체 이름을 쉽게 제공합니다 )

  • 팩토리-다른 오브젝트를 작성합니다 (디자인 패턴에서 가져온 이름 지정).
  • 목자-목자는 객체의 수명, 생성 및 종료를 처리합니다.
  • 동기화 기-둘 이상의 객체 (또는 객체 계층)간에 데이터를 복사합니다.
  • Nanny-생성 후 개체가 "사용 가능한"상태에 도달하도록 지원합니다 (예 : 다른 개체에 배선하여)

그렇다면 그 문제를 어떻게 처리합니까? 당신은 고정 어휘를 가지고 있습니까, 당신은 즉시 새로운 이름을 발명합니까 또는 중요하지 않은 또는 잘못된 이름을 고려합니까?

추신 : 또한이 문제를 다루는 기사와 블로그 링크에 관심이 있습니다. 시작으로 여기에 내가 생각한 원래 기사가 있습니다. 'Manager'없이 Java 클래스 이름 지정


업데이트 : 답변 요약

그동안 내가이 질문에서 배운 내용에 대한 약간의 요약이 있습니다.

  • 새로운 은유를 만들지 마십시오 (내니)
  • 다른 프레임 워크의 기능을 살펴보십시오

이 주제에 대한 추가 기사 / 책 :

그리고 답변에서 수집 한 이름 접두사 / 접미사 (주제!)의 현재 목록 :

  • 조정자
  • 건축업자
  • 작가
  • 리더
  • 매니저
  • 컨테이너
  • 실험 계획안
  • 표적
  • 변환기
  • 제어 장치
  • 전망
  • 공장
  • 실재
  • 버킷

그리고 길을위한 좋은 팁 :

명명 마비를 얻지 마십시오. 예, 이름은 매우 중요하지만 많은 시간을 낭비 할만큼 중요하지는 않습니다. 10 분 안에 좋은 이름을 찾지 못하면 계속 진행하십시오.


11
"최상의"답변이 없기 때문에 커뮤니티 위키에 속합니다. 토론입니다.
DOK

13
그것은 반 직관적입니다. 그들은 그것을 포럼이라고 부를까요? 나는 위키가 의견이 아닌 사실의 수집을위한 것이라고 생각합니다.
AaronLS

78
이 업데이트를 유지해 주셔서 감사합니다-그러나 마지막 팁은 끔찍한 조언입니다! 10 분 안에 좋은 이름을 생각하지 못하면 수업에 문제가있을 수 있습니다. (표준주의 사항 : 1) 완벽은 선의 적입니다. 2) 배송은 기능입니다. 기술적 부채가 발생한다는 것을 기억하십시오.
Jeff Sternal

11
10 분 안에 좋은 이름을 찾지 못하면 동료에게 도움을 요청하십시오. 포기하지 마십시오.

9
10 분 안에 좋은 이름을 찾지 못하면 동료들에게 설명해보십시오. 그들은 좋은 이름을 생각할 수도 있지만 (user338195) 설명하려고 시도하면 문제가있는 것을 발견하는 데 도움이 될 것입니다 ( Jeff ).
WillC

답변:


204

내가 물어 비슷한 질문을 하지만, 가능하다면 나는 이미 이름을 복사하려고 닷넷 프레임 워크, 그리고 내가 아이디어를 찾아 자바안드로이드 프레임 워크.

보인다 Helper, Manager그리고 Util더 상태를 포함하지 일반적 절차 및 정적 클래스를 조정하기위한 부착 피할 수없는 명사이다. 대안은 Coordinator입니다.

당신은 이름 특히 보라색 prosey를 얻을 수와 같은 것들에 갈 수있다 Minder, Overseer, Supervisor, Administrator,와 Master,하지만 난 당신이 사용하고있는 프레임 워크 이름처럼 유지를 선호했다한다.


.NET 프레임 워크 에서 찾을 수있는 다른 일반적인 접미사 (올 바르면)

  • Builder
  • Writer
  • Reader
  • Handler
  • Container

4
나는 이것을 많이 좋아한다. 그들은 이미 .NET Framework에서 사용하고 있기 때문에 나쁘거나 알려지지 않은 은유의 함정에 빠지지 않습니다. 일반적으로 사용되는 것에 대한 더 많은 정보를 얻으려면 다른 라이브러리 (Java)를 보는 것도 흥미로울 수 있습니다.
froh42

나는 Conductor음악 오케스트라의 지휘자처럼 제안 하고 싶습니다. "수행"해야하는 공동 작업의 특성에 따라 중요한 역할을 수행해야합니다 (다른 개체는 중앙 집중식 명령에 응답하고 다른 모든 공동 작업자에 대해 너무 걱정하지 않아도되는 매우 특수한 행위 자임).
heltonbiker

1
나는 클래스에 대한 해결책이 다른 이름을 찾는 것이라고 믿지 않는다. 다른 많은 게시물을 읽었으며 답변을 배우려고 노력하면서 사용 된 이름뿐만 아니라 아키텍처를 변경해야한다는 것입니다.
Michael Ozeryansky 1

115

source-code-wordle.de를 살펴볼 수 있습니다 . .NET 프레임 워크 및 기타 라이브러리의 클래스 이름 접두사가 가장 많이 사용되는 것을 분석했습니다.

상위 20 개는 다음과 같습니다.

  • 속성
  • 유형
  • 돕는 사람
  • 수집
  • 변환기
  • 매니저
  • 정보
  • 공급자
  • 예외
  • 서비스
  • 요소
  • 매니저
  • 마디
  • 선택권
  • 공장
  • 문맥
  • 안건
  • 디자이너
  • 베이스
  • 편집자

147
오래 전에 한 특정 회사에서 엔지니어가 회사를 괴롭히는 터무니없고 점점 더 많은 접미사 규칙에 얽매여 엔지니어가 모든 클래스를 반항적으로 끝내는 것을 알고있었습니다 Thingy.

8
이 이름 목록 자체는 접미사를 적용 해야하는 컨텍스트가 없으면 그렇게 유용하지 않습니다.
프레드

65

나는 좋은 이름을 가진 사람이며, 종종 이름을 선택할 때주의를 기울여야하는 중요성에 대해 글을 씁니다. 이 같은 이유로, 나는 이름을 지을 때 은유에주의한다. 원래 질문에서 "공장"과 "동기화 기"는 의미하는 것의 좋은 이름처럼 보입니다. 그러나 "셰퍼드"와 "유모"는 은유에 기초하기 때문에 아닙니다 . 코드의 클래스는 말 그대로 보모가 될 수 없습니다 . 당신은 그것을 보모라고 부릅니다. 왜냐하면 아기 나 아이들을 돌보는 실제 보모와 매우 흡사합니다. 비공식적으로 말하면 괜찮지 만, 누가 알지 누가 누가 알 수 있는지에 따라 코드에서 클래스를 명명하는 것은 괜찮습니다.

왜? 은유는 문화에 의존하고 종종 개인에 의존하기 때문입니다. 당신에게 클래스 "nanny"의 이름을 지정하는 것은 매우 분명 할 수 있지만 다른 사람에게는 그다지 명확하지 않을 수 있습니다. 개인적인 용도로만 사용되는 코드를 작성하지 않는 한 그에 의존해서는 안됩니다.

어쨌든 관습은 은유를 만들거나 깨뜨릴 수 있습니다. "공장"자체의 사용은 은유를 기반으로하지만 꽤 오랫동안 사용되어 왔으며 현재 프로그래밍 세계에서 상당히 잘 알려진 것이므로 사용하는 것이 안전하다고 말할 것입니다. 그러나 "유모"와 "목자"는 용납 할 수 없습니다.


10
이 주장은 실제로 팩토리 자체가 은유라는 점에서 실제로 분해됩니다. 은유법은 객체의 장점을 명확하게 드러내는 반면, 모호하거나 일반적인 것은 자동으로 코드의 기능을 완전히 파악하는 유일한 방법입니다! 최악의 시나리오.
Kzqai

1
'귀여운'이름을 피하기 위해 +1. 나는 당신이 할 수있는 한 언어로 직접하는 것이 좋다고 생각합니다. (물론, 직접적이고 간결하며 정확 하고 모호하지 않은 것은 항상 쉬운 일이 아닙니다 …)
andrewf

1
동사 + "er"의 독창적 인 선택은 일반적으로 다채로운 유물보다 구체적인 수업에서 더 명확해질 것입니다. 반면, 새로운 개념 인 새로운 개념, 새로운 "것"보다는 새로운 "종류의 것"은 은유 (Java의 "beans", Haskell의 "lenses", GUI)로 잘 작동합니다. "창", 여러 언어의 "약속"). 그러나 대부분의 코드베이스에는 이와 같은 진정한 발명품이 없습니다.
Malnormalulo

51

우리는 어떤없이 할 수있는 xxxFactory, xxxManager또는 xxxRepository우리가 제대로 현실 세계를 모델링하는 경우 클래스 :

Universe.Instance.Galaxies["Milky Way"].SolarSystems["Sol"]
        .Planets["Earth"].Inhabitants.OfType<Human>().WorkingFor["Initech, USA"]
        .OfType<User>().CreateNew("John Doe");

;-)


11
평행 유니버스 및 대체 차원에 어떻게 접근합니까?
tster

23
간단합니다 : Omniverse.Instance.Dimensions [ "Ours"]. Universes [ "Ours"]. Galaxies ... ... 괜찮아. ;-)
herzmeister

73
업데이트 : 이것은 .NET 4.0에서 추가되었습니다 : Universe.Instance.ToParallel();)
Connell

2
그래도 데메테르의 법칙을 어기다!
조나스 지

13
그것들은 클래스 이름이 아닌 객체와 멤버입니다
Harry Berry

39

dailywtf.com, "ManagerOfPeopleWhoHaveMortgages"등에 게시 될 내용에 미끄러운 경사처럼 들립니다.

하나의 모 놀리 식 Manager 클래스는 디자인이 좋지 않지만 'Manager'를 사용하는 것은 나쁘지 않습니다. UserManager 대신 UserAccountManager, UserProfileManager, UserSecurityManager 등으로 분류 할 수 있습니다.

'관리자'는 클래스가 실제 '사물'을 나타내지 않음을 분명히 나타 내기 때문에 좋은 단어입니다. 'AccountsClerk'-그것이 사용자 데이터를 관리하는 클래스인지, 또는 업무 담당 회계 담당자 인 사람인지 어떻게 알 수 있습니까?


8
UserAccounter, UserProfiler 및 UserSecurer는 어떻습니까? 관리자를 제거하면 특정 정의를 내야합니다. 좋은 정의라고 생각합니다.
Didier A.

10
UserAccount, UserProfile, UserSecurity oO는 어떻습니까?
clime dec

3
나는 "MortageOwnersManager"라는 이름을 것이다
volter9

도메인에 특정 이름이있는 경우가 있습니다. "MortageHolder"처럼 "MortageOwner"
borjab


24

클래스 이름을 사용 Manager하거나 Helper클래스 이름으로 생각할 때 코드 악취로 간주됩니다. 이는 올바른 추상화를 아직 찾지 못했거나 단일 책임 원칙을 위반하여 리팩토링하고 디자인에 더 많은 노력을 기울이고 있음을 의미합니다. 종종 이름 지정이 훨씬 쉬워집니다.

그러나 잘 설계된 클래스조차도 항상 이름을 밝히지 않으며 비즈니스 모델 클래스를 생성하는지 기술 인프라 클래스를 작성하는지에 따라 선택이 부분적으로 달라집니다.

비즈니스 모델 클래스는 도메인마다 다르기 때문에 어려울 수 있습니다. Policy도메인 내 전략 클래스 (예 :) 와 같이 많이 사용하는 용어가 LateRentalPolicy있지만, 일반적 으로 비즈니스 사용자와 공유하고 클래스를 설계하고 이름을 지정할 수 있는 " 유비쿼터스 언어 " 를 만들려고 할 때 실제로 사용됩니다. -세계의 아이디어, 사물, 행동 및 사건.

기술 인프라 클래스는 우리가 정말 잘 알고있는 영역을 설명하기 때문에 조금 더 쉽습니다. 디자인 패턴 이름을 클래스 이름에 통합하는 것을 선호 InsertUserCommand, CustomerRepository,하거나 SapAdapter.의도 대신 구현 통신에 대한 우려를 이해하지만 디자인 패턴은 클래스 디자인의 두 가지 측면과 결혼합니다. 적어도 원하는 인프라를 다루는 경우 세부 사항을 숨기는 동안에도 투명하게 구현 디자인 을 구현할 수 있습니다.


1
Policy비즈니스 로직이 포함 된 클래스에 접미사를 사용한다는 아이디어가 정말 마음에
듭니다.

"Manager"및 "Helper"와 같은 이름과 관련된 코드 냄새를 언급하면 ​​+1입니다. 나는 물건에 대한 명확한 이름이 없다면, 그것은 비즈니스 나 기술에 관계없이, 도메인에 대한 나의 이해에서 약간의 어지러움에서 비롯된 것임을 알게됩니다. 거의 똑같이, 그것은 "너무 커졌기"때문에 클래스를 반응 적으로 해체하고 있다는 것을 의미 할 수 있습니다. 이것이 가장 많이 투표 된 답변이어야합니다.
nclark

10

GOF book에 의해 정의 된 패턴으로 실패 하고, 그 이후에 객체의 이름을 지정하면 클래스의 이름을 지정하고 구성하고 의사 소통을하는 데 많은 도움이됩니다. 대부분의 사람들은이 명명법 (또는 적어도 그 일부)을 이해할 것입니다.


Fowler는 저에게 좋은 참고 자료이지만 GOF는 큰 추천입니다.
나사로

내 무지를 용서하십시오. 어떤 Fowler 책을 참조하고 있습니까?
Brian Agnew


19
흠, 때로는 이것이 작동합니다 (예 : 팩토리 또는 전략)하지만 다른 경우에는 이것이 클래스의 의도와 작업보다 구현 방법 (패턴을 사용했습니다!)을 전달한다고 생각합니다. 예를 들어 Singleton의 가장 중요한 점은 Singleton이 아니라 대표하는 것입니다. 따라서 사용 된 패턴 이후의 엄격한 명명은 사용 된 유형 후의 엄격한 명명과 같은 느낌입니다. 예를 들어 Windows 시스템 그룹에서 잘못 적용한 헝가리어 표기법 ( "의도 유형"대신 C 데이터 유형 설명)
froh42

1
기술 인프라 클래스의 경우 일반적으로 구현을 투명하게 만드는 것이 바람직하며 대부분의 표준 디자인 패턴 이름은 구현과 의도를 모두 전달합니다. 그러나 도메인 모델 클래스는 또 다른 문제입니다.
Jeff Sternal

10

XyzManager보다 클래스에 대해 더 구체적인 이름을 얻을 수 없다면 이것이 클래스에 속하는 기능, 즉 건축 적 '코드 냄새'인지 여부를 재고해야 할 시점입니다.


8

명심해야 할 가장 중요한 것은 이름이 충분히 설명 적이라고 생각합니다. 클래스가 무엇을해야하는지 이름을 보면 알 수 있습니까? 클래스 이름에 "Manager", "Service"또는 "Handler"와 같은 단어를 사용하는 것은 너무 일반적인 것으로 간주 될 수 있지만 많은 프로그래머가이를 사용하므로 클래스의 목적을 이해하는 데 도움이됩니다.

나는 나 자신이 정면 패턴을 많이 사용하고있다. User한 명의 사용자를 설명 하는 클래스와Users 클래스 "사용자 모음"을 추적 . 나는 UserManager실생활에서 관리자를 좋아하지 않기 때문에 클래스를 호출 하지 않으며 나는 상기시키기를 원치 않습니다. :) 복수형을 사용하는 것만으로도 클래스가하는 일을 이해하는 데 도움이됩니다.


또한이 접근 방식은 객체의 하향식 관리 개념을 쉽게 해주므로 정말 좋습니다. 사용자 그룹은 UserManager가 아닌 사용자간에 작업이 완료되었음을 암시합니다. 또한 User에 대한 참조를 소유 한 사용자가 UserManager를 소유하는 것만 큼 이상하지 않습니다. 엄격하게 OOP보다는 상대적 사고에 더 개방적입니다.
Seph Reed 2018

이 접근 방식의 문제점은 Users특히 관리자 객체를 전달하는 경우 코드를 찾기가 실제로 어렵다는 것 입니다. this.users = new Users()그러나 코드의 다른 곳에서는 s users배열을 참조합니다 User.
눈사람

말했듯이 사용자는 실제로 "사용자 모음"을 의미합니다-상태가 양호한 엔티티의 모음입니다. 그러나 SRP는 사용자 관리 (기능 및 비즈니스 논리)를 사용자 데이터 (상태)와 번들로 묶고 싶지 않다는 것을 의미합니다. 당신이 틀렸다고 말하는 것이 아니라, 클래스가 사용자를 관리하고 그들의 상태와 기본 CRUD를 저장하는 것이 아니라면 UserManager가 적절하다는 것입니다.
Richard Moore

5

C #에만 해당하는 것을 발견했습니다. "프레임 워크 디자인 지침 : 재사용 가능한 .NET 라이브러리의 규칙, 숙어 및 패턴" 에서 명명 논리에 대한 많은 정보를 얻을 수있었습니다.

보다 구체적인 단어를 찾는 한, 나는 종종 동의어 사전을 사용하고 관련 단어를 뛰어 넘어 좋은 단어를 찾으려고 노력합니다. 개발을 진행하면서 더 나은 이름을 얻거나 때로는 SuchAndSuchManager여러 클래스로 나뉘어 야한다는 사실을 깨닫고 더 이상 사용하지 않는 클래스의 이름이 문제가되지 않습니다. .


3

나는 여기서 중요한 것은 코드의 가시성 영역 내에서 일관성이 있어야한다고 생각합니다. 즉, 코드를 보거나 작업 해야하는 모든 사람들이 네이밍 규칙을 이해하는 한 전화를 걸더라도 괜찮습니다. '회사 Thingamabob'및 'UserDoohickey'. 회사를 위해 일하는 경우 첫 번째 중지는 회사 이름 지정 규칙이 있는지 확인하는 것입니다. 회사에 근무하지 않거나 근무하지 않는 경우 자신에게 적합한 용어를 사용하여 자신을 만들고 최소한 부담없이 코딩하고 신뢰할만한 피드백을 통합하는 신뢰할 수있는 동료 / 친구 몇 명에게 전달하십시오.

다른 사람의 컨벤션을 널리 받아 들여도 페이지가 튀어 나오지 않으면 내 책에서 약간의 실수가 있습니다. 우선 다른 문서를 참조하지 않고 코드를 이해해야하지만 동시에 동일한 산업 분야의 같은 분야에있는 다른 사람이 이해할 수 없을 정도로 포괄적이어야합니다.


1
그럼에도 불구하고 약간 직관적이지 않은 컨벤션이 컨벤션을 시작하는 것보다 낫습니다. 프로젝트를 진행하는 사람들은 일관된 컨벤션을 매우 빠르게 배우고 곧 기능이 언뜻 예상 할 수있는 것이 아니라는 사실을 잊게됩니다.
Mr. Boy

@ 존, 그게 내가 말한 그대로입니다. 단체가 협약을 수락해야하며 회사에서 근무하는 경우 회사 협약이 있는지 확인하십시오. 저는 어떤 그룹이든 오픈 소스 프로젝트 팀이거나 느슨한 프로그래머 그룹으로 생각합니다. 모든 사람들이 자신의 요구 사항에 거의 부합하는 것을 구할 수 있다면 혁신이 부족하다고 생각합니다.
나사로

2

시스템에 사용하는 패턴, 클래스의 명명 규칙 / 카탈로그 / 그룹화는 사용 된 패턴으로 정의되는 경향이 있습니다. 개인적으로, 나는 다른 사람들이 내 코드를 가져 와서 실행할 수있는 가장 가능성이 높은 이름 지정 규칙을 고수합니다.

예를 들어 UserRecordsClerk는 UserRecordsClerk와 CompanyRecordsClerk가 구현 한 다음 전문화하는 일반 RecordsClerk 인터페이스를 확장하는 것으로 더 잘 설명 될 수 있습니다. 즉, 인터페이스의 메소드를보고 해당 서브 클래스의 기능이 무엇인지 일반적으로 알 수 있습니다.

디자인 패턴 과 같은 책을보십시오 정보 훌륭한 책이며 아직 코드를 사용하지 않는 경우 코드를 사용하려는 위치를 정리하는 데 도움이 될 수 있습니다! ;영형)

나는 당신의 패턴이 잘 선택되고 적절하게 사용되는 한, 매우 독창적 인 수업 이름으로 충분하다고 생각합니다!


Brian Agnew의 답변에 대해 언급했습니다. 패턴 이름이 어떤 경우에는 (Factory, Strategy) 좋은 클래스 이름을 만들지 않지만 다른 경우에는 그렇지 않습니다 (Singleton). 이름이 클래스의 작업을 반영하는 방식이 아니라 클래스의 작업을 반영하기를 원합니다.
froh42
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.