문제

나는 몇 주 전에 몇몇 동료들과 리팩토링에 대해 토론한 적이 있는데, 나는 "조기 리팩터링, 자주 리팩터링"이 코드가 지저분해지고 유지 관리가 불가능해지는 것을 방지하는 좋은 접근 방식이라고 믿는 소수에 속하는 것 같습니다.다른 많은 사람들은 그것이 단지 프로젝트의 유지 관리 단계에 속한다고 생각했습니다.

의견이 있으시면 옹호해주세요.

도움이 되었습니까?

해결책

당신이 말했듯이 : Refactor Early, Refactor는 자주 자주.

초기 리팩토링은 필요한 변화가 여전히 내 마음에 신선하다는 것을 의미합니다. 리팩토링은 종종 변화가 더 작은 경향이 있음을 의미합니다.

리팩토링을 지연시키는 것은 큰 혼란을 일으켜 리팩터가 더 어려워집니다. 혼란이 나오면 청소하면 나중에 문제가 발생하지 못하게됩니다.

다른 팁

코드가 작동하자마자 (모든 테스트가 통과) 코드를 리팩토링합니다. 이런 식으로 나는 여전히 내 마음에 신선한 상태에서 그것을 청소하고, 다른 사람이 첫 번째 버전이 얼마나 못 생겼는지보기 전에 그것을 청소합니다.

초기 체크인 후에는 코드를 터치 할 때마다 일반적으로 리팩터를 리팩터링합니다. 리팩토링은 별도의 시간을 따로 설정해야 할 것이 아닙니다. 당신이 갈 때 당신이하는 일이어야합니다.

당신은 두 개의 모자를 켜고 코드를 작성합니다. 그만큼 단지 모든 일을하는 것 모자와 나는 내일 내일을 이해하지 못한다 모자. 분명히 두 번째 모자는 리팩토링입니다. 그래서 당신은 무언가를 만들 때마다 리팩토러를 사용하지만 (필연적으로) 복제 된 코드, 긴 방법, 깨지기 쉬운 오류 처리, 불량 변수 이름 등과 같은 냄새를 소개했습니다.

일이 작동하는 동안 (즉, 두 모자를 착용하는) 비편성은 사소한 작업에 실용적이지 않습니다. 그러나 다음 날/주/반복까지 리팩토링을 연기하는 것은 문제의 맥락이 머리에서 사라지기 때문에 매우 나쁩니다. 따라서 모자를 가능한 한 자주 전환하지만 절대 결합하지 마십시오.

나는 그것이 최선을 다해 내 코드를 연마 할 수 있기 때문에 내가 얻는 모든 기회를 리팩터링합니다. 처음에 인재 할 수없는 코드 생성을 방지하기 위해 적극적으로 개발할 때에도이 작업을 수행합니다. 또한 종종 종종 디자인 결정이 고정되지 않기 전에 열악한 디자인 결정을 똑 바르게 할 수 있습니다.

리팩토링해야 하는 세 가지 이유:

  • 귀하의 원래 디자인(매우 작은 영역에 있을 수도 있지만 그럼에도 불구하고 디자인)이 잘못되었습니다.여기에는 일반적인 작업을 발견하고 코드를 공유하려는 위치가 포함됩니다.
  • 반복적으로 디자인하고 있습니다.
  • 코드가 너무 나빠서 대대적인 수정이 필요합니다.

리팩토링하지 말아야 할 세 가지 이유:

  • "이거 좀 지저분해 보이는데."
  • "저는 마지막 사람이 한 방식에 전적으로 동의하지 않습니다."
  • "더 효율적일 수도 있습니다."(문제는 '힘'입니다).

"지저분하다"는 논란의 여지가 있습니다. "깨진 창 고치기" 또는 "코드 위생"이라고 불리는 유효한 주장이 있습니다. 이는 작은 것을 미끄러지게 놔두면 큰 것도 미끄러지기 시작한다는 것을 의미합니다.그것은 괜찮고 염두에 두어야 할 좋은 일이지만 그것은 비유라는 것을 기억하십시오.가능한 가장 깨끗한 솔루션을 찾기 위해 끊임없이 물건을 바꾸는 것은 변명할 수 없습니다.

리팩토링 빈도는 타당한 이유가 얼마나 자주 발생하는지, 그리고 테스트 프로세스가 버그 발생으로부터 보호한다고 얼마나 확신하는지에 따라 달라집니다.

