设计 Qt-Style C++ API

来源:互联网 发布:如何在淘宝上申请直播 编辑:程序博客网 时间:2024/06/06 14:26

好的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);        ...    };
3 0