zoukankan      html  css  js  c++  java
  • 关于API设计借鉴

    【摘抄】

    Six Characteristics of Good APIs

    An API is to the programmer what a GUI is to the end-user. The 'P' in API stands for "Programmer", not "Program", to highlight the fact that APIs are used by programmers, who are humans.

    We believe APIs should be minimal and complete, have clear and simple semantics, be intuitive, be easy to memorize, and lead to readable code.

        * Be minimal: A minimal API is one that has as few public members per class and as few classes as possible. This makes it easier to understand, remember, debug, and change the API.
        * Be complete: A complete API means the expected functionality should be there. This can conflict with keeping it minimal. Also, if a member function is in the wrong class, many potential users of the function won't find it.
        * Have clear and simple semantics: As with other design work, you should apply the principle of least surprise. Make common tasks easy. Rare tasks should be possible but not the focus. Solve the specific problem; don't make the solution overly general when this is not needed. (For example, QMimeSourceFactory in Qt 3 could have been called QImageLoader and have a different API.)
        * Be intuitive: As with anything else on a computer, an API should be intuitive. Different experience and background leads to different perceptions on what is intuitive and what isn't. An API is intuitive if a semi-experienced user gets away without reading the documentation, and if a programmer who doesn't know the API can understand code written using it.
        * Be easy to memorize: To make the API easy to remember, choose a consistent and precise naming convention. Use recognizable patterns and concepts, and avoid abbreviations.
        * Lead to readable code: Code is written once, but read (and debugged and changed) many times. Readable code may sometimes take longer to write, but saves time throughout the product's life cycle.

    Finally, keep in mind that different kinds of users will use different parts of the API. While simply using an instance of a Qt class should be intuitive, it's reasonable to expect the user to read the documentation before attempting to subclass it.

    好的API的六个特性

    API是面向程序员的,用来描述提供给最终用户的GUI是什么样子。API中的P带表程序员(Programmer),而不是程序(Program),用来强调API是给程序员用的,给人类的程序员用的。

    我们坚信API应该是最小化且完整的,拥有清晰且简单的语义,直觉化,容易记忆,并且引导人写出易读的代码。

        * 最小化:最小化的API是指一个类尽可能只拥有最少的公开成员且尽可能只拥有最少的类。这个原则可以让API更简单易懂,更好记,更容易除错,且更容易改变。
        * 完整的:完整的API是指要提供所有期望的功能。这个可能与最小化原则相冲突。另外,如果一个成员函数属于一个不应该属于的类,很多潜在的使用者都会找不到这个函数。
        * 拥有清晰且简单的语义:就像其他设计工作一样,你必须遵守最小惊奇原则(the principle of least surprise)。让常见的任务简单易行。不常见的工作可行,但不会让用户过分关注。解决特殊问题时,不要让解决方案没有必要的过度通用。(比如,Qt3中的QMimeSourceFactory可以通过调用QImageLoader来实现不同的API。)
        * 直觉化:就像电脑上的其他东西一样,API必须是直觉化的。不同的经验和背景会导致在判断什么是直觉而什么不是时不同的感觉。如果一个中级用户不读文档就可以使用(a semi-experienced user gets away without reading the documentation,没懂这里的get away该怎么翻译),并且一个程序员不懂API就可以理解缩写的代码,这种API就是直觉化的。
        * 易于记忆:让API易于记忆,使用统一且精确的命名方法。使用可识别的模式和概念,并且避免缩写。
        * 引导易读的代码(Lead to readable code):代码一经写就,会读(并且除错和修改)多次。易读的代码可能会花点时间来写,但是可以节省产品周期中的其他时间。

    最后,记住,不同类型的用户会用到API的不同部分。虽然简单的实例化一个Qt类是非常直觉化的,让资深专家在试图子类化之前读一遍文档,是很合理的。

    来自:

    http://doc.trolltech.com/qq/qq13-apis.html

    http://googollee.blog.163.com/blog/static/1159411200811321030894/

    关于原文中的便利陷阱和布尔参数陷阱值得说明:

    便利陷阱来源于想一次性完成一系列操作的思想,出现的问题是:不利于调用者理解参数实际的意义,不符合最小化操作。建议:一个函数一个操作,提供标准的调用实例。

    比如:


        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");

    从这里可以看出下面一种更容易阅读和使用~

    布尔参数陷阱来源于这样的思考:想让调用者自己设定对应的布尔值,出现的问题是:调用者不能马上知道其布尔值的真实意义。建议用命名方式来解决,如下:

    传统的例子是repaint(),这个函数带有一个布尔参数,来标识是否擦除背景(默认擦除)。这让代码通常写成:

        widget->repaint(false);

    初学者很容易把这句话理解成“别重画”!

    这样做是考虑到布尔参数可以减少一个函数,避免代码膨胀。事实上,这反而增加了代码量。有多少Qt用户真的记住了下面三行程序都是做什么的?

        widget->repaint();
        widget->repaint(true);
        widget->repaint(false);

    一个好一些的API可能看起来是这样:

        widget->repaint();
        widget->repaintWithoutErasing();

    针对布尔参数,能参数明了化就参数明了化,不能就用函数命名来区分~别误导用户的使用~

  • 相关阅读:
    【穿插】Python基础之文件、文件夹的创建,对上一期代码进行优化
    爬虫实战【5】送福利!Python获取妹子图上的内容
    爬虫实战【4】Python获取猫眼电影最受期待榜的50部电影
    爬虫实战【3】Python-如何将html转化为pdf(PdfKit)
    爬虫实战【2】Python博客园-获取某个博主所有文章的URL列表
    爬虫实战【1】使用python爬取博客园的某一篇文章
    Oracle中Lpad函数和Rpad函数的用法
    oracle中如何判断blob类型字段是否为空
    将图片文件转化为字节数组字符串,并对其进行Base64编码处理,以及对字节数组字符串进行Base64解码并生成图片
    oracle中使用函数控制过程是否执行(结合job使用)
  • 原文地址:https://www.cnblogs.com/GoGoagg/p/1970722.html
Copyright © 2011-2022 走看看