使用嵌套类来清晰化类接口,分离扩展操作和扩展查询。

6 篇文章 0 订阅

《design by contract》中除了介绍了Eiffel 语言,引入了前置条件,后置条件,不变量外。提出了基本操作,基本查询,扩展操作,扩展查询的概念。

《effective c++》中也提到应该把扩展查询的成员函数替换为非成员函数。理由是为了较低的编译依赖性,较好的可延伸性,以及较高的封装性。

其实,Scott Meyers就是说把扩展查询放到类的外部去,作为一个utility 函数或类来使用。

我能理解他说的话,区别基本查询和扩展查询的确可以纯化类的接口,把把我们从大量的类方法记忆中解放出来。但我不愿意把原先对于一个类的使用变成了一个类加多个utility 方法或再加一个utility 类。至少我需要记忆的更多了,而且IDE 的智能提示功能似乎也用不上了。

最好,能得了便宜又可以卖乖。

那把utility 直接放到类里,声明成nested class,虽然没有较低的编译依赖性,但的确可以知道并选择使用扩展查询了。当然,这种方法肯定不是Scott Meyers 建议的。

 

class  Act
{
public:
 Act():_(
*this){}
 
void clearText();
 
void clearIcon();

 
class Util{
  
public:
  Util(Act
& a):owner(a){}
   
void clearAll(){
     owner.clearText();
     owner.clearIcon();
   }

  
private:
   Act
& owner;
 }
 _;
}
;

 

其中clearAll 是扩展操作,调用了基本操作clearText() and clearIcon().

这样,对Act 的直接操作都是基本操作和基本查询:act.clearText();

如果使用扩展查询则使用: act._.clearAll();

最好的是,IDE自动提示功能可以用了。呵呵。

没有技术含量的文章,纯粹自娱自乐。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值