리팩토링 그 자체는 결코 목표가 아닙니다.하지만 뭔가가 작동하지 않으면 수정해야 하며 이는 유지 관리에서와 마찬가지로 초기 개발에서도 마찬가지입니다.사소하지 않은 변경의 경우 다른 곳의 변경을 피하기 위해 한 장소를 큰 덩어리로 패치하는 것보다 리팩토링하고 새로운 개념을 깔끔하게 통합하는 것이 거의 항상 더 좋습니다.

그만한 가치가 있기 때문에 인터페이스를 사용하는 방법을 알고 있고 결과 변경의 범위가 관리 가능하다면 인터페이스를 변경하는 것은 아무 것도 아니라고 생각합니다.

책에서 말했듯이, 당신은 언제 리팩터를 리팩터링합니다

  • 코드를 추가합니다 ... 새로운 기능
  • 버그 / 결함을 고치면
  • 여러 사람과 코드 검토를 할 때
  • 세 번째로 무언가를 복제하는 것을 발견하면 .. 3 파업 규칙

아이디어를 플러시 할 때 많은 시간이 내 코드가 매우 단단히 결합되고 지저분한 시작됩니다. 아이디어를 연마하기 시작하면서 더 많은 논리적 분리가 점점 더 명확 해지고 리팩토링을 시작합니다. 그것은 끊임없는 과정이며 모든 사람들이 제안한 것처럼 '일찍 그리고 자주'해야합니다.

나는이 좌우명으로 가려고 노력한다.

수정을하거나 기능을 추가 할 때 일반적으로 영향을받는 코드에서 제한된 리팩토링을 수행하기 위해 그 기회를 사용합니다. 종종 이것은 의도 한 변화를 더 쉽게 만들 수 있으므로 실제로 비용이 들지 않습니다.

그렇지 않으면, 당신은 항상 화재와 싸우고 있기 때문에 (왜 그런지 궁금해 할 수 없다면) 리팩토링을위한 전용 시간 예산을 책정해야합니다. 그러면 변경을 할 때 "코드 냄새"가 훨씬 어려워 질 때 리팩터를 강제해야합니다. 견딜 수 없습니다.

나는

나는 코드를 수정하고 있으며 그것에 의해 혼란 스럽습니다. 그것을 깎는 데 시간이 걸리면 리팩토링이 필요합니다.

새 코드를 만들고 "작동"한 후에는 "작동"합니다. 종종 일을 할 것입니다. 코딩 할 때 나는 "이봐, 나는 몇 번의 변경으로 만 20 줄을 한 일을 다시해야한다"고 깨달았습니다. 그 시점에서 나는 리팩터와 계속합니다.

내 의견으로는 당신이 이것을하는 것을 막아야 할 유일한 것은 시간 제약입니다. 좋아하든 아니든, 때때로 당신은 할 시간이 없습니다.

그것은 국립 공원과 같습니다. 항상 당신이 찾은 것보다 조금 더 잘 두십시오.

나에게, 그것은 내가 코드를 오픈 할 때마다, 그리고 무슨 일이 일어나고 있는지 알아 내기 위해 머리를 긁어 야한다는 것을 의미합니다. 나의 주요 목표는 가독성과 이해를위한 것입니다. 일반적으로 명확성을 위해 변수를 바꾸는 것입니다. 때로는 방법을 추출하고 있습니다.

예를 들어 (사소한), 내가 만나면

temp = array[i];
array[i] = array[j];
array[j] = temp;

아마 그것을 스왑 (i, j) 메소드로 바꿀 것입니다.

컴파일러는 어쨌든 그것을 인화 할 가능성이 높으며 스왑 ()은 모든 사람에게 의미 적으로 무슨 일이 일어나고 있는지 알려줍니다.

즉, 내 자신의 코드 (처음부터 시작)로 디자인을 리팩터링하는 경향이 있습니다. 나는 종종 구체적인 수업에서 일하는 것이 더 쉽다는 것을 알게됩니다. 완료되고 디버깅되면 오래된 추출물 인터페이스 트릭을 가져옵니다.

구멍을 알아 차리지 않기 위해 코드에 너무 가깝기 때문에 동료에게 가독성을 리팩터에게 맡길 것입니다. 결국, 나는 내가 무슨 뜻인지 알고 있습니다.

기회 적으로 리팩터! 그것이 될 때마다 그것을하십시오 쉬운.

