23. 引入参数对象
资料参考:https://blog.csdn.net/knightswarrior/article/details/9447815
概念:本文中的“引入参数对象”是指当一个方法的参数过多或者过为复杂时,可以考虑把这些参数封装成一个单独的类。
正文:如果一个方法所需要的参数大于5个,理解该方法的签名就变得比较困难,因为这样感觉参数很长、样式不好并且没有分类,所以我们有必要把参数进行封装。
1 /** 2 * 注册类 3 */ 4 class Registration { 5 /** 6 * 注册 7 * 8 * @param amount 数量 9 * @param student 学生 10 * @param courses 课程列表 11 * @param credits 学分 12 */ 13 public void Create(double amount, Student student, List<Course> courses, double credits) { 14 // doSomething 15 } 16 }
1 /** 2 * 学生类 3 */ 4 class Student { 5 }
1 /** 2 * 课程类 3 */ 4 class Course { 5 }
通常这种情形下创建一个用户传递参数的类是很有帮助的,这会使得代码更容易明白也更灵活,因为当你需要增加参数时,只需要给参数类添加一个属性即可。请注意只有当你发现方法的参数比较多时才应该应用该重构,如果方法的参数比较少,就没有必要应用此重构,因为该重构会增加系统中类的数量,同时也会加大维护负担。所以要看参数情况而定。
重构后的代码如下(Android studio 中可用introduce parameter object来进行重构):
1 /** 2 * 注册类 3 */ 4 class Registration { 5 /** 6 * 注册 7 * 8 * @param registrationContext 注册上下文 9 */ 10 public void Create(RegistrationContext registrationContext) { 11 // doSomething 12 } 13 }
1 /** 2 * 注册上下文类 3 */ 4 public class RegistrationContext { 5 private final double amount; 6 private final Student student; 7 private final List<Course> courses; 8 private final double credits; 9 10 /** 11 * @param amount 数量 12 * @param student 学生 13 * @param courses 课程列表 14 * @param credits 学分 15 */ 16 public RegistrationContext(double amount, Student student, List<Course> courses, double credits) { 17 this.amount = amount; 18 this.student = student; 19 this.courses = courses; 20 this.credits = credits; 21 } 22 23 public double getAmount() { 24 return amount; 25 } 26 27 public Student getStudent() { 28 return student; 29 } 30 31 public List<Course> getCourses() { 32 return courses; 33 } 34 35 public double getCredits() { 36 return credits; 37 } 38 }
总结:这种重构很重要,尤其是当一个方法的参数比较多的时候,不管是大中型项目还是小型项目,都会遇到这种场景,所以建议大家多使用这个重构。