我一直在研究 Lucene 2.9 之间的区别,特别是重做令牌流 API,我觉得它与旧的相比特别难看,如果你重用所说的令牌,只需返回一个新的或用值重新填充给定的值。
我没有进行任何分析,但似乎使用 MAP 存储属性效率不高,创建一个新的值类型保存值等会更容易。TokenStream 和 Attribute 的东西看起来像对象池,这几乎不需要这些天用于简单的值类型,例如文本标记。
我一直在研究 Lucene 2.9 之间的区别,特别是重做令牌流 API,我觉得它与旧的相比特别难看,如果你重用所说的令牌,只需返回一个新的或用值重新填充给定的值。
我没有进行任何分析,但似乎使用 MAP 存储属性效率不高,创建一个新的值类型保存值等会更容易。TokenStream 和 Attribute 的东西看起来像对象池,这几乎不需要这些天用于简单的值类型,例如文本标记。
创建()
当肯·汤普森(Ken Thompson)和丹尼斯·里奇(Dennis Ritchie)获得 1983 年图灵奖时,在他们各自的获奖感言之后,听众中有人问肯,如果他要重来一遍,他会对 Unix 做些什么不同的事情。他说,“我会用'e'来拼写'creat'。”
Livelink (OpenText) API
我办公桌旁边的墙上有我的头印……
从 API 方法中获取值的一个非常简单的示例:
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");
}
啊啊啊!!!:D
我从来都不是 java.sql 包的粉丝......
总而言之,一个非常烦人的图书馆。值得庆幸的是,Spring 库确实使它更容易使用。
通讯。它最大的改进最终是 .NET。
某些java.io.File
对系统编程至关重要的方法返回一个布尔值来指示成功或失败。如果这样的方法(比如、说mkdir
或delete
)失败了,你根本无法找出原因。
这总是让我的下巴张开。
Java 的日期/时间 API 使用起来非常糟糕。java.util.Date 有几个构造函数来为特定日期创建实例,但它们都已被弃用。应该使用 java.util.GregorianCalendar 来代替,但这有一种非常烦人的设置字段的方式(想想 calendar.setField(GregorianCalendar.MONTH, 7) 而不是 calendar.setMonth(7) 会好得多)。画龙点睛的是,大多数其他类和库仍然需要 Date 而不是 Calendar,因此您必须不断地来回转换。
不是赢家,但值得一提;安卓。使用 Java 5 编程语言,但几乎没有任何 Java 5 语言功能。你得到的不是枚举,而是带有前缀或后缀的整数常量。
它不能完全决定它应该是面向对象的还是程序化的。显示对话框是一个很好的例子。几个带有自定义整数 id 的回调来显示对对话框的调用,这有一种旧 C API 的味道。然后你会得到一个带有链式方法的内部构建器类,它闻起来是最糟糕的那种过度架构的 OOP。
MotionEvent 类将 X 和 Y 坐标作为来自同一辅助方法的绝对值和相对值。但是没有办法检查它当前拥有什么样的坐标。
Android 肯定是鱼龙混杂。
我将把这个问题放在头上,并为一个标准 API 很丑陋的库命名一个漂亮的 API:用于 OpenGL 的 Haskell 绑定。
这些是原因:
该库不是将所有内容集中到少量的头文件中,而是在逻辑上组织成离散的模块,其内容与 OpenGL 规范的结构平行。这使得浏览文档成为一种愉快的体验。
成对的“开始/结束”函数被高阶过程取代。例如,而不是
pushMatrix();
doSomeStuff();
doSomeMoreStuff();
popMatrix();
你会说
preservingMatrix $ do
doSomeStuff
doSomeMoreStuff
绑定的语法强制执行库的约定,而不是让您手动完成。这也适用于四边形、三角形、线条等的绘图图元。当然,所有这些都是异常安全的。
Getter 和 setter 被惯用的“StateVars”取代,使得读写操作更加对称。
多个版本的函数被多态性和额外的数据类型所取代。不是glVertex2f
用两个浮点值调用,而是vertex
用 type 的值调用Vertex2 GLFloat
。
参考:
直接3D!
毫无疑问,Direct3D 5 之前的旧界面非常丑陋:
// 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);
现在还不错 - 只需要 Microsoft 10 版本就可以了...
肯定不是最丑的。可能有很多,但 Flex 在地狱中占有特殊的位置。特别是 UIComponent,与 Sprite 相比,感觉就像用电锯削苹果。我相信通过使用更轻量级的对象和 mixin 风格的特性(类似于 Dojo 在 Javascript 端的工作方式),Flex 会得到很大改进。
ECMAScript/Actionscript Date 类几乎是倒退和无用的。每当我需要做一些比在日志中添加时间戳更复杂的事情时,这一直是一个持续的痛苦。他们需要更多的解析选项(例如,指定输入格式的能力),以及更好的时间管理,如智能增量、便利功能等......
C++ STL 库(和一般的模板),虽然显然很有用,但总是让人觉得很丑陋。虽然没有改进建议。他们工作。
我会说 MFC、ATL 和 WTL。所有这 3 个库都使用过多的匈牙利表示法,无缘无故地重新定义数据类型(CString 一遍又一遍地重新定义),并且随着每个版本的 Visual Studio 发生了众所周知的变化。
我喜欢COM。早在 .NET 开发之前,它就提供了面向组件的体系结构。然而,COM 扩展到 DCOM、它的许多包装器(如 ATL)以及它普遍缺乏全面的文档使其成为我在工作中必须处理的最丑陋的 API。
Oracle 的 Pro C、Pro Ada、Pro*this-that-the-other 的东西。它们是 C、Ada 和 Fortran 的预处理器前端,我想,也许还有其他一些,可以让你将 SQL 塞进你的源代码。
他们确实也有一个工作得更好、更灵活的库。
(那是 10 多年前的事了,我不知道他们现在在做什么,虽然如果它仍然是一样的,我不会感到惊讶,以免破坏人们的代码。)
好吧,大约 20 年前它是一个著名的库,但我认为最初的 btrieve 数据引擎编写的 api 是最糟糕的。几乎所有事情都通过一次调用,它的许多参数中的每一个都包含不同的值,具体取决于您实际执行的调用(一个参数是一个标志,告诉系统您是否要打开文件,关闭文件,搜索,插入等)。那时我喜欢 btrieve,但我花了很长时间制作一个好的抽象层。
通过不将所有内容都集中在一个电话中,它可以很容易地得到改善。不仅这个调用很可怕,而且程序员还负责分配、传入和释放位置块...... btrieve 使用一些内存来跟踪打开的文件句柄、位置等。另一个改进是允许 ascii定义索引时要使用的文本。索引必须由复杂的二进制表示指定。
最好的问候,唐
许多 CRT 库函数的名称很差或名称模糊,这可能是由于当时遗留的编码限制,因此需要经常使用 F1 键才能让人们找到正确的函数并提供正确的参数。
我使用 CRT 功能已经有一段时间了,但我仍然发现自己在 F1 上打得相当多。