単純なオブジェクト指向設計の問題にどのようにアプローチするかについて質問したいと思います。このシナリオに取り組む最善の方法について、私自身の考えがいくつかありますが、スタック オーバーフロー コミュニティから意見を聞くことに興味があります。関連するオンライン記事へのリンクも歓迎します。私は C# を使用していますが、質問は言語固有ではありません。
、、フィールドPerson
を持つテーブルを持つデータベースのビデオ ストア アプリケーションを作成しているとします。また、 へのリンクを持つテーブルと、にもリンクするテーブルもあります。PersonId
Name
DateOfBirth
Address
Staff
PersonId
Customer
PersonId
Customer
単純なオブジェクト指向のアプローチは、a が"is a"であると言って、次のPerson
ようなクラスを作成することです。
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; }
}
これで、すべての顧客にメールを送信する関数を作成できます。
static void SendEmailToCustomers(IEnumerable<Person> everyone) {
foreach(Person p in everyone)
if(p is Customer)
SendEmail(p);
}
このシステムは、顧客とスタッフの両方である誰かがいるまでは問題なく機能します。everyone
リストに同じ人物が 2 回 (1 回は a として、1 回は a として)Customer
含まれることを本当に望んでいないと仮定すると、次Staff
のいずれかを任意に選択しますか?
class StaffCustomer : Customer { ...
と
class StaffCustomer : Staff { ...
明らかに、これら 2 つのうち最初のものだけがSendEmailToCustomers
機能を壊すことはありません。
それで、あなたは何をしますか?
- クラスにおよびクラス
Person
へのオプションの参照を持たせますか?StaffDetails
CustomerDetails
Person
に加えてオプションStaffDetails
とCustomerDetails
?を含む新しいクラスを作成します。- すべてをインターフェイス (例:
IPerson
、IStaff
、ICustomer
) にして、適切なインターフェイスを実装する 3 つのクラスを作成しますか? - 別のまったく異なるアプローチをとりますか?