Coding style 您所见过的一个相对知名的库的最丑陋的API是什么?为什么以及如何改进它?

Coding style 您所见过的一个相对知名的库的最丑陋的API是什么?为什么以及如何改进它?,coding-style,code-readability,Coding Style,Code Readability,我一直在研究Lucene 2.9(特别是redone tokenstream API)之间的差异,我突然想到,与旧的相比,它特别难看。如果您重用所述令牌,只需返回一个新的或重新填充给定的值 我没有做过任何分析,但使用映射来存储属性似乎没有那么有效,只需创建一个新的值类型来保存值等就更容易了。令牌流和属性内容看起来像对象池,这在如今对于简单的值类型(如文本令牌)来说几乎是不必要的。,大约20年前,它是一个著名的库,但我认为原始的btrieve数据引擎具有有史以来最差的api。几乎所有的东西都要经过

我一直在研究Lucene 2.9(特别是redone tokenstream API)之间的差异,我突然想到,与旧的相比,它特别难看。如果您重用所述令牌,只需返回一个新的或重新填充给定的值


我没有做过任何分析,但使用映射来存储属性似乎没有那么有效,只需创建一个新的值类型来保存值等就更容易了。令牌流和属性内容看起来像对象池,这在如今对于简单的值类型(如文本令牌)来说几乎是不必要的。

,大约20年前,它是一个著名的库,但我认为原始的btrieve数据引擎具有有史以来最差的api。几乎所有的东西都要经过一次调用,它的许多参数中的每一个都包含不同的值,这取决于您实际执行的调用(其中一个参数是一个标志,告诉系统您是否要打开文件、关闭文件、搜索、插入等)。当时我很喜欢btrieve,但我花了很长时间制作了一个好的抽象层

如果不将所有内容都强制到一个调用中,则可以很容易地进行改进。不仅一个调用很可怕,而且程序员还负责分配、传递和释放位置块。。。btrieve用于跟踪打开的文件句柄、位置等的一些内存。另一个改进是允许在定义索引时使用ascii文本。索引必须由卷积的二进制表示指定

致以最良好的祝愿,
不要做最丑的人。可能有这么多,但Flex在地狱里有一个特殊的位置。特别是与雪碧相比,它感觉就像用链锯削苹果皮。我相信,如果使用更轻量级的对象和类似于Dojo在Javascript端工作的mixin风格的特性,Flex将会得到很大的改进

ECMAScript/Actionscript日期类几乎是向后的,毫无用处。每当我需要做一些比在日志中添加时间戳更复杂的事情时,我总是感到痛苦。他们需要更多的解析选项(例如,指定输入格式的能力)和更好的时间管理,如智能增量、方便功能等


C++STL库(以及一般的模板)虽然显然很有用,但总感觉很难看。但是没有改进的建议。他们工作

某些对系统编程至关重要的
java.io.File
方法返回布尔值以指示成功或失败。如果这种方法(例如,
mkdir
delete
)失败,您根本无法找到原因


这总是让我的下巴张开。

我从来都不是java.sql包的粉丝

  • 您必须捕获所有内容的已检查异常,并且只有一个异常,因此在不检查SQL代码字符串的情况下,它不会给出任何错误指示
  • 此外,还必须使用java.sql.Date而不是java.util.Data,因此必须始终为其中一个指定完整的包。更不用说两者之间的转换了
  • 然后是参数索引,它是1-base-indexed,而不是Java的其余部分,它是0-base-indexed

  • 总而言之,这是一个相当烦人的图书馆。谢天谢地,Spring库确实使它的使用变得更加容易。

    许多CRT库函数的命名很差或含糊不清,这可能是因为当时遗留的编码限制,因此需要经常使用F1键才能找到正确的函数并提供正确的参数


    我使用CRT功能已经有一段时间了,但我仍然发现自己在F1上的成绩相当不错。

    COM。它最大的改进是.NET。

    create()

    当肯·汤普森和丹尼斯·里奇在各自的获奖演讲后获得1983年图灵奖时,听众中有人问肯,如果他能重来一次,他会对Unix做些什么不同的事情。他说:“我会把‘creat’拼写成‘e’。”


    我会说MFC,ATL和WTL。所有这3个库都使用了过多的匈牙利符号,无缘无故地重新定义了数据类型(CString一再重新定义),并且在每个版本的VisualStudio中都发生了众所周知的更改


    我喜欢COM。早在.NET开发之前,它就提供了面向组件的体系结构。然而,COM向DCOM的扩展、它的许多包装器(如ATL)以及它缺乏全面的文档,使得它成为我在工作中必须处理的最丑陋的API

    Java的日期/时间API使用起来非常糟糕。java.util.Date有几个构造函数可以为特定日期创建实例,但它们都不推荐使用。应该改为使用java.util.GregorianCalendar,但是设置字段的方式非常烦人(想想calendar.setField(GregorianCalendar.MONTH,7)而不是calendar.setMonth(7),后者会更好)。画龙点睛的是,大多数其他课程和图书馆仍然希望有一个日期而不是日历,因此你必须不断地来回转换。

    不是赢家,但值得一提;安卓使用Java5编程语言,但几乎没有任何Java5语言特性。您得到的不是枚举,而是带有前缀或后缀的整数常量

    它不能完全决定它应该是面向对象的,还是过程的。显示对话框是一个很好的例子。几个具有自定义整数ID的回调,以显示对对话框的调用,这有点像旧的C API。然后你会得到一个带有链式方法的内部构建器类,这闻起来像是最糟糕的一种过度架构的OOP

    MotionEvent类将X和Y坐标作为绝对值和相对值
    pushMatrix();
      doSomeStuff();
      doSomeMoreStuff();
    popMatrix();
    
    preservingMatrix $ do
        doSomeStuff
        doSomeMoreStuff
    
    var workflow = new LAPI_Workflow(CurrentSession);
    
    // every Livelink method uses an out variable
    LLValue outValue;
    // every method returns an integer that says if the call was
    // a success or not, where 0 = success and any other integer
    // is a failure... oh yeah, there is no reference to what any
    // of the failure values mean, you have to create your own
    // error dictionary.
    int result = workflow.ListWorkTasks(workId, subWorkId, taskId, outValue);
    
    
    if (result = 0)
    {
      // and now let's traverse through at least 3 different arrays!
      string taskName = outValue.toValue(0).toValue("TASKS").toValue(0).toString("TaskName");
    }
    
    // GL code
    glBegin (GL_TRIANGLES);  
      glVertex (0,0,0);  
      glVertex (1,1,0);  
      glVertex (2,0,0);  
    glEnd (); 
    
    // D3D code, tonnes of crap removed
    v = &buffer.vertexes[0];  
    v->x = 0; v->y = 0; v->z = 0;  
    v++;  
    v->x = 1; v->y = 1; v->z = 0;  
    v++;  
    v->x = 2; v->y = 0; v->z = 0;  
    c = &buffer.commands;  
    c->operation = DRAW_TRIANGLE;  
    c->vertexes[0] = 0;  
    c->vertexes[1] = 1;  
    c->vertexes[2] = 2;  
    IssueExecuteBuffer (buffer);