간단한 오브젝트 지향 설계 문제점에 어떻게 접근 할 것인가에 대해 질문하고 싶습니다. 이 시나리오를 다루는 가장 좋은 방법에 대해 필자는 몇 가지 아이디어를 가지고 있지만 Stack Overflow 커뮤니티의 의견을 듣고 싶습니다. 관련 온라인 기사에 대한 링크도 환영합니다. 나는 C#을 사용하고 있지만 질문은 특정 언어가 아닙니다.오브젝트 지향 우수 사례 - 상속 v 합성 v 인터페이스
내가 PersonId
, Name
, DateOfBirth
및 Address
필드와 그 데이터베이스 Person
테이블이있는 비디오 가게 응용 프로그램을 쓰고 있어요 가정하자. 테이블 과 테이블 PersonId
에 연결되는 Customer
테이블도 있습니다. 모든 고객에게 이메일을 보낼 수
class Person {
public int PersonId { get; set; }
public string Name { get; set; }
public DateTime DateOfBirth { get; set; }
public string Address { get; set; }
}
class Customer : Person {
public int CustomerId { get; set; }
public DateTime JoinedDate { get; set; }
}
class Staff : Person {
public int StaffId { get; set; }
public string JobTitle { get; set; }
}
이제 우리는 함수를 쓸 수있는 말 :
간단한 객체 지향 접근 방식은 Customer
가 Person
"는 것입니다"라고 때문에이 같은 비트가 클래스를 생성하는 것입니다 :
static void SendEmailToCustomers(IEnumerable<Person> everyone) {
foreach(Person p in everyone)
if(p is Customer)
SendEmail(p);
}
이 시스템은 고객과 직원의 한 사람이 될 때까지 정상적으로 작동합니다.
class StaffCustomer : Customer { ...
및
class StaffCustomer : Staff { ...
: 우리가 정말 우리 사이의 임의의 선택을 할, 한 번
Customer
로하고 한 번
Staff
으로 두 번에 같은 사람이 우리의
everyone
목록을 원하지 않는다고 가정하면
분명히이 두 가지 중 첫 번째 만 SendEmailToCustomers
기능을 손상시키지 않습니다.
그럼 어떻게 하시겠습니까?
Person
클래스를 만들기는StaffDetails
및CustomerDetails
클래스에 대한 선택적 참조가?- 및 선택 사항 인
StaffDetails
및CustomerDetails
을 포함하는 새 클래스를 만드시겠습니까? - 모든 것을 인터페이스로 설정하고 (예 :
IPerson
,IStaff
,ICustomer
) 적절한 인터페이스를 구현 한 세 가지 클래스를 만드시겠습니까? - 완전히 다른 접근 방식을 선택하십시오.
예, 이제 한 가지 구현을 선택하고 나중에 다른 코드를 위반하지 않고 마음을 바꿀 수 있습니다. –