리팩토링이 어려운 경우, 잘못된 시간에 (코드가 필요하지 않은 경우) 또는 코드의 잘못된 부분 (ELSWHERE를 얻을 수있는 더 나은 효율성이있는 경우)에 수행하고 있습니다. (또는 당신은 아직 리팩토링에 능숙하지 않습니다.)

"유지 보수"에 대한 리팩토링을 저장하는 것은 팽팽한학입니다. 리팩토링 ~이다 유지.

나는 매번 리팩터를 리팩토링합니다 읽다 무엇이든 만들 수 있습니다 더 읽기 쉬운. 주요 구조 조정이 아닙니다. 하지만 내가 "무엇을 하는가? List 포함하다? 오, IntegerS! "그러면 변경하겠습니다 List<Integer>. 또한, 나는 종종 IDE에서 방법을 추출하여 몇 줄의 코드 라인을 넣습니다.

대답은 항상이지만 더 구체적으로 다음과 같습니다.

  • 각 작업에 대해 지점을 가정 한 다음 각 새 지점에서 QA로 이동하기 전에.
  • 트렁크에서 모든 것을 개발하면 각 커밋 전에.
  • 이전 코드를 유지할 때는 위의 내용을 새 작업에 사용하고 이전 코드의 경우 추가 QA를 얻을 주요 릴리스에 대한 리팩토링을 수행하십시오.

당신이 필요로 할 때마다. 적어도 리팩토링이 필요한 코드를 변경할 때.

현재 작업과 관련된 코드로 리팩토링을 현지화합니다. 나는 내 리팩토링을 앞쪽으로하려고 노력합니다. 기능적 관점에서 이러한 변경 사항을 개별적으로 저지르고 실제 작업과 관련이 없습니다. 이렇게하면 코드가 작업하기가 더 깨끗하며 개정 내역도 더 깨끗합니다.

지속적으로, 이유 내에서. 항상 소프트웨어를 개선 할 수있는 방법을 찾고 있어야하지만 리팩토링 (Refactorbation)을 위해 리팩토링하는 상황을 피하기 위해주의해야합니다.

리팩토링이 코드를 더 빠르거나 읽기 쉽고 쉽게 유지하거나 쉽게 유지하거나 쉽게 유지하거나 다른 가치를 제공 할 수있는 경우를 만들 수 있습니다.

"Refactor Early, Refactor 자주 자주"는 생산적인 가이드 라인입니다. 이런 종류의 코드를 알고 있다고 가정합니다. 시스템이 오래 될수록 더 위험한 리팩토링이 발생하고 심의가 필요합니다. 경우에 따라 리팩토링은 노력 수준 및 시간 추정치 등으로 관리 작업이어야합니다.

변경 사항을 안전하게 변경할 수있는 리팩토링 도구가 있으면 리팩터링해야합니다. 코드가 컴파일 될 때마다, 코드가 더 명확 해지면.

그러한 도구가없는 경우 리팩터링해야합니다. 테스트가 녹색 일 때마다, 코드가 더 명확 해지면.

작은 변경 사항 - 메소드 이름을 명확하게 만드는 방법을 바꾸십시오. 관련 변수 그룹이 명확하게 관련되도록 클래스를 추출하십시오. 리팩토링은 큰 변화를 일으키는 것이 아니라 분씩 더 깨끗하게 만드는 것입니다. 리팩토링은 모든 표면이 더러운 접시로 덮일 때까지 대기하는 대신 각 식사 후에 요리를 치우고 있습니다.

절대적으로 편리 해 보인다. 당신이 통증이 쌓이지 않으면.

Squeak으로 전환 한 이후 (지금은 모든 게시물을 언급하고있는 것 같습니다) 프로토 타이핑 중에 많은 디자인 질문이 해당 환경에서 쉽게 쉽게 이루어지기 때문에 사라지는 것을 깨달았습니다. 솔직히 말해서, 리팩토링이 기본적으로 고통이없는 환경이 없다면, 나는 그것이 어떤 것인지 알기 위해 Squeak를 시도하는 것이 좋습니다.

리팩토링은 종종 종종 하루를 절약하거나 적어도 시간을 절약 할 수 있습니다. 내가 작업하고있는 프로젝트가 있었고 우리는 이정표에 부딪친 후 모든 코드를 리팩토링했습니다. 더 이상 유용하지 않은 코드를 찢어 야한다면 우리가 필요한 새로운 것을 더 쉽게 패치 할 수 있기 때문에 좋은 방법이었습니다.

