文章目录
- 条款 18:让接口容易被正确使用,不易被误用
- 核心思想
- 如何促进正确使用
- 如何阻止误用
- 特殊案例:`tr1::shared_ptr` 的定制删除器
- 示例代码
- 设计原则总结
条款 18:让接口容易被正确使用,不易被误用
核心思想
- 目标
好的接口设计应该:- 容易正确使用:通过一致性设计和与内置类型行为兼容,帮助用户直观理解并正确使用接口。
- 难以误用:通过引入新类型、限制操作、约束值范围,以及自动化资源管理等方法,减少使用者犯错的可能性。
如何促进正确使用
-
接口的一致性
- 遵循类似标准库的设计习惯。
- 保证同类功能具有相同的使用方式。
-
与内置类型行为兼容
- 让接口的使用与内置类型的操作一致,从而降低学习和使用成本。
如何阻止误用
-
建立新类型
- 为关键数据定义专门类型,避免误用通用类型造成错误。
- 示例:为表示角度的值定义
Angle
类型,而不是使用double
。
-
限制类型上的操作
- 明确控制哪些操作是允许的,禁止无意义或潜在危险的操作。
-
束缚对象值范围
- 利用类的构造函数和成员函数,限制值的有效范围。
-
消除客户的资源管理责任
- 使用 RAII 管理资源,避免手动管理资源引发错误。
特殊案例:tr1::shared_ptr
的定制删除器
-
用途
tr1::shared_ptr
支持自定义删除器(custom deleter),可以用于解决复杂的资源管理问题。 -
应用场景
- 解决 DLL 问题:不同动态库间共享的资源可以通过自定义删除器正确释放。
- 自动解除互斥锁:在使用互斥锁等同步工具时,可以通过自定义删除器实现资源的自动管理。
示例代码
#include <memory> #include <mutex>void customDeleter(std::mutex* m) {m->unlock(); // 自动解锁互斥量delete m; // 释放互斥量 }int main() {std::mutex* mutex = new std::mutex();mutex->lock();std::shared_ptr<std::mutex> spMutex(mutex, customDeleter);// 互斥量会在 spMutex 释放时被自动解锁并释放内存return 0; }
设计原则总结
- 直观性:接口的行为应符合用户的直觉,使其更容易正确使用。
- 防误用:通过类型系统和接口设计强制用户遵守规则,减少错误发生的可能性。
- 自动化管理:使用 RAII 等机制消除手动资源管理的负担,提高代码的健壮性。