반복적 인 코드를 구성하는 방법?


11

우리 팀은 많은 일회용 웹 양식을 만듭니다. 이러한 양식의 대부분은 전자 메일을 보내고 일부는 간단한 데이터베이스 쓰기 작업을 수행합니다.

현재 각 양식은 Visual Studio Team Foundation Server의 자체 솔루션으로 존재합니다. 그것은 우리가 100 가지에 가까운 양식 프로젝트에 가까워서 일관성을 유지하기 어렵다는 것을 의미합니다. 각 양식은 필드가 다르다는 점에서 독특하지만 모든 것이 거의 동일합니다.

나는 이것을 어떻게 든 응축하려고 노력하고 있으며 실제로 지침을 사용할 수 있습니다.

  • 모든 양식 프로젝트가 포함 된 하나의 솔루션 파일을 작성해야합니까? 배관 형식 코드는 많지 않지만 전자 메일 형식 등에 도움이되는 몇 가지 도우미 클래스를 만들 수는 있습니다. 프로젝트간에 CSS, JavaScript, 컨트롤 및 이미지를 공유 할 수 있으면 매우 도움이됩니다.
  • 우리가 Microsoft 샵이라는 점을 감안할 때이 특정 시나리오에서 MVC over Webforms와 같은 것을 사용하면 실질적인 이점이 있습니까? MVC의 개념을 전체적으로 판매하고 있지만 전자 메일을 보내는 것이 15 필드 데이터 수집 양식을보다 효율적으로 작성하는 데 도움이됩니까? 이것에 대해 생각하게 한 형태는 사용자의 응답을 기반으로 필드를 표시하고 숨기는 좋은 논리가 내장되어 있으며 MVC와 jQuery를 사용하는 것이 덜 효율적 인 것처럼 보입니다.

2
이것이 메타에서 무엇으로 마이그레이션 되었습니까? SO에 있어야합니다.
Josh K

1
@Josh Stack Overflow는 코드의 특정 문제와 직접 관련된 질문입니다. 프로그램 및 워크 플로 디자인에 대한 주제가 여기에 있습니다.

@Mark : 이상적인 "모범 사례"솔루션이 쉽게 제공 될 수 있으므로 주관적으로 들리지 않습니다. 나는 MS 사람이 아니기 때문에 합병증이 무엇인지 전혀 알지 못하지만 이것이 주관적이지 않은 방식으로 가장 잘 대답 할 것이라고 추측 할 수 있습니다.
Josh K

동의했다. 이것은 너무 닫힐 것입니다.
Walter

1
이미 여기
ChrisF

답변:


3

테스트없이 안전하게 리팩토링하는 것은 어렵고 위험합니다.

나는 다음과 같이 시작할 것이다 :

  • 다양한 형태의 입력과 예상 출력에 대한 테스트 케이스 작성 이러한 형식의 대부분이 기능면에서 동일하거나 가깝다는 느낌이 들기 때문에 실제로 너무 오래 걸리지 않는 것처럼 들립니다.

  • 100 가지 정도의 폼에 대해 테스트 케이스를 실행하십시오 (코드 경로를 추적 할 수 있도록 스위치 코드 범위를 켭니다).

그런 다음 안전하게 리팩터링 할 수있는 항목을 확인할 수 있습니다 (예).

  • 코드 복제 감지 도구를 실행하십시오 (Java에서 CPD가있는 .NET에서 무엇이 호출되는지 확실하지 않음). 13 개의 동일한 양식을 즉시 제거하십시오. 이제 테스트를 다시 실행하십시오. 그것들은 모두 11 번 양식을 제외하고 모두 통과합니다. 그래서 우리는 아직 그것을 삭제할 수 없습니다.

  • 모든 로컬 이메일 형식 코드를 제거하고 모든 이메일 양식을 공통 이메일 처리 모듈로 불러 오십시오. 테스트를 실행하면 모두 하나를 제외하고 전달됩니다. hhmmm OK .... UTF-8 문자, 일반 모듈에서 수정하고 테스트를 다시 실행하십시오.

헹구고 반복하십시오.


2
+1 리팩토링에 접근하는 방법에 대한 힌트는 Michael Feathers 레거시 코드를 사용한 효과적인 작업 amazon.com/dp/0131177052 를 참조하십시오.
Michael Brown

오 좋은 참조-나는 그 책을 좋아한다.
Martijn Verburg

0

제출 부분을 추상화하는 것이 좋습니다. Model / View / Controller를 사용하여 폼을 View에 넣고 동일한 컨트롤러를 사용하도록합니다. 이 컨트롤러는 전자 메일을 기본 주소로 보내거나 양식 데이터를 가능한 컨트롤러로 전환하는 것과 같은 일반적인 작업을 수행 할 수 있습니다. 이렇게하면 새 양식을 작성하기 위해 양식을 작성하고 출력을 해당 제어기로 보내면됩니다. 이 아키텍쳐는 단일 프로젝트에 포함될 수 있으며, 언급 한대로 CSS와 자바 스크립트를 공유 할 수 있습니다.

이메일 포맷을 처리하기 위해, 나는 일반적인 포매터를 만드는 것부터 시작합니다. 폼 요소 이름과 값, 제출 된 시간과 같은 다른 metdata 유형 stuf를 나열하는 것입니다. 원하는대로 멋지게 만들 수 있습니다. . 그런 다음 그보다 더 많은 사용자 정의 처리가 필요한 경우 팩토리를 추가하십시오. 팩토리는 포맷터 인터페이스를 돌려줍니다. 그런 다음 팩토리 내에서 특정 양식에 대한 포맷터를 검색하거나 특정 양식이없는 경우 일반 양식을 리턴 할 수 있습니다. 이 디자인은 테스트 목적으로 모의 포맷터를 쉽게 제공 할 수 있기 때문에 cntroller의 단위 테스트를 더 쉽게 해줍니다.

덧붙여서, 나는 이메일 주소를 양식의 인수로 넣지 않을 것입니다. 여러 주소로 보내야 할 경우 모든 양식과 이메일을 포함하는 조회 테이블을 사용하는 것이 좋습니다. 이것은 XML 또는 코드로 구현 될 수 있습니다 (두 가지를 보았지만 더 나은지 확실하지는 않습니다). 이렇게하면 스패머가 양식 페이지에서 전자 메일 주소를받는 것을 방지 할 수 있습니다.


답장을 보내 주셔서 감사합니다. 이 아키텍처에서 전송되는 전자 메일의 형식을 어디에서 처리합니까? 이것을 추상화하고 싶지만 stringbuilder를 만들고 정적 텍스트 블록 사이에 필드를 놓지 않고 서식을 지정하는 방법을 생각할 수 없습니다. 이것은 각 양식에 따라 다릅니다.
Josh Earl

또한 다른 드롭 다운의 선택을 기반으로 드롭 다운을 채우는 것과 같은 양식 논리 처리에 대한 권장 사항은 무엇입니까? MVC 경로를 사용하는 경우 jQuery가 유일한 옵션입니까?
Josh Earl

@ JoshEarl : 포매터에 대한 아이디어로 편집했지만 jQuery 등에 대한 제안을 할 수는 없습니다. 일이 너무 복잡하면 페이지 당 하나의 컨트롤러로 전체 MVC 디자인을 사용해야 할 수도 있습니다. @Martijn이 말했듯이 단위 테스트를 통해 요구 사항이 정확히 무엇인지 알 수 있습니다. 내 디자인은 양식 사이에 많은 유사성이 있다고 가정합니다.
Michael K
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.