之前看过《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类,也是这样设计的。

1482

被折叠的 条评论
为什么被折叠?



