Effective C++(18) 让接口更容易被正确使用,不易被误用
欲开发一个好的接口,首先必须考虑客户可能做出什么样的错误。
class Date
{
public:
Date(int month, int day, int year);
... ...
};
- 他们也许会以错误的次序传递参数,如:Date d(30, 3, 1995);
- 他们可能传递一个无效的月份或天数,如:Date d(2, 30, 1995);
struct Day {
explicit Day(int d) : val(d) { }
int val;
};
struct Month{
explicit Month (int d) : val(d) { }
int val;
};
struct Year{
explicit Year (int d) : val(d) { }
int val;
};
class Date {
public:
Date(const Month& , const Day& d, const Year& y);
... ...
};
// 使用
Date d(30, 3, 1995); // error,类型错误
Date d(Day(30), Month(3), Year(1995)); // error,类型错误
Date d(Month(3), Day(30), Year(1995));
让types容易被正确使用,不容易被误用。
Inverstment* createInvestment();
std::tr1::shared_ptr<Investment> createInvestment();
//创建一个null shared_ptr指针,并自带一个删除器
std::tr1::shared_ptr<Investment> pInv(0, getRidOfInvestment); // error!第一个参数应该是一个指针,而不是int
// 使用转换cast
std::tr1::shared_ptr<Investment> pInv( static_cast<Investment*>(0), getRidOfInvestment ); // 基于上面的定制的tr1::shared_ptr来解决上面的这个错误倾向
std::tr1::shared_ptr<Investment> createInvestment()
{
std::str1::shared_ptr<Investment> retVal(static_cast<Investment*>(0), getRidOfInvestment);
retVal = ... ; // 令retVal指向正确对象
return retVal;
}
- 好的接口很容易被正确使用,不容易被误用。应该在接口设计时努力打到这点。
- 促进正确使用的办法包括接口的一致性,以及与内置类型的行为兼容
- 阻止误用的办法包括建立新类型、限制类型上的操作,束缚对象值,以及消除客户的资源管理责任。
- tr1::shared_ptr支持定制删除器,这可防范DLL问题,可被用来自动解除互斥锁问题。(Effective C++(14) 在资源管理类中小心copying行为)
Effective C++(18) 让接口更容易被正确使用,不易被误用的更多相关文章
- Effective C++ -----条款18:让接口容易被正确使用,不易被误用
好的接口很容易被正确使用,不容易被误用.你应该在你IDE所有接口中努力达成这些性质. “促进正确使用”的办法包括接口的一致性,以及与内置类型的行为兼容. “阻止误用"的办法包括建立新类型.限 ...
- EC笔记:第4部分:18、接口正确使用,不易被误用
好的接口容易被正确使用,不易被误用 考虑以下函数: void func(int year,int month,int day){ //一些操作 } 这个函数看似合理,因为参数的名字已经暴露了它的用途. ...
- [Effective C++ --018]让接口容易被正确使用,不易被误用
□第一节 什么是接口?什么是接口?百度百科的解释:两个不同系统(或子程序)交接并通过它彼此作用的部分.接口的概念贯穿于整个软件开发过程中,本文讨论的接口概念仅局限于以C++实现的class,funct ...
- 采用ADM2483磁隔离器让RS485接口更简单更安全
采用ADM2483磁隔离器让RS485接口更简单更安全 摘要:本文介绍RS485的特点及应用,指出了普通RS485接口易损坏的问题,针对存在的问题介绍了以ADM2483为核心的磁隔离解决方案. 关键词 ...
- 编写高质量代码改善C#程序的157个建议——建议56:使用继承ISerializable接口更灵活地控制序列化过程
建议56:使用继承ISerializable接口更灵活地控制序列化过程 接口ISerializable的意义在于,如果特性Serializable,以及与其像配套的OnDeserializedAttr ...
- 【转】编写高质量代码改善C#程序的157个建议——建议56:使用继承ISerializable接口更灵活地控制序列化过程
建议56:使用继承ISerializable接口更灵活地控制序列化过程 接口ISerializable的意义在于,如果特性Serializable,以及与其像配套的OnDeserializedAttr ...
- 读书笔记 effective c++ Item 18 使接口容易被正确使用,不容易被误用
1. 什么样的接口才是好的接口 C++中充斥着接口:函数接口,类接口,模板接口.每个接口都是客户同你的代码进行交互的一种方法.假设你正在面对的是一些“讲道理”的人员,这些客户尝试把工作做好,他们希望能 ...
- 使用ICallbackEventHandler接口更高效实现Ajax
使用ICallbackEventHandler接口可以方便地高效地实现Ajax功能 1.处理页面需实现ICallbackEventHandler接口,此接口有两个方法 a.GetCallbackRes ...
- 理解 Delphi 的类(十) - 深入方法[18] - 在接口区声明的方法都相当于提前声明了
//要点18: 如果函数在接口区定义了, 就无需用 forward 提前声明了 unit Unit1; interface uses Windows, Messages, SysUtils, Va ...
随机推荐
- Ansible@一个有效的配置管理工具--Ansible configure management--翻译(四)
不要未经书面许可转载 第三章是长,因为,我会分几个部分来翻译. Advanced Playbooks So far the playbooks that we have looked at are s ...
- ASP.NET MVC5 插件机制中插件的简单实现
Autofac 依赖注入 ASP.NET MVC5 插件机制中插件的简单实现 一.前言 由于项目业务复杂,创建了多个插件并把他们放在了不同的项目中,项目使用AutoFac做的IOC:但是主项目可以注入 ...
- Mencached使用
Mencached使用小记 该文章简单记录一下在Windows平台下安装与配置Memcached的方法,Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载. ...
- 产品 线上 保持 和 支持 服务 (Support and maintenance solutions)
Maintenance and support are the key factors for the smooth functioning of ERP solutions. ERP mainten ...
- C++11实现模板手柄:委托构造函数、defaultkeyword分析
C++11.使用委托构造函数.和高速变量初始化,defaultkeyword重新声明默认构造函数,回答pod状态. 分析与推荐的方法. 到目前为止,VS2012和2013异常声明兼容还是停留在通信代码 ...
- C#如何设置session过期时间
1.操作系统 步骤:开始——〉管理工具——〉Internet信息服务(IIS)管理器——〉网站——〉默认网站——〉 右键“属性”——〉主目录——〉配置——〉选项——〉启用会话状态——〉会话超时(在 ...
- HTML5多图片拖拽上传带进度条
前言 昨天利用css2的clip属性实现了网页进度条觉得还不错,但是很多情况下,我们在那些时候用进度条呢,一般网页加载的时候如果有需要可以用,那么问题就来了,怎么才算整个加载完毕呢,是页面主要模块加载 ...
- cscope的使用
转自:http://easwy.com/blog/archives/advanced-vim-skills-cscope/ 本节所用命令的帮助入口: :help cscope 在前面的文章中介绍了利用 ...
- IOS开发中绘制地图线路
地图应用经常会涉及到线路的绘制问题,ios下可以使用MKMapView进行地图开发,使用 MKOverlayView进行线路的绘制. 使用MKMapView添加MKMap.framework 和Cor ...
- POJ 1182(食物链-另类做法【拆点】)[Template:并查集]
食物链 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 46039 Accepted: 13400 Description ...