设计 Qt-Style C++ API

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

你可能感兴趣的:(qt)