2017-03-22 12 views
0

타사 유형 Person이 있습니다. 그것은 단순히 사람이에 가입 메일 링리스트의 목록입니다 Subscriptions 수집을 노출 :비즈니스 로직을 확장 메소드로 변환

public class Person 
{ 
    public Person(int id) 
    public IList<int> Subscriptions {get;set;} 
} 

(그것은 mutable이다, 거기에는 어떤 검증, 모든 사람이 그것을 청소 할 수 없지만, 그 제 3 자 API입니다) .

구독 비즈니스 로직을 넣고 적절한 장소를 찾고 싶습니다 (구독에는 유효성 검사 규칙이있을 수 있습니다. 일부 조건에 따라 자동으로 추가되거나 제거 될 수 있습니다). 여기 두 가지 옵션을 볼 수 있습니다

옵션 1 :
SubscribeUnsubscribe 방법에 캡슐화 모든 비즈니스 로직과 내 솔루션의 새로운 Recipient 유형이 될 수 있습니다 :

public class Recipient 
{ 
    public Recipient(Person person) { ... } 
    public void SubscribeTo(int mailingListId) { ... } 
    public void UnsubscribeFrom(int mailingListId) { ... } 
} 

옵션 2 :
동일한 것이지만 PersonExtensions 클래스로 변환됩니다.

public static class PersonExtensions 
{ 
    public static void SubscribeTo(this Person person, int mailingListId) { ... } 
    public static void UnsubscribeFrom(this Person person, int mailingListId) { ... } 
} 

정적 확장 방법을 사용하면 수많은 Recepient 인스턴스가 생성되지 않을 수 있지만 BL을 배치하기에 적합한 장소처럼 보이지는 않습니다. 그 일에 어떤 단점이 있습니까?

답변

1

제 생각에는 옵션 1을 선호합니다. 확장 메소드는 비즈니스 로직을 다루기위한 것이 아닙니다. 그것은 항상 수업에서 발생해야합니다. 나는 당신이 Recipient 인 사람의 관심사로 Person 클래스의 관심사를 분리하여 올바르게 생각한다고 생각합니다. SOLID design principles을 고려하고 있다면 1 번 옵션을 사용하는 것이 옳습니다.

ingle responsibility, IE 클래스는 하나의 책임 (하나의 "변경 이유") 만 가져야합니다. 수업 대신 확장 방법을 사용하는 것에 대한 질문에 밀접한 관련이 없지만 그 사람을받는 사람과 분리하여 올바른 길을 가고 있음을 입증하는 역할을합니다. 받는 사람 논리가 변경되면 사람을 사용하지만받는 사람 논리를 신경 쓰지 않는 모든 코드를 수정할 필요가 없습니다.

펜/폐쇄 - 연장 용, 수정 불가. ("확장"이라는 단어를 사용하면 확장 방법을 생각하게하지 마십시오.) 항상 (선호가 추상적 인) 상위 클래스의 확장 (하위 클래스)을 추가 할 수 있어야합니다. 다형성과 같은 객체 지향 프로그래밍의 기본 원칙은 여기에서 활동하기 시작하고, 당신이 클래스를 대체 할 수 있기 때문에이 경우 아무도 개방/폐쇄 원칙 2.

L iskov 대체 비둘기 꼬리 좋게 옵션으로 가능하지 않다 새로운 "확장 된"하위 클래스의 인스턴스와 함께 부모 클래스의 인스턴스를 필요로하는 코드에서.

모든 논리를 확장 메소드가있는 하나의 정적 클래스에 넣으면이 작업이 불가능합니다.

+0

그것은 나의 인식이기도하다. 나는 그것을 설명하는 좋은 원천을 찾지 못했다. SOLID가 이걸 어떻게 준수하는지 조금 설명해 주시겠습니까? –

+0

@SergeyShushlyapin - 내 수정 사항을 확인하십시오. –

+0

테스트 가능성 추가 –

관련 문제