突然好想写篇散文,可是脑子里筹集的都是些技术性文字。工作所需,那就顺手组织一下吧。
C++封装成员的访问控制
封装往往生成一个类型,可以是个union,struct/class;C++所有定义都会存在应用范围,这个被我们称作作用域概念始终都影响着我们的编译链接工作;以往C原始只有三个作用域概念,文件域,全局域,局部区域;C++在此基础上,加上命名的特性,那就告诉我们更方便的组织我们代码单元与粒度控制;除了namespace, 凡事有定义范围的,有命名都是个名字域。值得强调的概念就是Scope约束作用。
成员修饰
public:
对外公开,可通过域名访问或对象访问;
protected:
限制在类属范围内可访问;这就要求是所在类范围或该类的扩展范围;
private:
完全受限于该类定义范围。
扩展控制
public:
继承成员的修饰特性不变;
protected:
继承成员中除了private成员其他都变更为类属保护范围;
private:
继承成员的修饰特性都锁定为private。
PIMPL模式
私有实现模式,是提高工程编译效率的一种办法。提供编译效率,首先就要隔离名字污染,减少编译器的范围辨别的负荷。
这种模式只适用于明确的稳定可靠的OO设计方案,如果不可靠不稳定,接口文件变来变去,不断改版,那这种模式不适于工作,因为私有实现必然引用不少量的中间代码,这个工作量大了就不可无视。所以要求设计者有成熟的OO设计能力。OO设计的本质就是构建一个易理解的可动作的流程模型,所以说不能控制范围不能把握视角的人不要在大家面前谈设计。
往往为了隔离,我们看到的封装体是这样的;
// target.h interface ITarget; class CTarget : private ITarget { public: CTarget(...); // 代理模式 ... private: ITarget* p; }
// target.cpp struct PImpl : ITarget { /* data */ ... }; // PImpl, Private Implementation ... CTarget::CTarget(...) { p = new PImpl;// 准备实际对象 }
这样,这个隔离了实现与接口声明两块内容。实现部分已经限定在目标cpp内部,一个cpp就是编译单元。
C# partial 关键字
这个关键字出现在C#语言特性中,表示一个封装体,可以分成多部分声明。这太棒了,这教我们更易于分离关注点,信息量的分类控制与完整功能的聚合。
设想,如果C++有一天支持这样的特性。对我们有什么要什么样的益处?
有了部分声明的支持,那对于封装私有那部分我就完全不必要声明在接口文件中了,当然除了数据成员,数据成员分割那C++就不是C++,因为sizeof是个编译期运算,一个类型在数据结构上必须是完整的。这样才能计算他的尺寸。
当然说,允许分离是不错的特性,不过编译器需要考虑的类属关系,因为virtual关键字,对于偏移量是需要编译推算。因此说只要类属多态的虚函数是必须声明在.h中的。
保留记录
位操作
设置位:OR
排除位:XOR
检测位:AND
代码品质
就近声明原则
最小依赖规范
两句话
通过着装与打扮,观察一个人的品味与风格;
通过举止与谈吐,把握一个人的性情与动态;