어떤 네이밍 안티 패턴이 존재합니까? [닫은]


35

당신이 그 이름에 도달하는 것을 발견하면, 당신은 이미 무언가를 엉망으로 만들었다는 것을 알고있는 몇몇 이름들이 있습니다.

예를 들면 다음과 같습니다.

XxxManager
이것은 클래스가 클래스의 기능을 설명해야하기 때문에 좋지 않습니다. 수업에서 수행 할 수있는 가장 구체적인 단어가 "관리"인 경우 수업이 너무 큽니다.

다른 이름 지정 안티 패턴이 있습니까?

명확히하기 위해, 나는 "어떤 이름이 나쁜지"묻지 않습니다. 그 질문은 전적으로 주관적이며 대답 할 방법이 없습니다. "시스템의 전반적인 디자인 문제를 나타내는 이름은 무엇입니까?" 즉, Xyz 구성 요소를 호출하려는 경우 구성 요소가 잘못되었음을 나타냅니다. 또한 모든 규칙에 예외가 있습니다. 디자인을 정말로 멈추고 다시 생각해야 할 때 경고 플래그를 찾고 있습니다.



4
"건설적이지 않은"투표로 마감 한 사람들에게-그 이유를 기꺼이 설명 하시겠습니까? 이것으로 잘 수행되지 않는 유일한 방법은 답변이 짧을 수 있지만 다른 5 가지 지침을 확실히 충족한다는 것입니다.
Billy ONeal


2
@Aaronaught : 어떤 제안? 나는 이것을 편집 할 수있을뿐만 아니라 이것을 분명히했다 ....
Billy ONeal

1
@ jhocking-나는 그 링크 중 일부에 동의합니다. 특히 "매니저"와 "핸들러"가 너무 귀중한 것은 아닙니다. 그리고 나는 디자인 패턴 기반 및 다른 대안에 팔리지 않았습니다. 많은 경우 모호한 것처럼 보입니다. 때때로 "대기열"또는 기타 적절한 것이 있지만 종종 관리자가 항목을 대기열에 보관 (또는 참조)한다는 사실은 이러한 항목을 관리하는 한 가지 측면 일뿐입니다. 유용한 정보가 직책으로 "관리자"에 의해 표현 된 것처럼, IMO도 OOP에 적용됩니다.
Steve314

답변:


22

다음 이름 지정 안티 패턴은 .NET, 특히 C #과 관련이 있습니다.

  • 불일치 . 모든 필드 이름을 밑줄로 시작하기로 결정한 경우 해당 필드 이름 을 사용하십시오 .
  • 모음이없는 Ambiguos 약어 . 과 같은 필드 이름을 심각하게 보았습니다 cxtCtrlMngr. 그것이 무엇을 의미하는지 거의 추측 할 수 없습니다.
  • 너무 길고 자세한 변수 이름 입니다. ILoginAttemptRepository훌륭하고 설명 적 ILoginAttemptRepositoryUsingEntityFrameworkForObjectRelationalMapping입니다. 설명 적이지만 확실히 좋지는 않습니다.

7
되어 I의미하는 의미가 interface여기에, implementer또는 첫번째 사람 단수를? 대부분의 클래스는 인터페이스를 구현하기 때문에 너무 많은 클래스 / 인터페이스가 대문자로 시작되는 I것은 성가 시며 가독성을 방해하고 코드 자체에 악취가납니다.
사용자 알 수 없음

3
"모음이없는 Ambiguos 약자"+1하면 저를 미치게합니다!
FrustratedWithFormsDesigner

6
@Billy ONeal : C ++에는 인터페이스가 있습니다. 그들은 인위적으로 수업에서 분리되지 않습니다. ;)
Jon Purdy 2016

4
@ 빌리 ONeal : 그게 내 요점이었다.
Jon Purdy 2016

2
@MariusSchulz : 예, 동의합니다. :) 그렇게 불투명 한 약어는 아니라고 생각했습니다.
amara

9

내가 자주 접하는 것은 단순히 이름 지정 패턴을 전혀 사용하지 않는 것입니다. 일반적으로 개발자 무지 (네이밍 패턴이 좋은 것임을 나타냄)를 나타내며이 반 패턴은 클래스와 관련된 모든 종류의 메소드를 해당 클래스 자체에 채워서 SRP를 심각하게 위반하는 경향이 있습니다. 클래스에는 속성, CRUD 메서드, 응용 프로그램의 일부에 필요한 고객과 원격으로 관련된 모든 것이 있습니다.

또한 접미사로 "Engine"을 사용하는 것은 "Manager"를 사용하는 것과 거의 같습니다. 매우 모호하고 클래스 XxxEngine는 많은 메소드를 포함하는 VB 스타일 모듈에 해당하는 경향이 있으므로 객체 지향 프로그래밍에 대한 지식이나 아이디어없이 하나의 "사용하기 쉬운"지점에 있습니다.


