2011-03-03 2 views
7

모두이 코드에서 ASP.NET MVC 응용 프로그램의 레거시 코드에 문제가 있습니다. 비즈니스 로직 계층에 클래스 서비스가 있습니다. 이 클래스는 20 개의 인자를 가진 메소드를 가지고 있는데이 메소드는이 20 개의 인자를 사용하여 객체의 인스턴스를 생성합니다. 생성 된 개체가 변경되고 메서드에서 인수를 변경해야하는 경우 문제가되기 때문에이 코드를 리팩토링하는 방법. 이 서비스 클래스는 컨트롤러 클래스 및 단위 테스트에서 사용됩니다. 리팩토링 자에게이 코드를 도와주세요 미리 감사드립니다.인자가 많은 클래스의 메소드를 리팩토링하는 방법은?

편집 추가 정보 :

내가

public Qualification CreateQualification(string achievableCode, string achievableTitle, 
     string accreditationRef, bool brandingPrefix, long brand, float guidedLearningHours, 
     int creditValue, long level, long type, long gradingType, long area, int subArea, 
     DateTime accreditationStartDate, DateTime accreditationEndDate, 
     DateTime lastCertDate, string nameOnCert, 
     long organisationId) 

나는 그것이 내가 몇 가지 클래스를 추출 할 수 있습니다 예를 들어 Kely 및 Chevex aproach을 적용 할 필요가 생각하는 방법의 서명을 표시 할 수 있습니다

하나가 매개 변수에서옵니다 :

long area, int subArea 

다른

bool brandingPrefix, long brand, 

그리고 내가 이해 올바른 매개 변수 개체를 소개 사용할 수 있습니다 추출 서브 클래스 후

?

+4

하나를 사용하지만, 때 ASP.Net MVC는 기존 거죠 :) –

+1

은 아마도 그는 기존에게 레거시 코드와 효과적으로 협력 그의 책 [에서와 마이클 깃털 같은 방식을 의미한다 (참조 현대 해석 섹션)] (http://en.wikipedia.org/wiki/Legacy_code). – Matt

+1

레거시 코드라고 말하면, 오랫동안 ASP.NET MVC 애플리케이션에서이 코드가 다른 개발자에 의해 작성된 코드임을 의미합니다. – Serghei

답변

14

20 개의 인수를 보유하고 해당 개체를 메서드에 전달할 개체를 만듭니다. 예를 들어

:

당신이 자신을 여러 방법으로 같은 인수를 사용하여 찾을 수 Chevex's 대답을 고려한다면이 패턴은, 한 번 리팩토링에 유용 할 수 있지만

public void MyMethod(MyArguments args) 
{ 
    // do stuff 
} 

편집 할 수 있습니다. 더 나은 접근 방법입니다.

+4

아니요, [Introduce Parameter Object] (http://www.refactoring.com)입니다. /catalog/introduceParameterObject.html) 리팩토링. – Oded

+0

다른 매개 변수를 별도의 객체로 묶는 것을 언급했지만, 객체가 OO 관점에서 같은 객체에 모두 있다는 보장이 없다고 생각합니다. –

+5

별개의 개체에 20 개의 매개 변수를 설정해야하기 때문에 바보입니다. 그것은 작품이 원본과 다른 대상에 있도록하기 위해 조금 추상화 된 것과 같은 것입니다. 그들 모두를 하나의 덩어리로 묶는 대신, 관련 가치를 확인하고 그 값을 분해 해 내 대답을 생각해보십시오. IMO는 모든 인수를 인수 객체로 밀어 넣는 것보다 낫습니다. 잠재적으로 함께 갈 수있는 데이터를 골라 내고 그 데이터를 개별 개체로 개별적으로 분석합니다. – Chev

13

인수에서 관련 데이터를 식별하고 해당 데이터를 고유 한 사용자 지정 개체로 분석하려고 할 수 있습니다. 예를 들어,이 개체가 척 :

public class Person 
{ 
    public Person(string firstName, string lastName, int age, 
     string streetAddress, string city, string state, int zipCode) 
    { 
     this.FirstName = firstName; 
     this.LastName = lastName; 
     this.Age = age; 
     this.StreetAddress = streetAddress; 
     this.City = city; 
     this.State = state; 
     this.ZipCode = zipCode; 
    } 

    public string FirstName { get; set; } 
    public string LastName { get; set; } 
    public int Age { get; set; } 
    public string StreetAddress { get; set; } 
    public string City { get; set; } 
    public string State { get; set; } 
    public int ZipCode { get; set; } 
} 

, 두 개의 클래스가이 리팩토링 자체 클래스에 관련 주소 정보를 추출하고 원본 객체의 속성으로 해당 개체를 추가하십시오 :

public class Person 
{ 
    public Person(string firstName, string lastName, int age, Address address) 
    { 
     this.FirstName = firstName; 
     this.LastName = lastName; 
     this.Age = age; 
     this.Address = address; 
    } 

    public string FirstName { get; set; } 
    public string LastName { get; set; } 
    public int Age { get; set; } 
    public Address Address { get; set; } 
} 

public class Address 
{ 
    public Address(string streetAddress, string city, string state, int zipCode) 
    { 
     this.StreetAddress = streetAddress; 
     this.City = city; 
     this.State = state; 
     this.ZipCode = zipCode; 
    } 

    public string StreetAddress { get; set; } 
    public string City { get; set; } 
    public string State { get; set; } 
    public int ZipCode { get; set; } 
} 

더 이상의 정보가 없으면 이것이 최선의 접근이라고 말할 수 있습니다.

+0

Chevex-이게 하위 클래스를 추출하는 데 좋은 생각이지만 문제는 다른 클래스의 그룹 매개 변수가 정확히 얼마나 정확한지 모르겠습니다. – Serghei

+0

당신은 오신 것을 환영합니다. 그리고 저는 이것이 프로젝트의 도메인 전문가와의 경험과 의사 소통을 통해 대답해야 할 질문 일 것이라고 생각합니다. – Chev

1

Builder 패턴

QualificationBuilder builder = new QualificationBuilder(); 
builder.setAchievableCode(achievableCode) 
     .setAchievableTitle(achievableTitle)... 
Qualification = builder.build(); 
+0

이것은 좋은 접근법이지만 20 개의 매개 변수에서 8은 자격 객체를 생성하기위한 필수 필드입니다. 이것이 빌더와 어떻게 구현 되는가? – Serghei

관련 문제