好的API,仁者见仁智者见智。
优秀的API具有几个特征:
1 最小化
每个类中尽量少的公有成员,尽量少的类
2 完整性
3 清晰简单的语义
4 直观
5 便于记忆
6 可读性
Let us go!!!
不是代码越少越好
看下面两段:
QSlider *slider = new QSlider(12, 18, 3, 13, Qt::Vertical,
0, "volume");
QSlider *slider = new QSlider(Qt::Vertical);
slider->setRange(12, 18);
slider->setPageStep(3);
slider->setValue(13);
slider->setObjectName("volume");
很显然,第一段的代码比第二段少了很多,但是读起来很费劲,不够直观。
使用了太多的Bool不一定是好事
看代码:
widget->repaint(false);
上面的代码是什么意思呢?不允许重画对嘛?
那再看:
widget->repaint();
widget->repaint(true);
widget->repaint(false);
是不是懵逼了,上面都是什么意思呢?
更好的办法:
1 不使用bool:
widget->repaint();
widget->repaintWithoutErasing();
2 使用enum代替bool:
str.replace("%USER%", user, false); // Qt 3
str.replace("%USER%", user, Qt::CaseInsensitive); // Qt 4
使用指针还是引用?
void getHsv(int *h, int *s, int *v) const
void getHsv(int &h, int &s, int &v) const
很多时候,我们都会说引用比指针更好。
但是看看使用:
color.getHsv(&h, &s, &v);
color.getHsv(h, s, v);
应该可以看出来,还是第一种,使用指针看上去更容易理解吧!!!
Static Polymorphism
这是个牛逼的,慢慢再详细介绍。
最后,看看QT3 和QT4的对比:
qt3:
class QProgressBar : public QWidget
{
...
public:
int totalSteps() const;
int progress() const;
const QString &progressString() const;
bool percentageVisible() const;
void setPercentageVisible(bool);
void setCenterIndicator(bool on);
bool centerIndicator() const;
void setIndicatorFollowsStyle(bool);
bool indicatorFollowsStyle() const;
public slots:
void reset();
virtual void setTotalSteps(int totalSteps);
virtual void setProgress(int progress);
void setProgress(int progress, int totalSteps);
protected:
virtual bool setIndicator(QString &progressStr,
int progress,
int totalSteps);
...
};
qt4:
class QProgressBar : public QWidget
{
...
public:
void setMinimum(int minimum);
int minimum() const;
void setMaximum(int maximum);
int maximum() const;
void setRange(int minimum, int maximum);
int value() const;
virtual QString text() const;
void setTextVisible(bool visible);
bool isTextVisible() const;
Qt::Alignment alignment() const;
void setAlignment(Qt::Alignment alignment);
public slots:
void reset();
void setValue(int value);
signals:
void valueChanged(int value);
...
};