2011-03-03 33 views
7

大家好我在ASP.NET MVC应用程序中的遗留代码有问题, 在这段代码中有一个业务逻辑层的Service类。这个类有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的形式给出,例如我可以提取一些类签名

一个将来自参数:

long area, int subArea 

其他

bool brandingPrefix, long brand, 

,并提取子类,我可以使用引入参数对象我正确理解后?

+4

+1,但什么时候ASP.Net MVC成为传统:) – 2011-03-03 21:58:25

+1

也许他指的遗产以同样的方式迈克尔羽毛确实在他的书[修改代码的工作(见现代解释部分)](http://en.wikipedia.org/wiki/Legacy_code)。 – Matt 2011-03-03 22:11:03

+1

我说遗留代码我的意思是代码是很久以前由其他开发人员编写的代码在ASP.NET MVC应用程序 – Serghei 2011-03-03 22:27:15

回答

14

创建一个对象来保存这20个参数并将该对象传递给该方法。

例如:

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

编辑

虽然这种模式可能是一次重构有用的,如果你发现自己使用相同的参数在多个方法,考虑Chevex's答案。这是更好的方法。

+4

不,这被称为[引入参数对象](http://www.refactoring.com /catalog/introduceParameterObject.html)重构。 – Oded 2011-03-03 22:01:35

+0

我指的是将不同的参数捆绑到一个单独的对象中,但我想不能保证它们都是从OO的角度来看属于同一个对象。 – 2011-03-03 22:04:45

+5

这很愚蠢,因为你必须在一个单独的对象上设置20个参数。这是同样的事情,只是抽象了一下,以便工作与原始对象不同。不要将它们全部捆绑在一起,考虑我确定相关价值并将其分解的答案。国际海事组织这比将所有参数填入参数对象要好。选出可能会一起使用的数据,并将这些数据分别归入自己的对象中。 – Chev 2011-03-03 22:08:34

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 2011-03-03 22:25:24

+0

不客气。我想这将是一个问题,你必须通过与项目领域专家的经验和沟通来回答。 – Chev 2011-03-03 22:46:19

1

使用Builder模式

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

这是一个很好的方法,但从20个参数8是创建资格对象的必填字段。这是如何与构建器一起实现的? – Serghei 2011-03-03 22:47:15