Effective c++学习笔记条款18:让接口容易被正确使用,不易被误用

Effective C++ 第三版 所有条款总结及对应代码描述(纯干货) Effective C++ 第三版 所有条款总结及对应代码描述(纯干货) 阅读详情
Make interfaces easy to use correctly and hard to use incorrectly       
        接口,顾名思义,供别人使用的一些方法。function 接口,class接口,template 接口。。。。每一种接口都是客户与你的代码互动的手段。但是你所设计的接口的好坏,直接导致了被调用产生错误的几率。所以:“容易被正确使用,不容易被误用”的接口的重要性。 下面以书中表现日期的class 设计。
       
          
class myDate

{

public :

    myDate(int month,int day, int year);

    //...
};  

     当调用这个日期类的时候,我们不知道三个参数各个代表了什么,比如
   
myDate md(14,3,2011); 

这样的初始化,是完全错误的,因为没有14个月份。
所以我们要想办法杜绝这种现象的出现。
第一种方法就是导入简单的 wrapper types来区别天数,月份,和年。如
struct myDay 

{

    explicit myDay(int d)

        :val(d){}

    int val;

};


struct myMonth

{

    explicit myMonth(int d)

        :val(d){}

    int val;

};

struct myYear 

{

    explicit myYear(int d)

        :val(d){}

    int val;
}; 


此时,我们的Date类就为


class myDate

{

public :

    myDate(const myMonth & m,const myDay &d,const myYear & y);

    //...
}; 

这个时候,当我们初始化时,
myDate md(14,3,2011); ////会报错

myDate myD(myMonth(3),myDay(3),myYear(2011)); ////////正确

但是,因为一年只有十二个有效月份,所以,我们就预先定义好所有的月份。
struct myMonth

{

public:

    static myMonth jan(){return myMonth(1);}

    static myMonth Feb(){return myMonth(2);}

    static myMonth mar(){return myMonth(3);}

    //.....

    static myMonth Oct(){return myMonth(10);}

    ////....
}; 

当我们初始化时:
myDate myD(myMonth::Feb(),myDay(3),myYear(2011)); 
其他天数,和年份都可以这样。
预防客户出错调用就是利用限制类型表示什么可以做,什么不可以做。常见的就是const修饰。
避免无端与内置类型不兼容,真正的理由是为了提供行为一致的届接口。不一致性很容易导致接口的错误调用。
stl 容器届口十分的一致。每个容器都有名为size的成员函数,返回容器内有多少对象。但是java 就有length和size
很多方法。我之前做过一年的 java 深有体会。
在条款13中,我们学习到了factory函数,缠身一个对象的指针,方便我们对对象的管理,如
Investment* createInvestment();
在资源管理的那个章节,我们知道管理资源的重要性,我们要对指针删除,会出现
忘记删除,删除多次。
所以,我们使用了智能指针。让指针管理。std::tr1::shared_ptr<Investment.createInvestment();
shared_ptr的一个构造函数提供了技术功能,有如下代码:
std::tr1::shared_ptr<Investment> creatInvestment()

{

    std::tr1::shared_ptr<Investment> retVal(static_cast<Investment*>(0),getRidOfInvestment);

    retVal=...;

    retrun retVal;
} 
static_cast<Investment* >(0),强制转换为指针类型。

请记住:
■ 好的接口很容易被正确使用,不容易被误用.你应该在你的所有接口中努力达成这些性质.
■ "促进正确使用"的办法包括接口的一致性,以及与内置类型的行为兼容.
■ "阻止误用"的办法包括建立新类型、限制类型上的操作、束缚对象值以及消除客户的资源管理责任.
■ tr1::shared_ptr支持定制型删除器.这可防范DLL问题,可被用来自动解除互斥锁等等.
LangGraph 中 Human-in-the-loop 摘要:本文探讨了在自主AI Agent系统中实现"人工介入关键节点"(HIL)的技术方案,主要基于LangGraph框架构建。针对Agent可能执行高风险操作(如删除数据库)的问题,提出通过断点机制在关键节点暂停流程,实现人工审批后再继续执行。具体实现包括:(1)使用checkpointer组件持久化状态;(2)通过interrupt_before/after参数设置断点;(3)支持三种交互模式:批准、编辑和输入。文章还提供了代码示例,展示如何在不同场景(如工具调用)中动态触发人工审核机 阅读详情

