言語構文は無視してください。ここでは OOPS についてのみ説明します。
ここに 2 つのコード スニペットを示します。それぞれがコンポジションのサンプルです (私が間違っていなければ)。
問題文: システム内のエンティティの統計を保持するオブジェクトがあります。それらの統計を次のようにします。
- 名前
- 苗字
- 給料
*これらのフィールドは何でもかまいません。私はこれらを例に取りました。どの分野が必要かどうかという観点から考えないでください。3 つすべてが必要であると仮定します。
これらのフィールドに対応するクラスを作成しました:
public class Stats{
field Name;
field LatsName;
field Salary;
}
今、私はある人についての情報を時系列で知りたいという状況に遭遇しました。ワークフロー システムのある時点で、3 つのステージすべてについて個人に関する情報を提示する必要があることを見てみましょう。
- 彼が子供だったとき。
- 彼が若かったとき。
- 彼が退職したとき。
ここで注意すべき点は、nameとlastNameは変わらず、給与のみが変わる可能性があるということです。このため、既存のオブジェクト「stats」を使用できるクラスを作成できるのではないかと考えました。
2 つの解決策を紹介します。どちらが優れているか、またその理由を教えてください。
コード例 1
public class CompositeStats{
//Adding three more properties and hinding the one already existing.
private objStats= new Stats();
public field FirstName{
get{return objStats.Name;}
set{objStats.Name=value;}
}
public field LastName{
get{return objStats.LastName;}
set{objStats.LastName=value;}
}
public field SalaryChild{get;set;}
public field SalaryYoung{get;set;}
public field SalaryRetired{get;set;}
}
上記のサンプル コードでは、給与の元のフィールドを公開しませんでしたが、期間ごとに 3 つの新しいフィールドを作成しました。
コード例 2
public class CompositeStats{
private objStatsChild= new Stats();
private objStatsYoung= new Stats();
private objStatsRetired= new Stats();
public field FirstName{
get{return objStatsChild.Name;}
set{objStatsChild.Name=value;}
}
public field LastName{
get{return objStatsChild.LastName;}
set{objStatsChild.LastName=value;}
}
public field SalaryChild{
get{return objStatsChild.Salary;}
set{objStatsChild.Salary=value;}
}
public field SalaryYoung{
get{return objStatsYoung.LastName;}
set{objStatsYoung.LastName=value;}
}
public field SalaryRetired{
get{return objStatsRetired.LastName;}
set{objStatsRetired.LastName=value;}
}
}