每个人我都对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 aproach例如我可以提取一些类
一个来自参数:
long area, int subArea
其他
bool brandingPrefix, long brand,
在提取子类之后我可以使用引入参数对象我正确理解了吗?
答案 0 :(得分:14)
创建一个对象来保存这20个参数并将该对象传递给该方法。
例如:
public void MyMethod(MyArguments args)
{
// do stuff
}
修改强>
虽然这种模式对于一次性重构可能很有用,但如果您发现自己在多种方法中使用相同的参数,请考虑Chevex's回答。这是更好的方法。
答案 1 :(得分:14)
您可能会尝试识别参数中的相关数据,并将它们计入自己的自定义对象中。例如,假装你有这个对象:
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; }
}
如果没有更多信息,我会说这是你最好的方法。
答案 2 :(得分:1)
使用Builder模式
QualificationBuilder builder = new QualificationBuilder();
builder.setAchievableCode(achievableCode)
.setAchievableTitle(achievableTitle)...
Qualification = builder.build();