相关推荐

COMSOL金属氢化物-放氢过程

"层流"的出口设置压降函数,解决“找不到一致的初始值”问题,主要是一开始设置出口为1atm的话,压力场过渡太剧烈,不好找到初始解,要么就先算个稳态流场,这种也能求解。注:P0是根据实测PCT的插值曲线(函数名称为:p_iso)得到的,根据初始质量储氢量wtw0,和初始温度条件T0,然后根据函数p_iso(wtw0)*exp(-deltHd/R_const*(1/T0-1/303.15[K]))求解获得。若"初始步长"选择框不勾上,前面0~5s内的求解容易发散,然后求解失败。2、设置"达西定律"的。

qq_24800941的博客 1930

Effective C++ 学习笔记 条款18 让接口容易被正确使用,不易被误用

Boost的shared_ptr是原始指针的两倍大,以动态分配内存作为簿记用途和“删除器之专属数据”,以virtual形式调用删除器(假如是一个指向派生类的基类指针,也能正确删除所指对象),并在多线程程序修改引用计数时蒙受线程同步化(thread synchronization)的额外开销(只要程序员定义一个预处理器符号就可以关闭多线程支持)。tr1::shared_ptr没有这个问题,因为它缺省的删除器是来自“tr1::shared_ptr诞生所在的那个DLL”的delete。限制上例类型的值是合理的。

tus00000的博客 856

基于一维卷积神经网络对机械振动信号进行分类并加以预测

基于一维卷积神经网络对机械振动信号进行分类并加以预测 *使用一维卷积神经网络训练振动信号进行二分类 2020年7月16日,一学期没等到开学,然而又放假了。 总览优快云中大多数卷积神经网络都是对二维图片进行分类的,而图片也都是常见的猫狗分类,minst手写数字分类。一维卷积神经网络的使用非常少见,有也是IDMB情感分类,和鸢尾花分类的。 作者研究生就读于河北一所双飞,全国排名270多,哈哈哈,不吹不黑。 在网上翻来翻去找不到一篇可以利用的代码去研究我的机械故障诊断,后来在无奈下到某宝搜寻到一段代码,可以利用

qq_45714906的博客 1万+

《Effective C++》学习笔记(条款18:让接口容易被正确使用,不易被误用)

