기존 웹 애플리케이션 리팩토링에 접근하는 방법은 무엇입니까?


11

나는 최근에 많이 읽고 생각하고 있으며 웹 개발 전략을 다시 생각해야한다는 결론에 도달했습니다. 나는 많은 즉각적인 프로그래밍을하고 있으며 2 년 동안 PHP 웹 응용 프로그램에서 일해 왔으며 작은 도구로 시작한 것이 큰 프로젝트가되었습니다. 그러나 톤이 기존의 나와 내 이전의 코드, 시간에 메이크업 감각이있을 수 있습니다 코드의 니펫을, 그러나 지금 나는 그것이 실제로 형태로 말했다 코드의 유용성에 의문을 제기하고있다. 또한 단위 테스트 및 테스트 주도 개발과 같은 것들이 최근까지는 제 범위에 없었습니다.

그렇다면 웹 애플리케이션 리팩토링에 어떻게 접근 할 것입니까? 찾아야 할 것과 어떤 순서로 무엇을해야합니까? 브라우저 게임과 기능성 웹 앱은 어떻습니까? 그러면 접근 방식에 차이가 있습니까?


4
고장 나지 않았다면 고치지 마십시오. 테스트를 작성하는 데 더 많은 시간을 보내고 불필요한 변경을하는 데 더 적은 시간을 투자하십시오.
Macneil

그냥 관심 없어 응용 프로그램을 작성하는 데 사용한 언어 / 기술은 무엇입니까? 어떤 종류의 사이트입니까? 참조 welie.com/patterns을 > 디자인의 컨텍스트 - -> 사이트 유형
JW01

@ JW01 뷰 관리 및 양식 유효성 검사를 위해 내부 논리에 PHP를 사용하고 AJAX를 사용합니다. 이것은 웹 기반 응용 프로그램 패턴 의 변형 이지만 내부 도구이므로 지정된 환경에서만 사용할 수 있습니다.
Eldros

질문에 대답했을 때 머리에 앱의 그림이 완전히 다릅니다. 공개 도메인에있는 것보다 훨씬 자유롭게 API를 변경할 수 있습니다.
JW01

@ JW01 나는이 질문이 다른 사람들에게도 유용하기를 원했기 때문에 너무 구체적이기를 원하지 않았습니다.
Eldros

답변:


6

모든 종류의 레거시 코드에 접근하는 것과 거의 같은 방식입니다. 테스트 할 수있는 부분을 찾아 테스트를 작성하고 리팩터링합니다.

쉽게 테스트 할 수있는 부분을 찾을 수없는 경우 테스트 스위트의 안전 장치없이 테스트 할 수 있도록해야합니다.이 경우 테스트 할 수 있도록 거의 테스트 가능한 코드를 매우 신중하게 변경해야합니다.

"인프라"코드, 모델, 데이터베이스를 다루는 물건 등 브라우저에 표시되지 않는 코드는 시작하기에 좋은 장소 일 수 있습니다.

편집 : UI 테스트 : 여기에 경험이 거의 없다는 경고로 내 친구 가이 작업을 수행합니다. 그는 HTML 생성 코드를 실행합니다. 그런 다음 코드를 해킹하고 새로 생성 된 코드를 이전 버전과 비교합니다 (diff를 사용하여 완전히 자동화되지는 않음). HTML이 변경되면 리팩토링이 중단 된 것입니다.


레거시 응용 프로그램의 "보기"부분 (IE, HTML / JavaScript / CSS / etc 부분)을 어떻게 테스트 하시겠습니까? 단위 테스트가 좋은 방법이지만 애플리케이션 코드 테스트는 자동화하기 어렵다고 생각합니다.
Justin Ethier

웹 UI에 대한 테스트를 만들 때-오래된 HTML을 새로운 HTML과 비교하는 것은 일종의 부서지기 쉬운 방법입니다. 나는 웹 페이지의 의미를 식별하고 그것을 테스트하는 경향이 있습니다. 즉, "웹 인쇄물 (페이지 제목, 헤드 라인, 키워드, 아웃 바운드 링크, 양식)이 변경 되었습니까?" "HTML이 변경 되었습니까?"
JW01

'헤드리스 브라우저'를 사용하여 웹앱을 테스트 할 수 있습니다. 기본적으로 QA 사용자를위한 브라우저 단위 테스트를위한 라이브러리입니다. 자바 세계에는 HTMLUnit (순수 자바, 자체 포함) 및 WebDriver (FireFox와 같은 실제 브라우저를 원격 제어)가 있습니다. 내 프로젝트에는 이와 같이 작성된 수백 가지 테스트가 있습니다.
Tom Anderson

