배경
C # 프로젝트를 진행 중입니다. 저는 C # 프로그래머가 아니며 주로 C ++ 프로그래머입니다. 그래서 기본적으로 쉽고 리팩토링 작업이 할당되었습니다.
코드는 엉망입니다. 거대한 프로젝트입니다. 고객이 새로운 기능과 버그 수정을 통해 빈번한 릴리스를 요구함에 따라 다른 모든 개발자는 코딩하는 동안 무차별 대입 방식을 취해야했습니다. 코드는 유지 관리가 불가능하며 다른 모든 개발자가 동의합니다.
나는 그들이 옳은지를 논하기 위해 여기에 있지 않습니다. 리팩토링 할 때 리팩토링 된 코드가 복잡해 보일 때 올바른 방식으로 수행하고 있는지 궁금합니다. 다음은 간단한 예입니다.
문제
여섯 종류가 있습니다 : A
, B
, C
, D
, E
와 F
. 모든 클래스에는 함수가 ExecJob()
있습니다. 6 가지 구현은 모두 매우 유사합니다. 기본적으로 처음 A::ExecJob()
에 작성되었습니다. 그런 다음의 B::ExecJob()
복사 붙여 넣기 수정 으로 구현 된 약간 다른 버전이 필요했습니다 A::ExecJob()
. 약간 다른 버전이 필요할 때 C::ExecJob()
작성되었습니다. 6 개의 구현에는 모두 공통 코드가 있고, 다른 코드 줄이 있으며, 다시 공통 코드가 있습니다. 다음은 간단한 구현 예입니다.
A::ExecJob()
{
S1;
S2;
S3;
S4;
S5;
}
B::ExecJob()
{
S1;
S3;
S4;
S5;
}
C::ExecJob()
{
S1;
S3;
S4;
}
SN
정확히 같은 진술 그룹이 어디에 있습니까 ?
그것들을 공통으로 만들기 위해 다른 클래스를 만들고 공통 코드를 함수로 옮겼습니다. 매개 변수를 사용하여 실행할 명령문 그룹을 제어하십시오.
Base::CommonTask(param)
{
S1;
if (param.s2) S2;
S3;
S4;
if (param.s5) S5;
}
A::ExecJob() // A inherits Base
{
param.s2 = true;
param.s5 = true;
CommonTask(param);
}
B::ExecJob() // B inherits Base
{
param.s2 = false;
param.s5 = true;
CommonTask(param);
}
C::ExecJob() // C inherits Base
{
param.s2 = false;
param.s5 = false;
CommonTask(param);
}
이 예제에서는 세 개의 클래스와 지나치게 단순화 된 명령문 만 사용합니다. 실제로이 CommonTask()
함수는 모든 매개 변수 검사와 함께 매우 복잡해 보이고 더 많은 명령문이 있습니다. 또한 실제 코드에는 여러 가지 모양의 CommonTask()
함수가 있습니다.
모든 구현이 공통 코드를 공유하고 ExecJob()
함수가 더 깔끔해 보이지만 나를 귀찮게하는 두 가지 문제가 있습니다.
- 의 변경 사항이
CommonTask()
있을 경우 6 가지 기능 (및 향후 추가 기능)이 모두 테스트되어야합니다. CommonTask()
이미 복잡합니다. 시간이 지남에 따라 더 복잡해집니다.
올바른 방법으로하고 있습니까?