2013-03-05 3 views
3

나는 최근에 an article that describes을 읽음으로써 그들이 SRP을 어떻게 깰 수 있는지 잘 알고 있습니다. 그리고 저는 오랫동안 세터와 getter로 하나의 수업을 썼기 때문에 저는 완전히 혼란스러워합니다.세터와 게터가 실제로 SRP를 손상합니까?

또한, 나는 found this을했습니다,하지만 SRP와 아무 상관이있다

그들은 논리를 가지고 있기 때문에

음, 첫눈에, getter 및 setter 모두는 단일 책임 원칙을 아프게하지 않는 현재 클래스에만 속합니다. 그들은 한 가지 목적을 "섬기는"반원들을 억세스/쓰기 할 수있다. 벌금. 같은 CRUD, 검증 등

등의 작업,

데이터 액세스 = 모두 세터와 게터

데이터 처리 = 데이터 처리 :

그러나의 첫 번째 기본 용어 정의 할 수 기다립니다 그렇다면 우리는 단일 클래스 내에서 두 가지 다른 책임을 가지므로 SRP을 위반합니다.


SRP를 중단하지 않기 위해 다른 클래스에서 데이터 액세스 및 데이터 조작을 정의한다고 가정 해 봅시다.

class DA { // <- Data Access 
    public string getName() { 
     return this.name; 
    } 

    public string setName(name) { 
    this.name = name; 
    } 
} 

class DataHandler { 
    public DataHandler(da) { // <- Inject an instance of DA 
     this.da = da; 
    } 

    public bool validate() { 
      // validation stuff 
    } 
} 

SRP를 위반하지 않았으므로 괜찮습니다. 하지만 여기에서는 DA 클래스에 단 하나의 setter와 getter 만 있습니다. 이제


질문 :

1) 나는 그것이 SRP를 중단하지 않습니다 만, 그래서 하나 개의 세터와 게터있는 경우에도 항상 다른 DA 클래스를 작성해야 하는가?

2) 세터와 게터는 실제로 SRP을 깨 트니까 어떤 클래스에서도 사용하면 안됩니까?

3) 그렇다면, 의존성 주입 항상 대답!?

+0

:/편집 했어야합니다. SRP를 위반하는 경우 DI를 사용해야합니다. 확장자 이상의 조합. – Will

+0

내 이전 - 이전 주석 (및 내 붙여 넣기 답변)을 확인하면 내가 어디에서 왔는지 생각할 수 있습니다. – Will

+0

SRP를 깨지 않아도 여전히 IMHO가 아닙니다. 이름이 "name"이라는 getter setter가 있으면 더 이상 함수 이름에 동사가 없습니다. "getSetName"을 사용할 수 있지만 두 개의 동사가 있고 "두 가지 이상을 수행합니다"라는 비명이 있습니다. 또한 나는 이상한 명명법 때문에 Least Astonishment의 원리를 깨뜨릴 것이라고 생각한다. –

답변

2

세터와 게터가 SRP를 손상합니까?

세터와 게터는 중요하지 않습니다. SRP의 요점은 한 반에는 오직 하나의 책임 만 있어야한다는 것입니다.

도메인 개체를 나타내는 것은 큰 책임이 있습니다. 이를 수행하는 객체를 종종 "데이터 객체"라고합니다. 데이터 객체는 언어 디자인이나 규칙 때문에 세터와 게터를 갖는 것이 일반적이지만 별도의 책임은 아닙니다. 그들은 단지 배관입니다.

데이터 저장소를 영구 저장소 안팎으로 가져 오는 것은 또 다른 큰 책임입니다. 이 작업을 수행하는 개체는 종종 "데이터 액세스 개체"(DAO)라고합니다.심지어 데이터 객체가 아닌 DAO 은 관리해야 할 데이터 객체 유형의 속성에 setter 및 getter가 필요하지 않을 수도 있습니다.하지만 실제로 필요한 끔찍한 프레임 워크를 상상할 수는 있습니다. DAO와 마찬가지로 데이터 객체가있는 다른 종류의 객체 (표시, 직렬화 및 비 직렬화, 계산 수행 등)는 데이터 객체 자체가 아니므로 데이터 객체를 미러링하는 setter 및 getter가 필요하지 않습니다.

따라서 setter 및 getters를 사용하면 개체가 데이터 개체라는 신호가됩니다. 데이터 객체이고 DAO이거나 다른 큰 책임이 있다면 아마도 SRP를 위반하는 것입니다.

사이드 노트 : 유효성을 언급합니다. 일반적인 응용 프로그램 검증에서는 개별 데이터 객체 중 적어도 하나가 데이터 객체 자체에 속합니다. 왜냐하면 도메인 객체를 나타내고 도메인 객체의 속성 간의 개별 정확성과 관계를 적용하는 것이 거의 동일한 책임이기 때문입니다.

setter와 getter가 하나만 있어도 항상 다른 DA 클래스를 만들어야합니까?

일반적으로 그렇습니다. 요점은 속성의 수가 아닙니다. 요점은 표현과 접근이 서로 다른 두 가지 책임이고 서로 다른 클래스에 속한다는 점입니다.

일반 응용 프로그램은 많은 도메인 개체를 가지고 있으므로 도메인 개체를 액세스에서 분리하는 것이 합리적이라면 모든 도메인 개체, 심지어 단일 특성 개체에서도 일관되게 사용하는 것이 좋습니다.

의존성 주입은 항상 대답입니까?

아키텍처 및 프레임 워크에 따라 다릅니다. 불변의 데이터 객체와 DAO의 메소드가 매개 변수로 가져 오는 DAO가있을 수 있습니다. 거기에는 DI가 없습니다 (DAO를 사용하는 상위 수준의 구성 요소에 DAO를 삽입 할 수도 있지만). DAO에 대한 참조가있는 데이터 객체 또는 데이터 객체로 인스턴스화 된 DAO를 가질 수 있습니다 (두 패턴 모두 보았지만 싫어했습니다). DI가 필요할 수도 있습니다. 어느 쪽이든, 그것은 토론의 나머지 부분과 관련이 없습니다.

관련 문제