구현 클래스에서 디자인 패턴 이름을 사용하는 것이 좋은 생각입니까? [닫은]


28

최근에 나는 많은 적당히 큰 파이썬 코드베이스를 가로 질러왔다 MyClassAbstractFactory, MyClassManager, MyClassProxy, MyClassAdapter등의 클래스.

한편으로 그 이름을 연구하고 대응하는 패턴을 배우고 나를 지적하는 동안, 그들은 클래스가 무엇 매우 설명하지 않았다 않습니다 .

또한, 그들은 단어의 금지 목록에 속하는 것 같다 프로그래밍 : variable, process_available_information, data, amount, compute: 지나치게 광범위한 이름은 우리에게 기능에 대해 아무것도 말하지 않는 그 자체로 사용할 때 .

그렇다면 CommunicationManager또는 오히려 있어야 PortListener합니까? 아니면 문제를 전혀 이해하지 못할 수도 있습니다 ...?


패턴이하는 일에 익숙하다면 패턴 이름은 괜찮은 설명이지만 패턴 이름 나쁜 생각이라면 MyClassFactory, FooAdapter 등을 사용하는 것이 좋습니다.
ratchet freak

클래스가 "AbstractFactory"로 불리지 않았 음을 나타내는 질문을 편집했지만 일부 설명적인 단어도있었습니다.
Vorac

1
... 그 Fctory대신 그것을 진지하게 부른 것 Factory입니까, 아니면 오타입니까?
이즈 카타

@ 이즈 카타, 롤, 내 나쁜. 그러나 어댑터와 어댑터가있었습니다!
Vorac

답변:


47
  • AbstractFactory실제로 이름을 잘못 선택했습니다. 이 팩토리가 무엇 을 생성 하는지 알 수 있는 방법이 없으며 , Animals 를 생성하는 엔티티를 찾을 때 해당 팩토리를 이름으로 찾을 수 없습니다.

  • AnimalAbstractFactory대부분의 언어 에서 서명 의 키워드 와 중복 되기 때문에 현명한 선택이 아닙니다 abstract.

    이 말에는 실제로 Abstract이름에 포함시켜야 할 몇 가지 이유가 있습니다 (주석으로 강조 표시됨) . 전체 서명이없고 이름 만 AnimalFactory있는 인터페이스가있을 뿐만 아니라 인터페이스를 유지하는 몇 가지 컨텍스트가 있습니다. 현명한 선택이 될 수 있습니다 (불행히도 언어 / 프레임 워크의 규칙이 인터페이스 앞에 접두사를 붙이지 않는 한 I).

  • AnimalCreationUtility또한 나쁜 선택이 될 것입니다 : 이 공장의 경우 , 코드를 읽을 사람들을 위해 쉽게 일을하고, 공장을 호출합니다 .

  • abstract AnimalFactory괜찮습니다. 그것은 중복을 가지고, 그것은 분명하지 않습니다 이다 추상적 하는 대표단의 아이들에게 동물의 생성을 공장.

예, 디자인 패턴의 이름을 포함시키는 것은 좋은 생각이지만, 이름의 일부일 뿐이며 서명의 다른 부분과 중복되지 않아야합니다.


2
"이 모듈에서는 MVC를 구현합니다. 이유 : ... 모델 : ... 뷰 : ... 컨트롤러 : ... 구조 맵 : ... API :. .. ".
Vorac

37
@Vorac : 명확한 이름을 갖는 것이 의견에 의존하는 것보다 항상 좋습니다.
Arseni Mourzenko

2
@Vorac은 조만간 그 유명한 의견을 업데이트하지 않고 새로운 클래스를 추가하거나 그 존재에 대해 알지 못합니다. 전체 앱에서 일관되게 사용되는 명명 규칙을 간과하기는 훨씬 어렵습니다.
Konrad Morawski

2
프로젝트 솔루션을 탐색하는 동안 각 클래스 파일을 열어서 무엇을 수행합니까? 아니요. 따라서 설명적인 이름 클래스 / 파일을 갖는 것이 항상 더 좋은 아이디어입니다.
matrix

2
나는 두 번째 요점에 친절하게 동의하고 싶습니다 : AnimalAbstractFactory는 클래스 선언에 중복되어 있지만 자식 클래스 선언에 매우 도움이 될 것이기 때문에 좋은 선택이라고 생각합니다. LionFactory는 AnimalAbstractFactory를 확장합니다. 좋은 정보입니다.
Igor

11

구체적인 예에 ​​따라 다릅니다. 빌더 패턴은 거의 항상 클래스 * Builder의 이름을 지정하면 가장 잘 제공되며 싱글 톤은 일반적으로 이름을 지정할 필요가 없습니다.

클래스 이름에 패턴 이름을 넣지 않으면 클래스 이름에 특정 패턴을 구현한다고 설명하는 주석을 넣어야합니다.


3
일관성을 유지하는 것이 중요합니다. 일단 일부 팩토리 만 호출 ...Factory하면 클래스 이름이 해당 규칙을 위반하는 경우 클래스가 팩토리라는 사실을 깨닫는 것이 상당히 정신적 충격이됩니다.
Konrad Morawski

10

클래스에서 패턴 이름을 사용하는 요점은 클래스의 기능을 쉽게 이해할 수 있도록하는 것입니다. AnimalFactory 클래스의 이름을 지정하면 클래스가 Animal 인스턴스를 작성하는 것이 분명합니다. 클래스 이름에 패턴 이름이 포함되어 있고 패턴 이름이 포함되어 있지 않은 경우 잘못된 패턴을 선택했거나 잘못 구현 한 것입니다.


1

나는 그것이 잘 작동 할 수 있다고 생각합니다. 예를 들면 다음과 같습니다.

// Command for retrying card entry with CVN.
public class RetryCardEntryWithCVNCommand { ... }

// Query for getting expired accounts
public class GetExpiredAccountsQuery { ... }

// Decorator for logging exception. Implies that it's an additional 
//mechanism for logging exceptions.
public class LogExceptionToDbDecorator { ... }

// Factory for creating account filters
public class AccountFilterFactory { ... }

1
이것은 질문에 어떻게 대답합니까? 내 독서에 따르면, 당신의 "예"는 쓸모없는 클래스 이름과 코드 주석의 복제 만 보여줍니다
gnat

의견은 클래스 이름이 일부에게 명백하지 않은 경우 각 클래스의 목적을 정당화하는 것입니다. 이것들을 살펴보면 즉시 무언가를 수행하는 명령, 데이터를 반환하는 쿼리, 기존 예외 로깅 메커니즘에 추가 동작을 추가하는 데코레이터 및 계정 필터를 만드는 팩토리가 있음을 즉시 알 수 있습니다. 제 생각에는 클래스 이름을 더 잘 설명할수록 다른 사람들이 코드를 쉽게 읽을 수 있습니다. 디자인 패턴을 사용하는 경우 하루가 끝날 때 디자인 패턴을 사용하는 목적은 다른 사람들이 코드를 쉽게 읽을 수 있도록하는 것입니다.
CodeART
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.