STATE

STATE

           对象方便的包装了行为(behavior)和状态(state):前者被暴露给外部世界,后者则为前者提供支持。

状态(State)

           有效管理状态的关键在于:把相似的状态放在一起,确保不同的状态彼此分离。

访问(Access)

           编程语言的二分法之一,就是对“访问存储值”(变量)和“执行计算”(方法)的区分。这两个概念是可以互通的。读取变量的过程可以理解为是通过内存读取方法来返回指定地址数据的过程。

           对象的功能之一就是管理存储空间。每一个对象看起来都有独立的计算环境、拥有自己的一块内存空间,一定程度上与其他的计算环境相隔离。但现在的public字段模糊了对象间的边界。但是这样做会失去对象的独立性。我们要限制状态的访问,从而保持灵活性

直接访问(Direct Access)

           直接访问对象的内部状态。相当于直接访问变量。直接读取或是存储变量,可能过于实现细节了,对阅读理解代码会有一些问题。个人觉得只在小的方法中或是类内部直接处理变量可取,其他情况还是要斟酌一下的。

           比如在for循环中,使用i作为标记是可行的,但是如果用0/1来代表汽车是否发动,直接从变量上可不容易看出来。

间接访问(Indirect Access)

           通过方法来访问状态,从而提高灵活性。在这里Kent给了一个“如何访问状态”的策略,允许在类中直接访问,其他的使用者必须间接访问。

通用状态(Common State)

           把状态保存在字段中,使得该类的所有对象都拥有这些状态。有些全局变量的意思。但需要注意的是,这里要求通用状态要有同样的作用域和生命周期。

可变状态(Variable State)

           如果各个实例拥有不同的状态,那么将这些状态放入一个map,并将map保存在实例变量中。

           可变状态具有很高的灵活度,但是它也存在一个很大的问题就是表意不清晰。要了解需要哪些变量,需要很仔细的阅读代码才行。

           如果我们在实际使用中,遇到了一个字段的状态决定了一个对象中是否需要其他字段,由于所有状态的生命周期同步问题,这种情况下就应当使用可变状态。

外生状态(Extrinsic State)

           将某些特殊用途的状态放入一个map,并由状态的使用者负责保存。这种情况类似于我们有时候使用的xml或是property文件来保存一些状态。

           对于特殊用途的信息,应该保存在使用该信息的地方,而不是保存在对象内部。但是这样的话,代码复制迁移什么的需要严重注意。而且测试也很麻烦。

变量(Variable)

           变量提供了访问状态的命名空间。Kent认为变量名要以简单为好。但是个人觉得,变量名还是要以表达清晰为主。变量名和其作用范围还是有关系的——范围越小变量名应该越短。

           分为3种变量:

1、  局部变量,只能在当前作用域中使用

2、  字段,可以在对象内的任何地方访问,相当于全局变量(通用状态)

3、  静态变量,该类的所有对象都可以访问

局部变量(Local Variable)

           具备变量保存的状态只在单一作用域有效。

字段(Field)

           字段保存的状态在对象的整个生命周期有效。相当于实例变量。就是我们常说的全局变量。

参数(Parameter)

           参数在一个方法被调用之初描述当时的状态。

           除了非私有的变量(字段或是静态字段)之外,要把状态从一个对象传递到另一个对象就只能通过参数了。由于非私有的变量会在类和类之间造成强耦合,而且这种耦合会与日俱增,所以只要有可能,就应该尽量使用参数来传递状态。

           比起从一个对象永久的应用另一个对象,参数带来的耦合要弱得多。当时这个是要分情况的,如果一个对象发送给另一个对象的很多消息都用到了同一个参数,那么更好的办法应该是将该参数永久的交给被调用的对象。

           参数是将对象联系起来的细线,但足够多的细线也能把一个对象束缚起来动弹不得。

收集参数(Collecting Parameter)

           传入一个参数,用于收集来自多个方法的复杂结果。比较经典的用法就是用一个数的二进制来表示对应个数的开关的开闭状态。

可选参数(Selection Parameter)

           参数在不录入值的时候有一个默认值,这样必选参数放在参数列表的前面,随后加上可选参数。Java中可以通过重载来实现类似的功能,但Ruby中堆可选参数定义个很好,可以在定义方法时设置默认参数。

变长参数

           有些方法可以指定任意多个指定类型的参数。Java在1.5及其后的版本中中通过把方法声明为method(Class…classes)来实现。注意变长参数要放在参数列表的最后。

           Java有一个关于变长参数的经典方法,能猜到么?就是main方法,它的String[]参数就是最原始的变长参数。

参数对象(Parameter Object)

           把常用的长参数打包成一个对象。参数应该具有相似性,可以整合的。比如表示位置的(x,y)就可以表示成一个point对象,但是这个point对象的字段都应该是final的,这是由于x,y这里考虑为int型,是基础类型,不可更改;而point对象参数只是一个引用,是可以被通过引用修改堆上的对象本身的,所以在使用的时候要考虑到这些问题。

常量(Constant)

           不变的状态应该保存为常量。常量在命名的时候名字要全部大写。

按角色命名(Role-Suggesting Name)

           根据变量在计算中扮演的角色为它们命名。由于变量的名字被读到的次数要远多于写出的次数,所以在命名时更应该重视可读性,而不是输入的便利。

           命名中最好不要含有类型信息,毕竟现在的语言远不是早期的语言(如:C)能比的。

声明时的类型(declared Type)

           为变量尽可能声明一个通用的类型。当然最好要保证前后变量类型的一直,我们总是把一个list传递给一个collection,会对我们在阅读程序时造成困扰的,我们可以传递list,那么时候可以传递Map呢?所以适用即可,过度的通用,就会丢失我们要真实表达的意图。

初始化(Initialization)

           尽可能以声明性的方式对变量进行初始化。所谓初始化就是在使用变量之前把它们设置到某个已知状态的过程。我们可以在使用前进行初始化也可以在使用时才进行初始化操作。

及早初始化(Eager Initialization)

           在创建实例的同时初始化字段。

延迟初始化(Lazy Initialization)

           如果字段的求值动作开销高昂,可以考虑在第一次使用之前才初始化。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值