@ JW01 당신은 절대적으로 맞습니다-그것은 매우 깨지기 쉽습니다. 일회성 방식으로 리팩토링을 테스트하는 데 유용합니다. 리팩토링이 출력을 변경하지 않았는지 확인할 수 있지만 생성 된 HTML을 변경할 때마다 "새로운 예상"HTML을 저장해야합니다.
Frank Shearar

10

Michael Feathers의 "레거시 코드로 효과적으로 작업하기"라는 훌륭한 책이 있습니다. 우리 모두 레거시 코드가 있습니다.

가장 중요한 것은 만들고있는 새 코드를 테스트 구동하는 것입니다. 다른 코드 조각을 만져야하기 때문에 테스트 할 코드도 얻을 수 있습니다. 시간이 오래 걸리지 만 체계적으로 진행하면 시간이 지남에 따라 전체 제품을 실제로 개선 할 수 있습니다.


3
"우리가 지금하고있는 일은 내일의 레거시 소프트웨어를 작성하는 것입니다."
-Martin

3
  • 예-웹 응용 프로그램이 웹 사이트와 다릅니다

나는 그들을 따로 취급 할 것입니다. 사이트의 일부에 단순히 문서 모음 인 경우 (익명 사용자 및 로그인 한 사용자와 동일하게 보이는)-동적으로 다른 페이지를 제공하는 웹 앱과는 다른 방식으로 구성하는 가장 좋은 방법 각 사용자에게. 사이트의 두 부분을 두 개의 앱 / 구성 요소로 나누고 각 부분을 다르게 다루십시오.

  • 버전 관리 사용 시작

코드가 버전 제어를 받으면 이전에 '경우에 따라'유지했던 불필요한 코드를 모두 제거하고 자신있게 제거 할 수 있습니다. 버전 제어없이 어떻게 살아남 았는지 모르겠습니다.

  • 인피니티 감소

네 개의 다른 URL이 모두 동일한 리소스를 가리키는 경우 문제가 훨씬 더 큽니다. 당신은 무한한 양의 URL을 다루게됩니다. 가능한 빨리 URL 정규화 정책을 마련해야합니다. 이 작업이 완료되면 시맨틱 의미를 URL에 첨부하고 자원에서 URL로 역방향 조회를 수행 할 수 있습니다. 이를 통해 '웹 임프린트'와 사이트의 '리소스'를 분리 할 수 ​​있습니다.

"정규화 된 형식이 무엇입니까?" 일단 고정되면. 그런 다음 사이트의 50,0000 개 이상의 URL을 2,000 개로 줄일 수 있습니다. 이해하고 관리하기가 훨씬 쉽습니다.

참조 : http://www.sugarrae.com/be-a-normalizer-a-c14n-exterminator/

  • '원하는 것'이 아닌 '무엇인가'를 모델링하는 것으로 시작하십시오.

처음부터 모범 사례를 염두에두고 설계되지 않은 레거시 사이트를 정리하는 경우 '엉망'에서 '최상의 디자인'으로 이동하려는 유혹이 있습니다. 나는 적어도 두 단계로 'mess'-> '잘 모델링 된 레거시 코드'-> '추가 된 기능을 갖춘 이상적인 새로운 코드'를 수행해야한다고 생각합니다. 기능 추가를 중지하십시오. 엉망을 고치거나 부패 방지 층 뒤에 캡슐화하는 데 집중하십시오. 그래야만 디자인을 더 나은 것으로 바꿀 수 있습니다.

참조 : http://www.joelonsoftware.com/articles/fog0000000069.html

참조 : http://www.laputan.org/mud/

  • 테스트하는 것이 좋습니다.

테스트 스위트 / 프레임 워크를 작성하고 테스트 추가를 시작하십시오. 그러나 일부 레거시 코드를 테스트하는 것은 까다로운 일입니다. 따라서 너무 매달리지 마십시오. 프레임 워크가 있으면 테스트를 조금씩 추가 할 수 있습니다.

참조 : http://www.simpletest.org/en/web_tester_documentation.html

  • 신념에 용기를 가지십시오

