깊은 상속 계층 구조 또는 상속의 부적절한 사용은 유지 관리가 어려운 코드를 초래하게 되어, 클래스 간의 관계를 이해하거나 클래스 확장 시 문제를 일으키지 않고 확장하기 어려워질 수도 있습니다.
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; }
}