参数列表简洁之道(首创上)

来源:互联网 发布:javascript拼图 编辑:程序博客网 时间:2024/04/30 02:43
                                    (上)
    前言:如果你已经从一个编程小白到入门了,那么任何问题的解决应该只是时间问题,但是作为一个程序员,最重要的就是让自己的代码更规范更易理解,写出十分优秀的代码。而现在的很多入门书籍一上来就已经跟大家强调代码规范的重要性,事实上,在提升自我的道路上能够让一段代码从头到尾都像Google官方文档那样标准是不可能的。那么我们有没有方法来弥补这总总的不足呢?答案是肯定的!
    必需知识点:(已经知道参数为何物的这段可以跳过)
    1.参数列表:当你定义一个函数(方法)时需要在后面的括号中加入一些变量,而这些变量就叫做参数,所以的参数形成一个列表。如:
public void pithyVariable(String name, int age, ImageView me){name = "hlm520";age  =20;me  =new ImageView(this); }

    2.参数的作用域:千万别单纯的让为这些参数只能在这个方法中使用。如果你想让它拥有全局变量的效果,那么就可以在全局变量中定义一个与此参数相同类型的变量,然后在方法中将参数的值传给此变量,这时此参数的"值"就可以像被可以被全局使用了。如:
protected class Whole{Object people[];public void setPeople(Object first,Object second) {people= new Object{first,second} ;//然后你就可以在其他地方使用这个数组啦!  }} 

