改善程序与设计的55个具体做法 day7
条款18:让接口容易被正确使用,不易被误用
这里说的接口是广义上的接口,即包括但不限于函数接口、类接口、template接口等,每一种接口都是客户与你的代码进行交互的手段。
我们对客户的所谓“资质或水平”做出假设或要求,因此面对不同的客户,需要接口在形式上有足够的易用性以及足够的不被误用性。
e.g.
CDate(int year, int month, int day)
该类CDate的构造函数为三个int参数,分别代表年月日。客户在使用的时候很容易用错,比如写错顺序、写的日期不合法等,比较好的做法是对接口的形式有足够的限制,比如
CDate(const CYear& year, const CMonth& month, const CDay& day),
其中对CMonth的使用可以预定义:
class CMonth
{
public:
CMonth(int m);
static CMonth Jan(){ return CMonth(1); }
// ...
static CMonth Nov(){ return CMonth(12); }
}
另,接口中使用的类型要与内置类型一致,即【除非有好理由,否则应该尽量令你的types的行为与内置types一致】。
任何接口如果要求客户必须记得做某些事情,就是有着【不正确使用】的倾向,因为客户可能会忘记做那件事。
e.g.
函数声明
令
CBase* CreateObj();
std::tr1::shared_ptr<CBase> ptr(CreateObj());
为
std::tr1::shared_ptr<CBase> CreateObj();
std::tr1::shared_ptr 有一个特别好的性质是:它会自动使用它的【每个指针专属的删除器】,因为消除另一个潜在的客户错误:所谓的【Cross DLL problem】。这个问题发生于【对象在DLL中被new创建,却在另一个DLL内被delete销毁】。
而std::tr1::shared_ptr没有这个问题,它的缺省的删除器是来自【std::tr1::shared_ptr诞生所在的那个DLL】的deleter。
e.g.
std::tr1::shared_ptr<CBase> CreateObj()
{
return std::tr1::shared_ptr<CBase>(new CDerived);
}
返回的指针可以被传递给任何其他DLLs,而无需在意【Cross DLL problem】。
条款19:设计class犹如设计type
即设计类犹如设计类型。
设计一个C++类,就是设计一个新的C++类型。
而一个新的类型的设计,需要回答面对几个规范的设计:
a 新的type的对象应该如何被创建和销毁
b 对象的初始化和对象的赋值有什么样的差别
c 新的type的对象如果被值传递,意味着什么
d 什么是新的type的【合法值】?
e 新的type需要配合某个继承图系吗?
f 新的type需要什么样的转化?
g 什么样的操作符和函数对此新type而言是合理的?
h 什么样的标准函数应该驳回? 即那些被声明为private的
i 谁该取用新type的成员? 即哪些是public protected pricate的
j 什么是新type的【未声明接口】?
k 新type有多么一般化? 即定义了一个type还是一个types族? 如果当真如此就应该使用class template代替这些types
l 你真的需要一个新type吗? 如果只是定义新的派生类,说不定添加几个 non-member 函数 或 template就可以达到目标。
改善程序与设计的55个具体做法 day7的更多相关文章
- 改善程序与设计的55个具体做法 day9
条款23:宁以non-member.non-friend替换member函数 即 以非成员函数 非友元函数 替换成员函数. 直观上,面向对象应该尽可能的封装,封装数据.封装操作等等,所以这个条款可能有 ...
- 改善程序与设计的55个具体做法 day3
条款07:为多态基类声明virtual析构函数 任何一本C++语法教材上都会讲这一点(如果没讲,扔掉它),这么做到原因是可以让delete pBase操作能够正确的执行子类的析构函数. 需要说明的是当 ...
- 改善程序与设计的55个具体做法 day8
条款20:宁以pass-by-reference-to-const 替换 pass-by-value 即 以const引用 替换值传递. 采用引用传递参数时,底层往往是用指针方式实现,因此参数传递内置 ...
- 改善程序与设计的55个具体做法 day6
条款13:以对象管理资源 资源,包括但不限于内存.句柄.GDI对象.数据库连接等. 内存要记得释放,句柄要记得closehandle, GDI对象要记得删除,数据库连接要记得关闭,等等等等. 以对象来 ...
- 改善程序与设计的55个具体做法 day5
条款12:复制对象时勿忘其每一个成分 这里的复制是拷贝构造和operator= 每一个成分有几个维度: 1.每个成员变量 这个很好理解,添加新的成员时也要记得为每个新添加的成员执行合适的复制操作 2. ...
- 改善程序与设计的55个具体做法 day4
今天晚上回到小区门口,买了点冬枣,要结账的时候想起来,钥匙没带,落公司了! TNND,没办法再回趟公司,拿了钥匙,来回一个小时,汗~ 条款10:令operator=返回一个reference to * ...
- 改善程序与设计的55个具体做法 day2
条款05:了解C++默默编写并调用哪些函数 如果没有为类定义构造函数.析构函数.拷贝构造函数.重载赋值操作符,并且这些函数被需要(调用)时,编译器会为类生成默认的函数,而这些函数是public inl ...
- 改善程序与设计的55个具体做法 day1
博客好久没更新了,就从这本读书笔记开始吧. 条款01: 视C++为一个语言联邦 C++可视为有四个次语言组成的: 1.C语言 2.Object-Oriented C++ (面向对象C++) 3.Tem ...
- 重构HTML改善web应用设计
本文从良构,有效性,布局三个角度,结合往日项目开发经历, 整理总结重构HTML改善Web应用设计的几点规则和做法.部分参考自<重构HTML改善Web应用设计>. 重构.什么是重构?为什么要 ...
随机推荐
- Python全栈之路--Django ORM详解
ORM:(在django中,根据代码中的类自动生成数据库的表也叫--code first) ORM:Object Relational Mapping(关系对象映射) 我们写的类表示数据库中的表 我们 ...
- Google Chrome 35 Released – Install on RHEL/CentOS 6 and Fedora 20-15
Google Chrome is a freeware web browser developed by Google Inc. Google Chrome team proudly announce ...
- C++ 模板详解(二)(转)
四.类模板的默认模板类型形参 1.可以为类模板的类型形参提供默认值,但不能为函数模板的类型形参提供默认值.函数模板和类模板都可以为模板的非类型形参提供默认值. 2.类模板的类型形参默认值形式为:tem ...
- java统计中英文字数 Java问题通用解决代码
http://yangchao20020.blog.163.com/blog/static/483822472011111635424751/ 这个不适用于新浪微博字数的统计,结果有差别,若需要可 ...
- 【Java并发编程】并发编程大合集
转载自:http://blog.csdn.net/ns_code/article/details/17539599 为了方便各位网友学习以及方便自己复习之用,将Java并发编程系列内容系列内容按照由浅 ...
- warning: push.default is unset; its implicit value is changing in Git 2.0 from 'matching' to 'simple'.
'matching'参数是 git 1.x 的默认行为,其意是如果你执行 git push 但没有指定分支,它将 push 所有你本地的分支到远程仓库中对应匹配的分支. 而 Git 2.x 默认的是 ...
- nginx http proxy 正向代理
配置 Nginx Http Proxy 代理服务器,与 [Squid] 功能一样,适用于正向代理 Http 网站. 一,Nginx 正向代理配置文件: server { resolver 8.8.8. ...
- PlSql加入数据库链接
Oracle-OraDb10g_home2 -> 配置和移植工具 -> net Manager -> 本地 -> 服务命名 -> 加入(网络服务名自己命名,主机名:要 ...
- python 求下个月的最后一天
[1]根据当前月求上个月.下个月的最后一天 (1)求当前月最后一天 (2)求前一个月的最后一天 (3)求下一个月的最后一天 学习示例与应用实例,代码如下: #!/usr/bin/python3 #-* ...
- 44.Android MD5Util
44.Android MD5Util public class MD5Util { public static String getMD5String(String key) { char hexDi ...