단일 책임은 단일 기능이 수행 할 수있는 것이 아닐 수도 있습니다.
class Location {
public int getX() {
return x;
}
public int getY() {
return y;
}
}
이 수업은 단일 책임 원칙을 위반할 수 있습니다. 이 두 가지 기능을 가지고 있지만, 코드 경우에 때문이 아니라 getX()
및 getY()
변경을 요구할 수있다 다른 이해 관계자를 만족해야한다. X 부통령이 모든 숫자를 부동 소수점 숫자로 표현해야한다는 메모를 보내면 회계 부사장 Y는 Mr. X의 생각에 관계없이 부서 검토가 모든 숫자를 정수로 유지해야한다고 주장합니다. 일이 혼란스러워지기 때문에 누가 책임이 있는지에 대한 단일 아이디어.
SRP를 준수했다면 Location 클래스가 X와 그의 그룹이 노출되는 것에 기여하는지가 분명합니다. 클래스가 무엇을 담당하는지 명확하게하고 어떤 클래스가이 클래스에 영향을 미치는지 알고 있습니다. 둘 다이 클래스에 영향을주는 경우 변경의 영향을 최소화하도록 제대로 설계되지 않았습니다. "수업을 변경할 이유가 하나만 있어야한다"고해서 학급 전체가 단 한 가지만 할 수있는 것은 아닙니다. 그것은 수업을 보지 못하고 X와 Y 부인이이 수업에 관심이 있다고 말해서는 안된다는 것을 의미합니다.
그런 것 말고 아니요, 여러 방법이 좋습니다. 클래스에 속하는 메소드와 그렇지 않은 메소드를 명확히하는 이름을 지정하십시오.
Bob 아저씨의 SRP는 Curly의 법칙 보다 Conway의 법칙 에 관한 것 입니다. Bob 아저씨는 Curly 's Law (한 가지만)를 클래스가 아닌 함수에 적용하는 것을 옹호합니다. SRP는 혼합 이유를 함께 변경하지 않도록주의합니다. Conway 's Law에 따르면 시스템은 조직의 정보 흐름 방식을 따릅니다. 당신이 듣지 못하는 것에 신경 쓰지 않기 때문에 SRP를 따르게됩니다.
"모듈은 오직 한 명의 행위자 만 담당해야합니다"
Robert C Martin-클린 아키텍처
사람들은 SRP가 범위를 제한하는 모든 이유에 대해 계속 원합니다. SRP보다 범위를 제한해야하는 이유가 더 있습니다. 나는 내부를 들여다 보는 것이 당신을 놀라게하지 않을 것임을 보장하는 이름을 취할 수있는 추상화라고 클래스를 주장함으로써 범위를 제한 합니다 .
Curly 's Law를 수업에 적용 할 수 있습니다. 당신은 밥 아저씨가 말한 것 밖에 있지만 당신은 할 수 있습니다. 당신이 잘못하는 것은 그것이 하나의 기능을 의미한다고 생각하기 시작할 때입니다. 그것은 한 가정에 아이가 하나만 있어야한다고 생각하는 것과 같습니다. 자녀가 두 명 이상 있어도 가족이되는 것을 막을 수는 없습니다.
Curly의 법칙을 수업에 적용하면 수업의 모든 내용이 단일 통일 아이디어에 관한 것이어야합니다. 그 아이디어는 광범위 할 수 있습니다. 아이디어는 지속성 일 수 있습니다. 일부 로깅 유틸리티 기능이 있으면 명확하지 않습니다. X가이 코드에 관심이있는 유일한 사람인지는 중요하지 않습니다.
여기에 적용되는 고전적인 원칙을 우려 분리 라고 합니다. 모든 우려 사항을 분리하면 한 곳에 남아있는 것이 한 가지 우려 사항이라고 주장 할 수 있습니다. 1991 년 영화 City Slickers가 Curly라는 캐릭터를 소개하기 전에 우리가이 아이디어를 불렀습니다.
이건 괜찮아. 밥 아저씨가 책임을지는 것은 문제가되지 않습니다. 그에 대한 책임은 당신이 집중하는 것이 아닙니다. 그것은 당신이 변화하도록 강요 할 수있는 것입니다. 하나의 관심사에 초점을 맞추고 여전히 다른 의제를 가진 다른 그룹의 사람들을 담당하는 코드를 작성할 수 있습니다.
아마 당신은 그것에 대해 신경 쓰지 않을 것입니다. 좋아. "한 가지 일을하는 것"을 유지하면 모든 디자인 문제를 해결할 수 있다고 생각하면 "한 가지"가 무엇인지에 대한 상상력이 부족해집니다. 범위를 제한하는 또 다른 이유는 조직입니다. 모든 "쓰레기통"이 생길 때까지 다른 "한 가지"안에 많은 "한 가지"를 넣을 수 있습니다. 나는 전에 그것에 대해 이야기했습니다
물론 범위를 제한하는 고전적인 OOP 이유는 클래스에 개인 필드가 있고 getter를 사용하여 해당 데이터를 공유하기 때문입니다. 우리는 데이터를 필요로하는 모든 메소드를 클래스에서 데이터를 비공개로 사용할 수 있도록합니다. 많은 사람들이이 방법이 범위 제한 자로 사용하기에는 너무 제한적이라는 것을 알고 있습니다. 데이터를 모은 아이디어가 메소드를 모은 아이디어와 동일하다는 것을 확신합니다.
이 보는 기능성 방법은 인 a.f(x)
및 a.g(x)
f를 단순히 g (x)와 (X). 두 기능이 아니라 서로 다른 기능 쌍의 연속체입니다. 는 심지어 데이터를 가지고 있지 않습니다. 사용하려는 구현 과 구현 방법을 간단히 알 수 있습니다. 함께 바뀌는 기능은 서로 속해 있습니다. 그것은 좋은 오래된 다형성입니다.a
f
g
SRP는 범위를 제한하는 많은 이유 중 하나 일뿐입니다. 좋은 것입니다. 그러나 유일한 것은 아닙니다.