   3.this的规范/用法:如果参数中存在与全局变量一样的名字的同类型变量,那么在方法中默认是使用参数的数值的。那么当你需要为同名的全局变量赋值或使用同名全局变量的数值时就必须使用this关键字,否则可能造成严重错误。
如何使用:
private String name="hlm2017";void test(String name) {  this.name=name;//将全局变量的值赋为参数的值  test(this.name);//使用全局变量作为次方法的参数输入//注意:这样调用会造成死循环,只是为了说明this的用法,开发时要避免  }

一个错误的代码例子:
public Person wrong(String name,int age,Mother m,Father f,Brother b,Sister s){Person p = (Person)(name+age+m+f+b+s);return p;}

定义这么一个方法的错误做法显而易见,一大堆的参数足以说明你编程能力的低下。
    曾经写一个复杂的功能时一个方法的参数列表多达5、6个参数, 这样是十分想吐的,因为这样既不好记,代码的阅读性也大大降低了。所以如何有效减少方法参数列表数量是优秀程序员的一大重要指标!那我是怎么让它大大缩短的呢?这篇文章就跟大家分析下如何减少参数吧!
重要思想:
1.拆分集成思想  2.Factory思想  3.提取通用思想  4.按需调用思想
一.拆分集成思想:
  简介:所有其他简化思想的基础,主要做到参数的拆分,最后通过一个参数减少2~3倍且逻辑清晰的少参方法进行对象的集成,从而简化参数的定义,代码逻辑增强,便于方法的调用!
  1.明确对象和对象组成
   先以“Person”对象为例,首先知道“人”有名字、年龄,因此生成一个“Me”(我)对象;又可以知道人需要父母“Father,Mother”,因此又生成“Parents”(父母)对象;再者人需要兄弟姐妹“Brother,Sister”,因此生成“Cousins”对象......朋友对象等等。
  2.生成所需的辅助对象
先看一下如何让上面的错误例子纠正,看看能不能从中领悟些什么?_?
public class Person{String name;int age;Father f;Mother m;Brother b;Sister s;//创建自己public Me me(String name,int age) {  this.name=name;  this.age=age;  return new Me(name+age);  }//创建父母public Parent parents(Father f,Mother m) {  this.f=f;  this.m=m;  return new Parent(f,m);  }//创建兄弟姐妹public Cousin cousins(Brother b,Sister s) {  this.b=b;  this.s=s;  return new Cousin(b,s);  }//最后创建一个“人”对象public Person person() {  Person p= new Person( me(name,age)+parents(f,m)+cousins(b,s) );  return p;  }}

  3.所需对象的集成(set/get)
在生成一个Person对象时,我们就可以这样做:
public class MyPerson{Person p=new Person();String name="hlm2017";int age=20;Father f=new Father();Mother m=new Mother();Brother b=new Brother();Sister s=new Sister();//将一个长达6个参数的方法缩短成只需3个具有//具体意义的参数的set(params)方法public void setPerson(Me m,Parents p,Cousins s) {  p.me(name,age);//绑定“Me”对象  p.parents(f,m);//绑定“Parents”对象  p.cousins(b,s);//绑定“Cousins”对象  }//对已集成的“Person”对象的获取public Person getPerson() {  return p.person();  }}

小结:需要知道自己最终需要的是什么,然后就分析这个对象应该具备那些特性,接下来就这些特性进行按类划分,最后间每个分类通过set方法进行集成,最后通过get方法来获得所需的对象。通过这种思想的实现,我们就可以将7、8个甚至更多的参数转化为若干个set方法,在set方法中传入需要的参数使这些参数的意义更加明确,逻辑也更加清晰。

二.Factory思想:
  学过设计思想的童鞋应该就了解Factory设计模式,但我们这里不谈设计,让大家都能更好理解。先看示例再讲解  注解:Employe=雇员
protected class Employe{public Employe(Person p,Job j,Background bg,Technology t,boolean b) {  creatEmploye(p,j,bg,t,b);  }public Employe(Person p,Job j,Background bg,Technology t) {  creatEmploye(p,j,bg,t,true);  }private void createEmploye(Person p,Job j,Background bg,Technology t,boolean b){  if(b=true){//具体代码}  }}public class EmployeFactory{Person person;Job j;public EmployeFactory(Person p,Job j) {  this.person=p;  this.j= j;  }public Employe getEmploye(Background bg,boolean b) {  return new Employe(person,j,bg,b);  }public Employe getEmploye(Background bg) {  return new Employe(person,j,bg,true);  }}

看出来变化没有,没错就是在拆分思想的层次上的一种衍生思想,如何做到的呢?这里我们在上面已经将Person对象进行了参数的简化,这里我们主要是通过Factory思想对一些参数进行合理排列,从而使参数列表变得简洁的。
  1.创建受protected修饰的对象模型,如例Employe
   在这个模型中,我们将一个“雇员”所需的属性都呈现在了参数列表中,但是显然一个列表超过3个参数的对象在编程中是难以接受的。同时提供两个具有不同属性的Employe
  2.创建开放的Factory模型
   所以我们一般不会直接去使用这个Employe模型,而是通过构建一个EmployeFactory对象,这也是Factory思想所在。在这个Factory对象的构造函数中将“雇员”必须的Person与boolean参数传入,这只是一个示例。在开发中如何确定该将哪些参数放到Factory构造函数中呢?这就要根据你当前项目做取舍了,但是一个准则就是:越重要越要放到构造函数中。
  3.根据不同的属性去生成最终对象Employe
   在Factory模型创建之后使用get方法
public Employe getEmploye(Background bg) {  return new Employe(person,j,bg,b);  }

将其他需要的方法参数传入从而得到一个Employe对象(真实想要的对象)。一般来说可以在Employe模型中定义若干个“雇员”类型对应传入不同的参数,然后在EmployeFactory模型中使用不同的get方法来获取到不同的Employe模型。
  4.调用模型
public class test{ Person p; Job b; EmployeFactory ef= new EmployeFactory(p,j); Background bg; public void getModel(){  ef.getEmploye(bg);  ef.getEmploye(bg,true);  }}

小结:使用Factory思想模型主要是在更好的管理参数,将一个对象需要的不同参数进行定义,最终在调用此对象时可以通过Factory模型中的特定方法来实现。

全文总结:由于文章篇幅太长,在这篇文章中,我们先介绍前两种简化参数列表的重要方法(思想):拆分集成/Factory,在后续的文章中我将继续介绍后面两种思想:提取通用/按需调用。想深入学习的童鞋关注本人,随时获得干货。 (本文字数:4436(含示例代码))
    
往期推荐文章:Bitmap使用细则    点击打开
往期推荐资源:android源码           点击打开
1 0
原创粉丝点击