7

음, 먼저 간단한 답변 : 타입 헝가리어은 ( http://mindprod.com/jgloss/unmainnaming.html , 또한 훌륭한 다른 생각을 가지고 헝가리어는 악이 아닌 경우에보다 균형 잡힌 볼 수 있습니다. http://www.joelonsoftware.com을 /articles/Wrong.html )


7
헝가리 표기법은 항상 악입니다 :)
Wayne Molina

12
@ 웨인 : 사실, 항상 악한 것은 아닙니다 . 나는 70 년대 후반 제록스에서 찰스를 위해 일했고 원래의 명명 시스템은 생명의 은인이었습니다. 우리는 정수 타입의 BCPL에서 일하고있었습니다. 유형에 관한 다른 모든 것은 사용 및 명명 규칙에 의해 전달되었습니다. 우리는 7 명의 프로그래머 + 찰스를 가졌으며 우리 중 누군가는 다른 사람의 코드를 작성하여 즉시 생산성을 높일 수있었습니다. 이것은 (심지어 Charles조차도) 끔찍하게 꼬이거나 잘못 적용 할 수 없다고 말하는 것은 아니며 올바른 맥락에서 올바른 해결책이었습니다.
피터 로웰

3
@Marius : Joel의 기사를 읽으십시오. 타입 시스템이 변수 사이의 의미 론적 차이를 항상 강제 할 수는 없습니다. Intellisense는 이러한 경우에도 도움이되지 않습니다.
Billy ONeal

4
유형은 사용보다 유추하기 쉽습니다 (예 : esp). 현대 편집자와 함께. 그러나 훈련이 필요합니다. 모든 접두사를 붙일 필요는 없습니다 . 나는 자바에서 일하고 대부분의 경우 헝가리어가 필요하지 않지만 좌표 시스템에서 동일한 유형의 변수 (fromX 및 toX와 같은)가 필요한 작업을 수행 할 때 생명의 은인입니다.
Michael K

3
좋은 점은 새로운 유형을 쉽게 만들 수있는 일반적인 능력입니다. "이것은 행 번호에 적용된다는 점을 제외하고는 정수와 같습니다."
David Thornley

6

인터페이스 이름 앞에 'I'를 붙이거나 추상 클래스 이름에 'Abstract'를 붙입니다. 이것은 수있는 인터페이스와 추상 클래스를 구별하지 않는 추상 클래스의 개념을, 또는하지 않는 언어에서 면죄 수 -하지만 자바, 예를 들어, 그것은 항상 나쁜 생각입니다.

또한 관리자에 대해서는 귀하의 의견에 동의하지 않습니다. 나는 때때로 그 패턴을 사용하며, 단지 다른 이름을 짓려고 시도하면 이름이 XxxxxManager보다 더 설명 적이 지 않다는 것을 의미합니다. 한두 단어로 깔끔하게 요약 할 수없는 몇 가지 작업 (필수적으로 복잡한 작업은 아님)이 있습니다.


@ Mike : 나는 당신의 진술에 전적으로 동의하지 않습니다. 죄송합니다. 제 생각 XxxxManager에는 클래스가 가질 수있는 최악의 이름입니다. 물론 무언가를 관리합니다! 그것이 그것이 작성된 이유입니다. Manager이름으로 클래스가 무엇을 담당하는지 이해하는 데 아무런 가치가없는 의미없는 필러 단어입니다.
Marius Schulz 2016

1
에 대해 무슨 말을 TabManager? JSP 탭 메커니즘을 제어하는 ​​클래스의 이름이 더 좋습니까? 또는 gasp TabController ... 접두사가 붙는 한 Abstract, 그것이 과도하게 사용되지만 종종 유효하다고 생각합니다 (예를 들어 Java 라이브러리 참조). 나는 I누군가가 있어야 할 인터페이스에 대해 프로그래밍하려고 시도하지 않은 곳에서는 인터페이스를 본 적이 없다고 안전하게 말할 수 있다고 생각 합니다. 마찬가지로 하나의 클래스 만 인터페이스를 구현합니다.
Michael K

1
@Darien (그리고 다른 사람들) : 어느 쪽이든-그것은 중요하지 않습니다. 그 이름들 중 어느 것도 반 패턴이 아니므로 (이 질문에서는 주제가 아닙니다). 난 당신이 그들이 사용 여부에서 시스템의 디자인에 대해 아무것도 말할 수 있다고 생각하지 않습니다 IXxx또는 XxxImpl.
Billy ONeal