最近开始看《Effective C++》,为了方便以后回顾,特意做了笔记。若本人对书中的知识点理解有误的话,望请指正!!! 设计一个好接口必须遵守三条规则: 必须考虑用户可能做出什么样的错误 要把接口设计得一致 不要要求用户记得必须做某事 必须考虑用户可能做出什么样的错误: 欲开发一个”容易被正确使用,不容易被误用“的接口,首先必须考虑用户可能做出什么样的错误。假设你为一个用来表现日期的类设计构造函数: class Date{ public: Date(int month, int day, i

ZLX的博客 237

三维重建Fusion中的TSDF算法通俗描述

看个视频 https://www.youtube.com/watch?v=8M_-lSYqACo 这是mobilefusion的视频,大家先了解一下,看到在三维重建的时候外面有个长方体包围盒了吗? 数据准备: 我们不同角度拍摄的RGB图、深度图和相应的pose.txt。 步骤: 1.建立长方体包围盒 要建立一个长方体包围盒。让所有的三维点都在这个长方体里面。 假设z方向垂直相机。 很明显,x,y方...

qq_30339595的博客 1万+

模型剪枝实战 | Torch-Pruning 库在YOLOv8上的应用指南

本文详细介绍了如何使用Torch-Pruning库对YOLOv8模型进行结构化剪枝,以实现模型“瘦身”。通过DepGraph(依赖图)技术自动处理层间依赖,确保剪枝安全。文章提供了从环境搭建、核心原理理解到完整剪枝流程的实战指南,并强调了剪枝后的微调与性能评估,帮助开发者在保持精度的同时显著提升模型推理速度。

weixin_29046035的博客 503

《Effective C++》学习笔记条款18 让接口容易被正确使用,不易被误用

让接口容易被正确使用,不易被误用

UE引擎开发工程师 1304

57. SAP UI5 应用基于 OData 注解的 Smart Field 使用方法学习

所谓 SAP UI5 Smart Field,顾名思义,是一类比较`智能`的控件,这类控件同 SAP UI5 传统的控件不同,会根据 SAP UI5 应用程序连接的 OData 服务中元数据里提供的注解(`annotations`),在运行时动态生成底层的 SAP UI5 控件。...

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 2771

[Effective C++]条款18 设计正确易用的接口

C++在接口之海漂浮, 一个好的接口很容易被正确使用, 不容易被误用.条款18其实是一个很宏观的条款, 让接口变得正确易用, 简单来说就是"促进正确使用"和"阻止误用".

tianmu_sama的博客 1953

性能调优秘籍——让OpenClaw运行速度提升10倍(2026优化版)

OpenClaw性能优化核心摘要 本文详细介绍了提升OpenClaw系统性能的关键技术,包括: 使用性能分析器进行代码级性能诊断 内存优化与高效缓存策略 并发处理优化技术 数据库查询性能提升方法 重点内容包括: 全面的性能分析工具实现(计时、内存监控、错误跟踪) 自动生成性能报告和优化建议 操作耗时与内存占用分析算法 关键性能指标(平均耗时、内存增长)计算 通过系统性的性能分析优化,可使OpenClaw运行速度提升10倍以上。

博客 903

YOLOv11改进 | Conv改进篇 | 含2种改进,引入DynamicConv替换普通Conv卷积下采样和C3k2_DynamicConv替换C3k2(来自CVPR2024)

本文提出了一种基于DynamicConv动态卷积优化的YOLOv11轻量化模型改进方案。通过引入多专家机制的动态卷积模块,在增加模型参数量的同时保持较低的计算复杂度(FLOPs),有效解决了低FLOPs模型在大规模预训练中的性能瓶颈问题。文章详细介绍了动态卷积的工作原理、核心代码实现,并提供了在YOLOv11中集成DynamicConv和C3k2_GhostModule_DynamicConv模块的完整教程,包括模块添加、配置文件修改和模型训练验证过程。实验结果表明,该方案在保持高效推理速度的同时显著提升了

Ai缝合怪、助力小伙伴高效发论文 537

《Effective C++》《设计与声明——18、让接口容易被正确使用,不易被误用》

18、让接口容易被正确使用,不易被误用

zwh1298454060的博客 1466

行测测评——矩阵、圆形、环形三角图形数列推理解题技巧

写在前面:各大公司的测评做的让人眼花缭乱,很多题型都是第一次见,比如逻辑关系、信息推理,最难的要属找规律的数字推理了。根据B站UP主刘文超老师的课程,记录一下解题技巧。感谢UP主的无私奉献,原地址连接:https://www.bilibili.com/video/BV1it411M7o2?t=528&p=7 解题技巧: 从图形的上下、左右、交叉 角度进行尝试求解 基本法则是“加、减、乘、除、倍数、次方”六种形态。 一、有心数阵 解题技巧:周边数字通过某种运算得到中间数字 1.周边数..

涵盖了计算机专业基础知识、数学建模相关实践、复杂网络论文研究、LeetCode算法刷题经验、C语言开发经验、前端Vue、React框架开发实战相关知识 8643

【effective c++】条款十八:让接口容易被正确使用,不易被误用

摘要: Effective C++条款18强调设计接口时应使其易于正确使用且难以误用。关键策略包括:1) 促进正确使用:保持接口一致性(如STL的.size()),兼容内置类型行为;2) 防止误用:通过建立包装类型(如Month/Day)、限制操作(const返回值)、约束取值范围(静态工厂函数)等利用类型系统捕获错误;3) 资源管理:使用智能指针(如shared_ptr)转移责任,支持定制删除器解决跨DLL释放和互斥锁管理。现代C++的enum class、explicit和概念(Concepts)进一步

maybe_Tian_Xia的博客 739

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Effective C++条款18:让接口容易被正确使用,不容易被误用

Effective C++条款18:让接口容易被正确使用,不容易被误用(Make interfaces easy to use correctly and hard to use incorrectly)

CltCj的博客 915

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

Effective C++ 条款18:让接口容易被正确使用,不易被误用

深入探讨 C++ 接口设计的核心原则,从促进正确使用和阻止误用两个维度,解析如何通过类型系统、约束设计和一致性原则打造健壮的 API。

凡人叶枫的博客 262

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

【穿越Effective C++】条款18:让接口容易被正确使用,不易被误用——API设计的艺术与科学

这个条款揭示了优秀软件设计的核心哲学:优秀的接口应该引导用户走向正确用法,同时让错误用法在编译期或运行期难以发生。这是构建可维护、可扩展软件系统的基石。

