단일 책임 원칙
( "모든 수업은 하나의 책임만을 가져야합니다. 즉, 모든 수업은 변경해야 할 이유가 하나뿐이어야합니다")
동의하지 않습니다. 메소드 는 변경해야 할 이유가 하나만 있어야 한다고 생각하고 클래스의 모든 메소드는 하나와 논리적 관계를 가져야 하지만 클래스 자체는 실제로 여러 가지 (관련) 작업을 수행 할 수 있습니다 .
내 경험에 따르면,이 원칙은 너무 열심 적으로 적용되기 때문에 많은 작은 1 가지 방법 클래스가 생깁니다. 내가 일한 민첩한 상점들이이 일을 해냈습니다.
.Net API의 작성자 가 List.Sort (), List.Reverse (), List.Find () 등이 아니라 이러한 사고 방식 을 가지고 있다고 가정하면 ListSorter, ListReverser 및 ListSearcher 클래스가 있습니다!
더 이상 SRP (이론 자체로는 끔찍한 것은 아님) 에 대해 논쟁하는 대신 , 나는 오래 지속 된 일화 경험을 공유 할 것입니다.
내가 일을 한 곳에서, 나는 아주 간단한 썼다 최대 흐름 해결사 노드, 그래프하는를 해결하기 위해 그래프 제작자 / 솔버를 사용하는 그래프 제작자, 그래프 해결사, 그리고 클래스 : 다섯 개 가지 클래스로 구성 실제 문제. 특별히 복잡하거나 긴 것은 없었습니다 (솔버는 ~ 150 라인에서 가장 길었습니다). 그러나 클래스에 "책임"이 너무 많은 것으로 결정되어 동료가 코드 리팩토링을 설정했습니다. 그들이 끝났을 때, 나의 5 개의 수업은 25 개의 수업으로 확장되었고, 그의 총 코드 라인은 원래의 3 배 이상이었습니다. 코드의 흐름은 더 이상 명확하지 않았으며 새로운 단위 테스트의 목적도 아니 었습니다. 나는 이제 내 코드가 무엇을하는지 알아내는 데 어려움을 겪었다.
같은 장소에서, 거의 모든 클래스는 하나의 메소드만을 가졌습니다 ( "책임 성"만). 프로그램 내에서의 흐름을 따르는 것은 거의 불가능했으며, 대부분의 단위 테스트는 이 클래스 가 다른 클래스의 코드라고 불리는 테스트로 구성되었으며 두 가지 목적 모두 나에게 미스터리였습니다. 말 그대로 수백 개의 클래스가 있었으며 (IMO) 수십 개가 있어야했습니다. 각 클래스는 하나의 "thing" 을 수행했지만 "AdminUserCreationAttemptorFactory" 와 같은 이름 지정 규칙을 사용하더라도 클래스 간의 관계를 파악하기가 어려웠습니다.
다른 곳 ( 클래스- 만해야하는 방법론-일정한 사고 방식을 가짐 )에서 특정 작업 중에 95 %의 시간이 걸리는 방법을 최적화하려고했습니다. (어리석게) 조금 최적화 한 후, 왜 그것이 bajillion 시대라고 불리는 지에 관심을 돌 렸습니다 . 클래스의 루프에서 호출되었습니다 ... 다른 클래스의 루프에서 메소드가 호출되었습니다. 또한 루프에서 호출되었습니다 ..
모두 13 단계에 걸쳐 5 단계의 루프가 존재한다고한다. 어떤 클래스가 실제로하고 있는지는 그것을보고 판단하기가 불가능했습니다. 어떤 메소드를 호출했는지, 어떤 메소드를 호출했는지 등의 정신 그래프를 스케치해야했습니다. 그것이 하나의 방법으로 묶여 있다면, 우리의 문제 방법이 즉시 명백한 5 개의 루프 레벨 안에 중첩되어 약 70 줄에 불과했을 것입니다.
13 개의 클래스를 하나의 클래스로 리팩토링하라는 요청이 거부되었습니다.