2
이것은 완전히 완전히 잘못되었습니다. 거기 매우 시각적 클래스에서 인터페이스를 구별하는 이유는, (a)들이 인스턴스화 될 수없고, (b) 그것들이 해제 될 수없는들이 직렬화 될 수 / 배치 (c), (d)들은 있을 프록시 / 도청, 등, 등, 등 당신은하지 않고 안티 패턴의 예와 같이 개인적으로 (일부 기괴한 설명 할 수없는 이유) 싫어하는 뭔가를 던져 한 모든 전혀 정당화.
Aaronaught

1
가능할 때마다 인수 유형 및 리턴 유형에 대한 구체적인 클래스보다 인터페이스가 선호되어야합니다. 따라서 인터페이스가 "깨끗한"이름을 가져오고, 구체적인 구현 (호출자가 알지 못하거나 신경 쓰지 않는 실제 유형)을 가져와 사마귀를 얻는 것이 합리적입니다.
Kevin Krumwiede

6

스 필링 :

기울고있는 장애가 있고 철자를 쓸 수 없습니다. 맞춤법 검사기가 없으면 나는 힘이 없습니다. 나는 확인하기 위해 내가 만든 모든 이름을 워드 프로세서에 복사하려고하지만 항상 일부를 그리워합니다. 마지막 프로젝트에서 나는 api의 많은 부분을 썼고 responce라는 단어를 처음 사용할 때 철자 검사를하지 않았으며 아무도 말하지 않았기 때문에 그것이 옳다고 가정했습니다. 우리는 그에 대한 응답으로 적어도 50 개의 기능을 가지고있었습니다. 새로운 사람이 팀에 와서 왜 우리가 응답을 사용하는지 물었습니다.


2
매개 변수 중 하나 affect가 효과 가있는 곳에서 jQuery 플러그인을 간략하게 사용했습니다 . 그것은 나를 미치게 만들었고 같은 일을 할 다른 플러그인을 빨리 찾았습니다.
zzzzBov 2016 년

4
내가 가진 최악의 문제는 철자가 틀린 이름을 본 후에는 이름이 무엇인지 기억하는 능력이 실제로 손상된다는 것입니다.
David Thornley

1
코드의 다른 부분에서 동일한 내용의 철자가 틀리면 나빠집니다. getStrenth () 메소드가 액세스하는 클래스 Srtength의 필드 강도가있는 경우와 같습니다.
Eva

5

글쎄, 내 의견이 약간 논란이 될까봐 두렵다. 그러나 시도해보십시오 ...

내가 걱정하는 한 XxxController와 같은 Mike Baranczak에 동의해야합니다 .XxxHandler는 우리가 실제로 자주 사용하는 것입니다. 우리에게 Controller는 트랜잭션 관리, 예기치 않은 오류 처리, 실제 작업 수행을 위해 XxxHandler 호출 등 "캡슐화 된"항목의 진입 점과 같은 것입니다. XxxManager는 컨트롤러와 동의어라고 말할 수 있습니다. 한 경우에는 Manager를 사용하고 다른 경우에는 Controller를 사용하지 않는 것이 중요하다고 생각합니다. 팀에서 일할 때는 일관성을 유지하는 것이 매우 중요합니다.

이와 같은 것들에 대한 더 나은 이름을 찾는 것은 실제로 어렵거나 어쩌면 불가능할 수도 있습니다. 상황을보다 명확하게하려면 Xxx를 잘 선택해야합니다.

내가 개인적으로 싫어하는 것은 get ... 또는 set ...이라는 메소드가 단순한 접근 자 이상일 때입니다. 나는 결정하기를 좋아한다.

밥 삼촌에 따르면 또 다른 것은 내 마음 속에 나온 것입니다. 메소드 이름의 "And"는 많은 일을한다는 표시입니다. 그러나 인생은 항상 흑백이 아닙니다. 예를 들어, 괜찮다고 생각되는 상황이 있습니다. 성능 문제로 인해 (처리하지 않은 이유를 확인하기 위해 이미 데이터가있는 경우) ...

나는 개인적으로 시스템 헝가리 표기법의 큰 팬이기도합니다. 대부분의 경우 IDE에서 소스 코드를 다루고 있습니다. 그러나 종종 편집기 만 사용하거나 브라우저에서 저장소를 찾아 보는 경우가 있습니다. 한 가지 단점은 형식 접두사로 인한 도구 지원입니다 ...

나는 가장 중요한 것은 전제 조건이 아니라고 생각합니다-나에게 적합하지 않은 협약-나는 협약이없는 것보다 낫습니다 ...


1
"Controller"는 "Manager"와 다른 의미를 갖습니다. 개인적으로, 나도 마음에 들지 않지만 "컨트롤러"는 많은 패턴, 특히 MVC의 공통 구성 요소이기 때문에 얻을 수 있습니다. XxxHandler도 마찬가지입니다. 만약 클래스가 무언가를 "만들기"만하면 클래스가 너무 크거나 "Xxx"부분이라고합니다.
Billy ONeal

