设计 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);
        ...
    };
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一苇渡江694

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值