C++类设计思考(一):状态、查询和命令

        类实例化后的对象是由成员变量和方法组成。各成员变量的当前值构成了对象的状态,当各成员变量的值发生变化时,就有可能由量变发生质变,此时我们认为对象的状态发生了改变。对象的方法分两类,一种是改变对象的值(有可能导致对象状态发生变化),我们称之为命令;一种是不改变对象的值,我们称之为查询。类设计时,需要重点考虑这三者的关系。
        1、尽量保持类的良好状态。
        只要健康的人才能很好的工作,也只有处于良好状态的对象才能高质量地完成各种业务查询功能。无任何时,都应该确保对象处于良好的状态,而不能变成模糊的状态。一个新手常见的例子,当某个命令依序改变对象的多个成员变量值时,其中某一个发生了异常,于是,对象的一部分变量已经得到改变,另一部分则未得到改变,对象的各成员变量变得不再协调和谐,对象进入不良状态。
        2、查询是类设计的核心。
        查询体现对象的价值,在C++中,表现为不带const后缀的成员函数。想象一个打字员,其基本价值是打字,很显然,打字时不会更改他的身高、体重等成员属性值(可能会提高打字技巧)。查询的前提是对象处于良好的工作状态。查询分为业务查询、属性查询、状态查询。业务查询是设计本类的动机,体现对象的核心价值,往往是基于对象的多个变量,综合加工出来的功能;属性查询即简单的查询对象的各个变量的当前值;状态查询则根据对象的各个变量值,判断对象的当前状态。在这些查询方法中,有些没有前提条件,只要对象存在,总是可以执行这些查询函数,在DBC(契约式设计)中,称之为不变式,有些则需要前提条件。
        查询不应该改对象的状态,即下面的断言恒成立
        CObject aObjectSave(aObject);
       aObject.Query();
       assert(aObjectSave==aObject);
       还记得那个笑话吗,我想知道这枚火柴能否是好的,结果你把它点亮;我想知道他是否会游泳,结果你把他丢到海里。
        3、命令必须确保对象的状态良好。
        命令改变对象的成员变量当前值,此时有可能导致对象因量变而发生质变,即从一个状态转化为另一个状态。譬如一个支付命令,就可能导致对象从盈余状态进入到亏损状态。但无论怎样,都必须保证对象进入合理的状态。所以,一个命令的实现的第一句代码,应该是断言对象处于良好的状态,最后一句代码也是如此 ,即DBC中的前条件、后条件。有些命令有一定的前提,譬如支付命令,必须在银行有钱的条件下才能执行,并且支付的金额不得大于银行账户上的钱,所以此时必须提供一个对应的查询函数如CanPay。如:
class CCompany
{
        void Pay(int nSalary)
        {
               assert(HasMoney());
               assert(CanPay(nSalary));
               ...
        }
};

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值