3
" 잘 정의 된 종속성과 책임을 가지고 유형 계층 구조를 올바르게 설계하지 않았다면 "이런 것들에 대해 더 나은 이름을 찾는 것이 실제로 어려울 수도 있고 어쩌면 불가능할 수도 있습니다 . " 물론 일반 이벤트 / 메시지 처리기에 MVC 또는 "처리기"의 일부로 "컨트롤러"를 사용하는 경우에는 그 용어 가 다릅니다 . 정의 된 클래스는 주요 적기입니다.
Aaronaught

5

아마도 최악의 네이밍 안티 패턴은 다음과 같습니다.

create table stuff(..., foo1 string, bar1 string,
                        foo2 string, bar2 string, 
                        foo3 string, bar3 string, ...)

[foo, bar] 쌍의 3 요소 목록이 있습니다. 네 번째가 필요한 경우 테이블에 새 열을 추가해야합니다.

다음과 같은 코드로 이어집니다.

'SELECT foo' + i + ', bar' + i + ' FROM stuff'

foo 및 bar 열을 사용하여 별도의 테이블을 작성하고 stuff 테이블에 링크해야합니다.

create table fubar(foo string, bar string, stuff_id long)

두 번째 최악은 다음과 같습니다.

class Student {
  ...
  String homeStreet;
  String homeCity;
  String homeState;
  String permStreet;
  String permCity;    
  String permState;
  ...
}

여기서는 Address 클래스의 두 인스턴스 대신 6 개의 필드가 있습니다.

이 안티 패턴은 두 세트의 모든 조합을 나열하는 일련의 두 부분으로 구성됩니다 (예 : [foo, bar] x [1,2,3] 또는 [home, perm] x [street, city, state]


-1-이것은 이름 지정을 전혀 언급하지 않습니다.
Billy ONeal

네이밍 안티 패턴은 하나 이상의 이름을 포함 할 수 없습니까?
케빈 클라인

==반 패턴을 명명하는 주장이 너무 많 습니까? 혼란 스러워요.
Billy ONeal

1
내가 그를 이해하는 한, 협약은 실제 이름을 가져야하는 숫자를 허용하는 규칙입니다. 이 숫자들은 그 항목들이 일종의 목록이나 배열이라는 잘못된 인상을
낳습니다

3
@ 빌리 오닐 : 네. 디자인 문제는 정규화가 부족하고 숫자 접미사가이를 가리키는 명명 패턴입니다.
reinierpost

3

tautology 인 클래스 또는 인터페이스 이름 지정 은 링크가 말하는 Java뿐만 아니라 모든 언어에서 나쁜 것입니다.

반복이 명확성을 제공하지 않더라도 동일한 단어를 사용하기 위해 다른 단어를 사용하는 타우 톨 로지 (동적).


2
흥미 롭군 예가 있습니까?
Mike Baranczak

2
나는 링크를 읽고, 그것은 "인체 학"이라고 말한다 ...;)
Benjol

10
Tautology Club의 첫 번째 규칙은 Tautology Club의 첫 번째 규칙입니다.
Cercerilla

나는 링크 (좋아요, 링크의 내용 )를
읽었

그 링크에 따르면 I <InterfaceName> ... 사용을 중지해야합니다.
Dal

3

나는 자주 같은 일반적인 이름을 가진 소프트웨어 라이브러리가 발생 Library하거나 Common. 최적이 아닌 설계를 나타냅니다. 개발자는 코드 복제를 피하려고 노력하지만 기능을 기반으로 분해 된 설계를 만들지 않습니다.


+1- "공통"이 항상 표시됩니다.
Morgan Herlocker

1

명명 에서 Microsoft 에서 잘못된 이름에 대해 다음 목록을 제공 할 수 있습니다.

  1. 그것들은 의미 론적이지 않습니다. 즉, 그것이하는 일을 강조하는 대신, 사용하는 기술 이나 그 기반이되는 패턴 을 강조하는 이름을 가지고 있습니다 .
  2. 그것들은 구문상의 일관성을 따르지 않습니다. 예를 들어, 이름의 일부는 낙타의 경우이며 다른 부분은 파스칼의 경우입니다.
  3. 그들은 어려운 약어, 같은 이해 있습니다 ScrollableX 대신 CanScrollHorizontally
  4. 그들은 그 환경의 키워드를 망칠 수 있도록 선택되었습니다.

2
나는 실제로 "ScrollableX"를 최소한 "CanScrollHorizontally"만큼 좋아합니다. "X"는 실제로 약어가 아닙니다.
1172763
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.