沐怡旸的专栏 1022

Effective C++ 条款 18:让接口容易被正确使用,不易被误用

直观性:接口的行为应符合用户的直觉,使其更容易正确使用。防误用:通过类型系统和接口设计强制用户遵守规则,减少错误发生的可能性。自动化管理:使用 RAII 等机制消除手动资源管理的负担,提高代码的健壮性。

weixin_42255569的博客 575

《Effective C++》Item18:让接口容易被正确使用,不易被误用

C++中充满了接口:function接口、class接口、template接口等,每一种接口都是客户与我们的代码互动的手段。假设我们面对的是一群“讲道理”的人,这部分客户希望能够正确地使用我们提供的借口。在这种情况下,如果它们对其中的任何一个接口的用法不正确,那么我们作为接口的设计者,也应该承担一些连带的责任。因为理论上,如果客户企图使用某个接口,但是却没有实现他所预期的行为,那么这段代码就不应该通过编译;反过来说,只要代码通过了编译,那么程序的行为就应该是用户所期望的那样。 想要开发一个“容易被正确使用、

ZKY1998的博客 315

《Effective C++》学习笔记——条款18

《Effective C++》学习笔记——条款18:让接口容易被正确使用,不易被误用

继续激情,继续奋斗。 1438

Effective C++ 条款18_让接口容易被正确使用,不易被误用_不止于此

Make interfaces easy to use correctly and hard to use incorrectly C++ 在接口之海漂浮。function 接口、class 接口、template 接口…每一种接口都是客户与你的代码互动的手段。 理想上,如果客户企图使用某个接口而却没有获得他所预期的行为,这个代码不应该通过编译;如果代码通过了编译,它的作为就该是客户想要的。 欲开发一个 “ 容易被正确使用,不容易被误用 ” 的接口,首先必须考虑客户可能做出什么样的错误。假设你为一个用来表示

嘟嘟的博客 204

Effective C++条款18:让接口容易被正确使用,不易被误用

假如有这样的类: class Date { public: Date(int month, int day, int year); ... } 看起来这个接口没错,但是很容易犯下至少两个错误: Date d(30,3,2019);//错误的次序 Date d(2,30,1995);//应该是3,30,而不是2,30 我们可以通过导入新类型来获得预防比如: struct Day { int...

qq_44800780的博客 213

Effective C++条款18——让接口容易被正确使用,不易被误用(设计与声明)

tr1::shared_ptr有一个特别好的性质是:它会自动使用它的“每个指针专属的删除器”,因而消除另一个潜在的客户错误:所谓的"cross-DLL problem"。tr1::shared _ptr没有这个问题,因为它缺省的删除器是来自“tr1::shared ptr诞生所在的那个DLL”的delete。所谓软件设计,是“令软件做出你希望它做的事情”的步骤和做法,通常以颇为一般性的构想开始,最终演变成十足的细节,以允许特殊接口( interfaces)的开发。是的,一旦怀疑,就请拿ints做范本。

StudyWinter的博客 394

Effective C++ T18:让接口容易被正确使用,不易被误用

1. 好的接口很容易被正确使用,不容易被误用。你应该在你的所有接口中努力达成这些性质。 2. “促进正确使用”的办法包括接口的一致性,以及与内存类型的行为兼容。 3. “阻止误用”的办法包括建立新类型、限制类型上的操作,束缚对象值,以及消除客户的资源管理责任。 4. shared_ptr支持定制型删除器。这可防范DLL问题,可被用来自动解除互斥锁等等。

Ref.Ptr.的博客 366

Effective C++之条款18:让接口容易被正确使用,不容易被误用

声明: 文中内容收集整理自《Effective C++(中文版)第三版》,版权归原书所有。 本内容在作者现有能力的基础上有所删减,另加入部分作者自己的理解,有纰漏之处敬请指正。 条款18:让接口容易被正确使用,不容易被误用 Make interfaces easy to use correctly and hard to use incorrectly. 直接进入正题。 一个一般性准则“...

HakunaMatata的博客 264
上一篇: C++语言代码检查工具PC-Lint简介
下一篇: Effective c++学习笔记条款20:宁以 pass-by-reference-to-const替换pass-by-value
ctreewang
博客等级 码龄16年 1608粉丝 276原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值