This is the eighth in a series of quick how-to articles on ReSharper.
Tip #8 – Extract Class From Parameters
Use: If you find yourself passing a set of related values to a method, you should probably put all of those items into a single class or struct. From JetBrains:
This refactoring creates a new class or struct and converts parameters of the selected method into encapsulated fields of the newly created type (with constructor taking parameters, fields to store values and properties to retrieve values). Usages of parameters are converted to usages of properties of created type.
Before
1: public class EmployeeUtilities
2: {
3: public bool ValidateTerminatedEmployeeInfo(int employeeId
4: , string firstName
5: , string lastName
6: , DateTime hireDate
7: , DateTime terminateDate)
8: {
9: if (employeeId > -1 &&
10: !String.IsNullOrWhiteSpace(firstName) &&
11: !String.IsNullOrWhiteSpace(lastName) &&
12: hireDate < DateTime.Now &&
13: terminateDate > hireDate)
14: {
15: // do awesome stuff
16: return true;
17: }
18:
19: return false;
20: }
21: }
Right-click the method
Extract Class From Parameters
After
1: public class EmployeeInfo
2: {
3: private int _employeeId;
4: private string _firstName;
5: private string _lastName;
6: private DateTime _hireDate;
7: private DateTime _terminateDate;
8:
9: public EmployeeInfo(int employeeId, string firstName, string lastName, DateTime hireDate, DateTime terminateDate)
10: {
11: _employeeId = employeeId;
12: _firstName = firstName;
13: _lastName = lastName;
14: _hireDate = hireDate;
15: _terminateDate = terminateDate;
16: }
17:
18: public int EmployeeId
19: {
20: get { return _employeeId; }
21: }
22:
23: public string FirstName
24: {
25: get { return _firstName; }
26: }
27:
28: public string LastName
29: {
30: get { return _lastName; }
31: }
32:
33: public DateTime HireDate
34: {
35: get { return _hireDate; }
36: }
37:
38: public DateTime TerminateDate
39: {
40: get { return _terminateDate; }
41: }
42: }
43:
44: public class EmployeeUtilities
45: {
46: public bool ValidateTerminatedEmployeeInfo(EmployeeInfo employeeInfo)
47: {
48: if (employeeInfo.EmployeeId > -1 &&
49: !String.IsNullOrWhiteSpace(employeeInfo.FirstName) &&
50: !String.IsNullOrWhiteSpace(employeeInfo.LastName) &&
51: employeeInfo.HireDate < DateTime.Now &&
52: employeeInfo.TerminateDate > employeeInfo.HireDate)
53: {
54: // do awesome stuff
55: return true;
56: }
57:
58: return false;
59: }
60: }
Happy coding!
Of course, you should go further and extract method on that nasty if statment. 😉
private static bool IsAwesomeEnough(EmployeeInfo info)
{
return info.EmployeeId > -1 &&
!String.IsNullOrWhiteSpace(info.FirstName) &&
!String.IsNullOrWhiteSpace(info.LastName) &&
info.HireDate info.HireDate;
}
Ha ha… yes you should. 🙂
Maybe make it a method/property on the EmployeeInfo class.