이 문맥에서 "외부"는 "사용자가 볼 수 있음"을 의미합니다. 응용 프로그램의 경우 사용자이거나 공용 API의 경우 다른 프로그램 일 수 있습니다.
따라서 메서드 M을 클래스 A에서 클래스 B로 옮기고 두 클래스가 응용 프로그램 내부에 있고 변경으로 인해 응용 프로그램의 동작 변화를 관찰 할 수없는 사용자는 리팩토링이라고 할 수 있습니다.
OTOH의 다른 상위 레벨 하위 시스템 / 구성 요소가 변경으로 인해 동작이나 변경이 발생하는 경우 실제로는 사용자 (또는 일반적으로 로그를 확인하는 시스템 관리자)에게 있습니다. 또는 클래스가 공개 API의 일부인 경우 B가 아닌 클래스 A의 일부인 M에 의존하는 타사 코드가있을 수 있습니다. 따라서 이러한 두 가지 경우 모두 엄격한 의미에서 리팩토링하지 않습니다.
리팩토링으로 코드 재 작업을 호출하는 경향이 있습니다.
사실, 그것은 리팩토링이 유행이되어 슬프지만 기대되는 결과입니다. 개발자들은 연령에 따라 임시 방식으로 코드 재 작업을 수행해 왔으며, 뿌리 깊은 습관을 분석하고 변경하는 것보다 새로운 유행어를 배우는 것이 훨씬 쉽습니다.
그렇다면 외부 행동을 변화시키는 재 작업의 올바른 단어는 무엇입니까?
나는 그것을 재 설계 라고 부를 것이다 .
최신 정보
인터페이스에 대한 흥미로운 답변이 많이 있지만 메소드 리팩토링으로 인터페이스를 변경하지 않습니까?
어떤? 특정 수업입니다. 그러나이 수업은 어떤 식 으로든 외부 세계에 직접 표시됩니까? 그들은의 외부 인터페이스 (API / GUI)의 일부 프로그램 내부에, 그리고 때문에 - 그렇지 않으면 프로그램 - 변화가 이루어지지 외부 자에 의한 관찰 할 수있다 (물론 변화 나누기 뭔가,하지 않는 한).
나는 이것보다 더 깊은 질문이 있다고 생각합니다 . 특정 클래스가 독립적 인 독립 체로서 존재합니까? 대부분의 경우 대답은 ' 아니오'입니다 . 클래스는 더 큰 구성 요소, 클래스 및 객체의 에코 시스템의 일부로 만 존재하며 인스턴스가 없으면 인스턴스화 할 수없고 사용할 수 없습니다. 이 생태계에는 (직접 / 간접) 종속성뿐만 아니라 그에 의존하는 다른 클래스 / 객체도 포함됩니다. 이러한 높은 수준의 클래스가 없으면 클래스와 관련된 책임이 시스템 사용자에게 무의미하거나 쓸모가 없기 때문입니다.
예를 들어 렌터카를 다루는 프로젝트에는 Charge
수업. 이 클래스는 렌탈 스테이션 에이전트와 고객이 개별 요금으로 많은 것을 할 수 없기 때문에 시스템 사용자에게는 그다지 쓸모가 없습니다. . 사용자는 대부분이 요금의 총액에 관심이 있으며 결국 지불해야합니다. 상담원은 다양한 계약 옵션, 대여 기간, 차량 그룹, 보험 패키지, 추가 품목 등에 대해 관심이 있으며, 정교한 비즈니스 규칙을 통해 존재하는 요금과 최종 지불 방법을 결정합니다. 이 중. 또한 국가 대표 / 비즈니스 분석가는 특정 비즈니스 규칙, 시너지 및 효과 (회사의 수입 등)에 관심을 갖습니다.
최근에 나는이 클래스를 리팩토링하여 대부분의 필드와 메소드의 이름을 변경했다 (전임자가 완전히 무시한 표준 Java 명명 규칙을 따랐다). 나는 또한 더 교체 리팩토링을 계획 String
하고 char
더 적절한있는 필드 enum
와 boolean
유형. 이 모든 것이 확실히 클래스의 인터페이스를 바꿀 것이지만 (내 일을 올바르게하면) 우리 앱의 사용자에게는 아무것도 보이지 않을 것입니다. 그들 중 아무도 그들이 확실히의 개념을 알고에도 불구하고, 표현하는 방법을 개별 요금에 대한 관심 없다 요금. 도메인 개념을 나타내지 않는 백 개의 다른 클래스를 예로들 수 있었으므로 최종 사용자에게는 개념적으로 볼 수 없었지만 개념 수준에서 최소한의 가시성이있는 예제를 선택하는 것이 더 흥미 로웠다고 생각했습니다. 이것은 클래스 인터페이스가 도메인 개념의 표현 일 뿐이며 실제 상황이 아니라는 점을 잘 보여줍니다. 개념에 영향을주지 않고 표현을 변경할 수 있습니다. 그리고 사용자는 그 개념을 가지고 있고 이해할뿐입니다. 개념과 표현 사이의 매핑을하는 것이 우리의 임무입니다.
* 하나는 쉽게 우리의 클래스가 나타내는 도메인 모델은, 그 자체 일부 "진짜"의 대략적인 표현 인 것을 추가 할 수 있습니다 ..