소프트웨어 개발 모범 사례에 대한 대부분의 문헌은 데스크탑 중심 / 엔터프라이즈 앱 중심입니다. 당신의 사이트가 혼란 스러울 때이 책들을 읽고 당신은 그 책에서 나오는 지혜에 경외심을 가질 수 있습니다. 그러나이 모범 사례의 대부분은 웹 / SEO가 중요해지기 전에 이미 발생했음을 잊지 마십시오. POEA, Gof 등과 같은 고전 서적에서 언급 된 것보다 현대 웹에 대해 많이 알고 있습니다.


계속할 수있었습니다. 그러나 이것들은 오래된 레거시 사이트를 반짝이는 새로운 사이트로 리팩토링 할 때 선택한 것들입니다.


좋은 참조 링크!
Nilesh

2

어떤 작업을 수행하기 전에 프로젝트를 소스 제어에 두는 것이 가장 좋습니다. 이 방법으로 변경 사항을 롤백하거나 별도의 지점에서 주요 변경 사항에 대해 작업하고 마일스톤에 태그를 지정할 수 있습니다.

다음으로 변경하려는 코드에 대한 테스트를 작성하십시오. 모든 것에 대한 테스트를 작성하여 한 번에 모든 것을 수행 할 필요는 없습니다. 바로 작업 할 계획입니다. 이론은 충분한 시간이 주어지면 대부분의 코드베이스가 테스트에 의해 다루어 질 것이라고 주장합니다. 일부 리팩토링은 테스트없이 수행하는 것이 "안전"합니다. 이러한 리팩토링은 앞에서 언급 한 레거시 코드북에 문서화되어 있으며 다른 곳에서는 의심 할 여지가 없습니다.

코드 섹션에 대한 테스트가 완료되면 코드를 변경하십시오. 테스트가 통과하는 한 필요한 것은 무엇이든하십시오.

레거시 코드를 사용하더라도 추가 또는 변경을 수행하는 경우 TDD를 수행 할 수 있습니다. 예상되는 변경 사항에 대해 먼저 테스트를 작성하고 실패한 것을 확인한 다음 변경하십시오.

일부 도구가 여기에 유용 할 수 있습니다. NDepend 는 고도로 결합 된 코드 및 기타 냄새를 지적 할 수 있습니다. NCover 는 코드 적용 수준을 추적합니다. FxCop 은 본질적으로 컴파일러의 기능을 넘어서는 코드 정확성 검사기입니다. 이것들은 모든 실제 크기의 프로젝트, 특히 레거시 품종에 유용한 유용한 도구입니다.

궁극적으로 다단계 프로세스입니다. 한 번에 모두 시도하지 말고 한 번에 조금만 가져 가십시오.


-2

나를 화나게하기에 못생긴 경우 전체를 삭제하고 대체품을 적을 수 있습니다.

당신은 거기에 앉아서 정리되지 않은 문서화 된 엉망 주위에 발끝을 내밀고 부드럽게 돌보는 것처럼, 그렇게하는 데 더 많은 시간이 걸린다는 것을 알게 될 것입니다.


2
나는 동의하지 않는다. joelonsoftware.com/articles/fog0000000069.html
JW01

1
자신을 정확하게 방어하기위한 상황 결정이 너무 많습니다. 방대한 Objective-C 라이브러리에서 작업 할 때이 작업을 수행하지 않을 수도 있지만 완전히 새로운 자바 스크립트 라이브러리를 작성하는 것에 대한 자격은 없습니다.
Sneakyness

아주 나쁜 생각입니다! Joel Spolsky가 @ JW01이 2 년 전에 링크되어 Angular & Bootstrap을 사용하여 기존 PHP 앱을 다시 작성하기로 결정한 기사를 읽었 으면합니다. Angular & Bootstrap은 훌륭한 기술이지만 2 년 후에도이 오래된 앱을 변환하려고합니다. 방금 기존 앱을 수정하고 리핑 / 교체하지 않아야합니다.
Zack Macomber

귀하의 의견을 고려할 때 특히 동의합니다. "시나리오"는 결정을 결정하는 핵심 사항입니다. 전체 비즈니스를 지원하는 거대한 API를 제거해야합니까? 누가 알겠습니까, 고려해야 할 것이 많습니다. 나중에 테스트하기 전에 테스트를 원할 것입니다. 하나의 크기가 모두 맞는 것처럼 연결된 기사가 너무 선형 적이지만 무언가 버그가 있거나 실제로 오래된 코드는 어떻습니까? 기사가 실제로 더 읽기 쉽고 유지하기 쉬운 코드로 레거시에서 벗어나지 않겠다고 제안하고 있습니까? 개발자 세계에는 흑백이없고 시나리오와 결정 만 있습니다
James
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.