Skip to main content

複雑な継承階層の簡略化

Copilot Chat は、コードをリファクタリングして継承の複数のレイヤーにクラスが存在しないようにするのに役立ちます。

継承の階層が深いと、または継承が適切に使われていないと、コードの維持が困難になる可能性があり、クラス間の関係をたどったり、破損させずに拡張したりするのが難しくなります。

Copilot Chat は、継承ベースの設計を、いっそう柔軟なコンポジション ベースの設計にリファクタリングすることを提案できます (継承よりコンポジションを優先)。 また、戦略やデコレーターなどのパターンを適用して、継承構造の複雑さを増すことなく、システムの拡張性を高めることも推奨できます。

シナリオ例

次の C# コードは継承階層が深く、各クラスは前のものに基づいて構築されます。 その結果、継承のチェーンが長くなり、各クラスのプロパティを把握するのが困難です。

このような複数レベルの継承階層は、理解、変更、拡張が困難な場合があります。

public class Employee
{
    public string Name { get; set; }
    public int EmployeeID { get; set; }
}

public class Manager : Employee
{
    public int NumberOfTeams { get; set; }
}

public class SeniorManager : Manager
{
    public string Region { get; set; }
}

public class Director : SeniorManager
{
    public int NumberOfDepartments { get; set; }
}

public class VicePresident : Director
{
    public string Division { get; set; }
}

public class President : VicePresident
{
    public string Company { get; set; }
}

プロンプトの例

このような状況では、他のクラスが継承する必要があるプロパティには親 Employee クラスを使い、それ以外のすべてのプロパティはクラスごとに個別に定義して他の継承を回避できます。

Refactor this code so that classes only inherit the properties of the Employee class. All of the other properties that each class currently inherits should instead be declared independently in each class definition.

応答の例

Note

次の応答は例です。 Copilot Chat の応答は非決定的であるため、ここで示したものとは異なる応答が返される可能性があります。

Copilot は、次のコードを提案します。

public class Employee
{
    public string Name { get; set; }
    public int EmployeeID { get; set; }
}

public class Manager : Employee
{
    public int NumberOfTeams { get; set; }
}

public class SeniorManager : Employee
{
    public int NumberOfTeams { get; set; }
    public string Region { get; set; }
}

public class Director : Employee
{
    public int NumberOfTeams { get; set; }
    public string Region { get; set; }
    public int NumberOfDepartments { get; set; }
}

public class VicePresident : Employee
{
    public int NumberOfTeams { get; set; }
    public string Region { get; set; }
    public int NumberOfDepartments { get; set; }
    public string Division { get; set; }
}

public class President : Employee
{
    public int NumberOfTeams { get; set; }
    public string Region { get; set; }
    public int NumberOfDepartments { get; set; }
    public string Division { get; set; }
    public string Company { get; set; }
}

参考資料