阅读《Effective C++》的感悟

之前看过《Effective C++》这本书,对书中的内容印象较深刻,作者提供了很多对软件开发和设计非常有帮助的建议。最近第二次再次研读这本经典的著作,阅读到其中的一些内容时会联系到自身工作中的方案设计,结合自身的工作经验将一些感悟记录下来。

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

这是原书第18条,当我们在设计一个类的时候,可能会提供一些接口给其他人使用(这里的其他人指的是使用你写的代码的其他开发人员),这个时候我们会思考,应该将接口设计成什么样的才是合理的?包括接口的命名、传递的参数类型、参数个数、参数的顺序,返回值类型,不同的返回值意义的等等。这些都是接口设计者需要考虑的。

首先我们应该站在客户(也就是使用这个接口的人)的角度来思考,客户会犯什么样的错误,假设你为一个来用表现日期的类设计构造函数:

class Date
{
public:
    Date(int months, int day, int years);
}

初看这个接口同情合理,但是客户使用这个接口很容易犯下面的错误:

第一,他们也许会以错误的次序传递参数:

Date d(30, 3, 2019); // 他们的本意是2019.3.30,结果却是2019.30.3

第二,他们可能传递一个无效的月份或天数

Date d(2, 30, 2019);// 应该是3.30,而不是2.30

许多客户端错误可以因为导入新类型而获得预防,通过导入简单的外覆类型(wrapper types)来区别天数、月份和年份,然后于Date构造函数中使用这些类型。

struct Day 
{
    explict Day(int d):val(d)
    { 
    }

    int val;
}

struct Month 
{
    explict Month (int m):val(m)
    { 
    }

    int val;
}

struct Year
{
    explict Year(int y):val(y)
    { 
    }

    int val;
}

class Date
{
public:
    Date(const Months& months, const Day& day, const Year& years);
}

Date d(30, 3, 2019); // 错误,不正确的类型
Date d(Day(30), Month(3), Year(2019)); // 错误,不正确的类型
Date d(Month(3), Day(30), Year(2019)); // 正确

一个很好的例子就是Qt中的QDate类,也是这样设计的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值