나는 여기에 언급되지 않은 리팩토링에 대해 믿었습니다. 여기에 이미 많은 답변이 있다는 것을 알고 있지만 이것이 새로운 것이라고 생각합니다.
나는 용어가 발생하기 전에 무자비한 리 팩터이자 DRY를 강력하게 믿는 사람이었습니다. 대부분 머리에 큰 코드베이스를 유지하는 데 어려움이 있고 부분적으로 DRY 코딩을 즐기고 C & P 코딩에 대해 아무 것도 즐기지 않기 때문입니다. 실제로 그것은 고통스럽고 굉장히 느립니다.
문제는 DRY를 주장하면서 다른 기술을 거의 사용하지 않는 기술에 대해 많은 연습을 해주었습니다. 많은 사람들은 Java가 DRY를 만들기가 어렵거나 불가능하다고 주장하지만 실제로는 시도하지 않습니다.
오래 전에 나온 한 가지 예는 귀하의 예와 다소 유사합니다. 사람들은 자바 GUI 생성이 어렵다고 생각하는 경향이 있습니다. 물론 다음과 같이 코드를 작성하면됩니다.
Menu m=new Menu("File");
MenuItem save=new MenuItem("Save")
save.addAction(saveAction); // I forget the syntax, but you get the idea
m.add(save);
MenuItem load=new MenuItem("Load")
load.addAction(loadAction)
이것이 미쳤다고 생각하는 사람은 절대적으로 옳지 만 Java의 잘못은 아닙니다. 코드는 절대 이런 식으로 작성해서는 안됩니다. 이 메소드 호출은 다른 시스템에서 랩핑되도록 설계된 함수입니다. 그러한 시스템을 찾을 수 없다면 구축하십시오!
당신은 분명히 그렇게 코드를 작성할 수 없으므로, 물러서서 문제를 살펴 봐야합니다. 반복되는 코드가 실제로 무엇을하고 있습니까? 문자열과 관계 (트리)를 지정하고 해당 트리의 잎을 동작에 결합시킵니다. 그래서 당신이 정말로 원하는 것은 :
class Menu {
@MenuItem("File|Load")
public void fileLoad(){...}
@MenuItem("File|Save")
public void fileSave(){...}
@MenuItem("Edit|Copy")
public void editCopy(){...}...
간결하고 서술적인 방식으로 관계를 정의한 후에는이를 처리 할 메소드를 작성합니다.이 경우 전달 된 클래스의 메소드를 반복하고 트리를 작성한 다음이를 사용하여 메뉴를 빌드하십시오. 액션은 물론 메뉴를 표시합니다. 당신은 복제를 할 수 없으며, 당신의 방법은 재사용 할 수 있습니다 ... 그리고 아마도 많은 메뉴보다 쓰기가 쉬울 것입니다. 그리고 실제로 프로그래밍을 즐기고 있다면, 훨씬 더 재미있었습니다. 직접 작성해야하는 방법은 메뉴를 직접 작성하는 것보다 줄이 적습니다.
이 일을 잘하기 위해서는 연습을 많이해야합니다. 반복되는 부분에 고유 한 정보가 무엇인지 정확하게 분석하고 정보를 추출하여 잘 표현하는 방법을 알아 내야합니다. 문자열 구문 분석 및 주석과 같은 도구를 사용하는 방법을 배우면 많은 도움이됩니다. 오류보고 및 문서에 대해 명확하게 학습하는 것도 매우 중요합니다.
코드를 잘 작성하면 "무료"연습을 할 수 있습니다. 잘 익히면 재사용 가능한 도구 작성을 포함하여 DRY 코드 작성이 복사 및 붙여 넣기보다 빠르며 모든 오류, 중복 오류가 발생한다는 것을 알게 될 것입니다 코딩의 유형에 따라 어려운 변화.
드라이 테크닉과 도구를 최대한 연습하지 않으면 일을 즐길 수 없을 것 같아요. 복사 및 붙여 넣기 프로그래밍을하지 않아도되는 비용을 감수해야한다면 가져 가겠습니다.
내 요점은 다음과 같습니다.
- 잘 리팩토링하는 방법을 모르면 복사 및 붙여 넣기에 더 많은 시간이 소요됩니다.
- 가장 어렵고 사소한 경우에도 DRY를 주장함으로써 잘 리팩토링하는 법을 배웁니다.
- 코드를 건조하게 만들기 위해 작은 도구가 필요한 경우 프로그래머입니다.
always
와never
붉은 깃발있다. 은 "컨텍스트"라는 것은,있다always
와never
도 일반적으로 좋은 경우 규칙은, 적절한 것을하지 않을 수는. 절대적으로 다루는 소프트웨어 개발자를 조심하십시오. ;)