클래스 메소드의 수에는 제한이 있습니까?


22

내가 읽은 다른 디자인 책에서 때로는 클래스가 가지고 있어야하는 메소드의 수 (예 : Java 또는 C #과 같은 OO 언어를 고려)에 중점을 둡니다. 종종 그 책에 기록 된 예는 매우 깔끔하고 단순하지만 "심각한"복잡한 사례를 다루는 경우는 거의 없습니다.
그러나 범위는 5와 8 사이 인 것 같습니다.

프로젝트에서 속성, 속성, 속성, 설명, CreateDate 등의 속성으로 "Note"클래스를 개발했습니다.
그런 다음 getRelations (메모가 다른 문서에 할당 된 경우), getExpiryDate, ect와 같은 몇 가지 기본 방법입니다.

그러나 응용 프로그램 개발을 진행할 때는 더 많은 기능이 필요하므로 더 많은 방법이 필요했습니다.

클래스가 적은 메소드가 많을수록 더 느슨하게 결합된다는 것을 알고 있습니다. 이는 모듈 성과 재사용 성, 편집하기 쉬운면에서 좋은 이점입니다.
그런데 우리의 맥락에서 하위 클래스를 만들 필요가 없으며 심지어 필요한 모든 기능이 해당 클래스와 관련이 있다면 더 많은 메서드를 추가 할 수 있습니까?

15 가지 이상의 방법을 사용하는 경우 약간의 재 설계가 필요할 수 있음에 동의합니다.
그러나이 경우에도 일부 메소드 또는 상속을 삭제하는 것이 옵션이 아닌 경우 올바른 방법은 무엇입니까?


3
인간에게는 잊혀진 범위가 내장되어있는 것 같습니다. 7 개의 옵션을 지나면 처음 몇 개를 잊어 버리기 시작합니다. 따라서 사람들에게 인터페이스 당 7 개 이상의 옵션을 제공하지 마십시오.
— Martin York

+ 1 @ Martin- 7 + 또는-2
— Morgan Herlocker

이 제한은 단기 메모리에만 적용됩니다. 그렇지 않으면 어떻게 다른 글자와 단어를 모두 기억할 수 있을까요? 진지하게, 수업이 많이 사용될 예정이라면, 수업을 미니 언어로 생각할 수 있고, 수업과 관련된 모든 것을 표현하는 데 필요한 방법을 많이 가질 수 있습니다.
— artem


답변:


30

필요한만큼 많은 방법을 사용하십시오. 가능한 경우 공개 방법 수를 5-8 규칙으로 유지하려고합니다. 솔직히, 대부분의 사람들은 더 큰 문제를 해결해야하는 열렬한 슈퍼 메쏘드를 가지고있는 반대의 문제가 있습니다. 얼마나 많은 개인 도우미 메서드가 있는지는 중요하지 않습니다. 실제로 Java에서 8 개의 메소드 아래에 머물렀다면 생성자, toString 및 3 개의 속성에 대한 getter / setter 만있는 클래스로 한계에 도달 할 수 있습니다. 정확한 클래스는 아닙니다. 결론은 클래스가 얼마나 많은 메소드인지 걱정하지 마십시오. 수업이 관련없는 관심사를 취하지 않도록하고, 이해하기 쉬운 합리적인 공용 인터페이스가 있는지 걱정하십시오.


정확하지만 유틸리티 클래스 인 경우 최대 10-15 개가 좋습니다.
— Sid

1
@SidCool-나는 그것들을 사용하지 않는다고 말하지는 않지만 유틸리티 클래스는 실제로 가장 좋은 방법은 아닙니다. 그들은 일반적으로 관련이없는 많은 문제를 함께 모으는 미니 신 클래스입니다. 그것을 염두에두고, 유틸리티 클래스는 실제로 존재해서는 안되며 15 개의 메소드로는 훨씬 적습니다.
— Morgan Herlocker

1
내 수업 "Note"는 유틸리티 클래스가 아닙니다. 비즈니스 오브젝트 (문서에 주석과 설명을 추가 할 수있는 노트)를 나타냅니다. 그러나 나는 "유틸리티"클래스의 위험에 대한 철언에 동의한다. 배송 마감일이 다가 오면 도움을받을 수 있지만 더 나은 솔루션 / 디자인이 있다고 생각합니다.
— 프란체스코

13

대답은 정말 간단합니다. 책임에 속하는 클래스에 모든 것을 넣지 만 책임을 지정할 때는주의하십시오.

때때로 큰 클래스는 다른 책임을 가진 작은 클래스의 복합입니다.

일반적으로 수업의 사용 또는 유지 관리가 어려워 질 때 책임을 더 작은 클래스로 나누려고합니다. 500 줄 이상의 수업은 거의 없습니다. 내 가장 큰 수업은 약 1.5k 정도입니다.

"클래스가 n과 m 사이의 메소드를 가져야합니다"와 같은 일반적인 규칙을 명시 할 수는 없습니다.


8

너무 많은 방법을 사용해야 할 이유가 없습니다 (OO 디자인). 메서드가 적은 클래스가 더 잘 분리되어있는 것도 사실이 아닙니다.

예를 들어 java.lang.String 클래스를보십시오. 문자열로 할 수있는 일이 너무 많기 때문에 많은 방법이 있습니다. 그럼에도 불구하고 강하게 결합되지 않았습니다.

왜 15와 같은 마법의 숫자가 좋은 디자인과 나쁜 디자인을 분리 할 수 ​​있는지 궁금합니다. 아니요, 쉽지 않습니다.


나는 15의 숫자가 책을 디자인 한 사람들을 읽은 것에서 나온 근사치 일 뿐이라는 것을 동의한다 (Steven McConnell의 "Code Complete"). 실제로 String 클래스에는 수많은 메소드가 있으며 모두 동일한 엔티티에 실현됩니다.
— 프란체스코

@Luca :이 책들 중 일부의 문제점은 예제가 종종 고안되어 많은 실제 예제보다 작다는 것입니다.
— FrustratedWithFormsDesigner

정확히 ... 아마도 가장 명확한 개념을 만들고 구매자의 잠재적 기반을 확대하기 위해 ...
— Francesco

15 가지 방법으로 모든 종류의 DataGrid 또는 UI 컨트롤을보고 싶습니다. 이러한 클래스를 더 작은 클래스로 분류하면 인터페이스가 악몽이됩니다.
— 팔콘

6

PMD에서 TooManyMethods 규칙 의 기본 동작은 10 개 이상의 메소드가있는 클래스를 식별하고 잠재적 오류로 플래그를 지정하는 것입니다. 그러나 이것은 임의의 숫자입니다. 구성에서 쉽게 변경됩니다. 이 숫자가 무엇이든 관계없이 개발자가 클래스를보고 문제가 있는지 확인하고 문제가 있는지 확인하는 플래그 일뿐입니다.

좀 더 구체적인 것은 7 +/- 2 규칙 일 수 있습니다 . 이것은 인간의 마음이 기억에서 5와 9 사이의 "객체"를 보유하고 이해할 수 있다는 것을 나타냅니다. 특정 클래스를 읽을 때 객체는 해당 클래스를 구성하는 메소드와 필드 일 가능성이 높습니다. 그러나 접근 자, 뮤 테이터 및 표준 작업 (예 toString(): hashCode(), 및 equals()Java)을 계산하지 않더라도 클래스에는 종종 9 개 이상의 필드와 메소드가 있습니다 .

가장 적절한 조치는 팬인 및 팬 아웃 과 커플 링 및 응집력에 대한 논의입니다 . 단일 책임 원칙 과 의 분리는 클래스가 할 또는 한 가지만으로도 한 가지를 표현한다 - 적용되어야한다. 이는 설계 또는 구현을 평가할 때 최대 / 최소 수의 메서드에 숫자를 할당하는 것보다 훨씬 낫습니다.


+1-7 + -2 규칙은 사용성에 관한 규칙입니다.
— Morgan Herlocker
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.