우리는 지금이 일에 대해 논의하고 있습니다. 우리는 "그것이 작동하도록 작성한 다음 고정"에 대해 어느 정도 동의합니다. 그러나 우리는 시간 관점에서 다릅니다. 나는 더 "바로 수정", 내 동료는 더 "다음 반복에서 수정"하다.

일부는 그를 백업하는 것을 인용합니다.

Douglas Crockford, 선임 자바 스크립트 건축가 야후 :

7 번째 스프린트마다 리팩터.

Ken Thompson (유닉스 맨) :

그 자체로 거의 썩음을 코딩하면 다시 작성할 것입니다. 아무것도 변하지 않았을 때조차도 어떤 이유로 든 썩습니다.

제출 된 코드가 2 개월 안에 돌아와서 "예, 여기서 잘 했어요"라고 생각할 수있는 일이 한 번만한 일을 한 번 원합니다. 나는 나중에 돌아와서 고칠 시간을 찾기가 쉽다고 믿지 않습니다. 이것이 내 관점에서 다소 순진하다고 믿는다.

편집 : 철자 오류

나는 당신이 현재 그것의 일부에서 일하고있을 때 무언가를 재현해야한다고 생각합니다. 함수 A를 향상시켜야한다면 이전에 (나중에) 리팩터링해야합니다. 이 기능으로 아무것도하지 않으면 다른 일이있는 한 그대로 두십시오.

이미 변경해야하지 않는 한 시스템의 작업 부분을 리팩터링하지 마십시오.

이 주제에 대한 많은 견해가 있으며, 일부는 특정 방법론이나 개발에 대한 접근 방식과 관련이 있습니다. TDD를 사용할 때 리팩터는 조기에, 종종 선호하는 접근법입니다.

다른 상황에서는 필요할 때 리팩터를 리팩터 할 수 있습니다. 예를 들어, 반복 코드를 발견하면

상세한 선불 디자인으로보다 전통적인 방법을 따를 때 리팩토링이 덜 자주 발생할 수 있습니다. 그러나 프로젝트가 끝날 때까지 리팩토링을 떠나지 않는 것이 좋습니다. UAT 이후의 문제, 잠재적으로 문제를 도입 할뿐만 아니라 리팩토링이 점차 어려워지는 경우도 종종 있습니다. 이러한 이유로, 클래식 프로젝트의 시간 제약으로 인해 리팩토링 및 추가 테스트가 삭제되고 유지 보수가 시작되면 이미 스파게티 코드 몬스터를 만들 수 있습니다.

부러지지 않았다면 리팩터링하지 마십시오.

리팩터의 시간은 초기 코딩 단계에 속해 있으며, 당신이 원하는만큼 자주 그리고 여러 번 할 수 있습니다. 일단 고객의 손에 들어가면 다른 문제가됩니다. 당신은 배송되고 무언가를 깨뜨린다는 것을 알기 위해 자신을 위해 자신을 위해 일하는 것만으로 일하고 싶지 않습니다.

Refactor에게 최초 배달 후 시간은 당신이 할 것이라고 말할 때입니다. 코드가 너무 냄새가 나면 리팩토링과 몇 가지 중요한 수정 사항이 포함 된 전용 릴리스가 있습니다. 그렇게하면 무언가를 깨뜨릴 경우, 어디에서 잘못되었는지 알면 훨씬 쉽게 고칠 수 있습니다. 당신이 항상 리팩토링되면, 당신은 물건을 깨뜨릴 것이고, 당신은 그것이 QAD를 얻을 때까지 깨진 것을 알지 못할 것입니다. 그러면 Bugfix/기능 코드 변경이 문제를 일으켰는지 또는 일부를 파악하려고 노력할 것입니다. 당신이 연간 공연 한 리팩토링.

코드가 예전처럼 보일 때 Creaking 변경 사항을 확인하는 것이 훨씬 쉽습니다. 리팩터가 많은 코드 구조를 사용하면 불가능한 코드 구조를 불가능하게 만들 수 있으므로 심각하게 의미 할 때만 리팩터 만 리팩터링하십시오. 다른 제품 코드가 변경되는 것처럼 취급하면 괜찮을 것입니다.

이 100 WordPress 블로그 게시물에 좋은 조언이있을 수 있다고 생각합니다.http://blog.accurev.com/2008/09/17/dr-strangecode-or-how-learned-to-stop-worrying-nove-code/

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top