7

人事システム用に開発中のシステムがあります。Accountant の従業員と Programmer の従業員がいます。入社して最初の 1 か月間は、従業員は何の役割も与えられません。1 人の従業員が同時に会計士とプログラマーになることができます。次のコードで示されるデザインがあります。

ここで、新しい機能を実装してシステムを強化する必要があります。

すべての会計士を終了します。(終了とは、従業員のステータスを IsActive = false として設定することを意味します)。問題は、確認せずにすべての会計士を非アクティブとして直接設定できないことです。彼が他の役割を持っているかどうかを確認する必要があります。

終了機能をより自然な OO にするために、これらのクラスを改造する方法は?

アップデート

@AlexDev回答のEF Database Firstソリューションモデルとデータベーススキーマを持つ回答を探しています。

C# コード

List<Accountant> allAccountants =  Get All accountants from database

public class Employee
{
    public int EmpID { get; set; }
    public DateTime JoinedDate { get; set; }
    public int Salary { get; set; }
    public bool IsActive { get; set; }
}


public class Accountant : Employee
{
    public Employee EmployeeData { get; set; }
}

public class Programmer : Employee
{
    public Employee EmployeeData { get; set; }
}

ここに画像の説明を入力

@AlexDev回答

public class Employee
{
...
IList<Role> Roles;
bool isActive;

public void TerminateRole(Role role)
{
    Roles.Remove(role);
    if(Roles.Count == 0)
    {
        isActive = false;
    }
}
}

public class Role
{
 abstract string Name { get;}
}

public class ProgrammerRole : Role
{
 override string Name { get { return "Programmer"; } }
}

参照

  1. 外部情報にアクセスするための DDD アプローチ
  2. 継承よりも構成を優先しますか?
  3. ドメイン モデルの継承と列挙型プロパティ
  4. Entity Framework: リポジトリでサブクラス オブジェクトを取得する
4

4 に答える 4

6

使用している構造を使用するには、会計士でありプログラマーである人が複数の継承を必要とするだけでなく、システムに新しいロールが追加される可能性がありますが、それは C# には存在しません。別のデザインを検討する必要があります。1 つの可能性:

public class Employee
{
    ...
    IList<Role> Roles;
    bool isActive;

    public void TerminateRole(Role role)
    {
        Roles.Remove(role);
        if(Roles.Count == 0)
        {
            isActive = false;
        }
    }
}

public class Role
{
    abstract string Name { get;}
}

public class ProgrammerRole : Role
{
    override string Name { get { return "Programmer"; } }
}

次に、各タイプの Role をサブクラス化し、1 つのロールだけを終了するか、すべてのロールを終了するかを決定できます。

于 2012-08-01T12:31:32.440 に答える
0
public abstract class AbstractEmployee
{
    ...
    public abstract bool IsActiveAccountant { get; set; }
    public abstract bool IsActiveProgrammer { get; set; }
    public bool IsActive() { get { return bitwise or of all roles; } }
}

public class NewEmployee : AbstractEmployee
{
    ...
    public override bool IsActiveAccountant { get; set; }
    public override bool IsActiveProgrammer { get; set; }
}

public class Programmer : AbstractEmployee
{
    ...
    public override bool IsActiveAccountant { get; set; }
    public override bool IsActiveProgrammer { get; set; }
}

短所:

  • システム全体の新しい役割が追加されるたびに、クラスを変更する必要があります

長所:

  • 会計士を探す必要はありません
  • とにかくこの役割は非アクティブであるため、プログラマーはIsActiveAccountantの空の実装を持つことができます
  • NewEmployeeは同時に多くの役割を持つことができます

新しい役割を導入することによるオーバーヘッドが大きい場合、私は検索に固執します

于 2012-08-01T12:51:35.437 に答える
0

継承よりも構成を優先するでの私の答えから?

まず、「is-a」関係が存在するかどうかのチェックから始めます。存在する場合は、通常、次のことを確認します。

基本クラスをインスタンス化できるかどうか。つまり、基本クラスを非抽象化できるかどうかです。抽象的でないことができる場合、私は通常、構成を好みます

例 1. 会計士は従業員です。ただし、Employee オブジェクトはインスタンス化できるため、継承は使用しません。

例 2. Book は SellingItem です。SellingItem はインスタンス化できません。これは抽象的な概念です。したがって、継承を使用します。SellingItem は抽象基本クラス (または C# のインターフェース) です。

于 2013-06-19T06:58:13.983 に答える