接口需要传什么参数
例如一个日期类
class Date { public: Date(int month, int day, int year); };
年月日是三个必要数据,不同国家年月日的排列不同。所以这个是有歧义的。解决方法是设计年月日三个类,并且不让隐式转型。
class Month{ public: explicit Month(int m): value(m){} private: int value; }; class Day{ public: explicit Day(int d): value(d){} private: int value; }; class Year{ public: explicit Year(int y): value(y){} private: int value; };
这样虽然可以确定年月日了,但是月和日没有限定,一年只能有12月。可以用下面的方法,让类提供静态方法创建对象。而不让用户自己创建。
class Month { public: static Month Jan() {return Month(1);} private: explicit Month(int m); };
后面还提了很多老生常谈的问题。比如什么接口要求用户必须记得做某些事,就是有着不正确使用倾向之类的。