Coding style 您所见过的一个相对知名的库的最丑陋的API是什么?为什么以及如何改进它?
我一直在研究Lucene 2.9(特别是redone tokenstream API)之间的差异,我突然想到,与旧的相比,它特别难看。如果您重用所述令牌,只需返回一个新的或重新填充给定的值Coding style 您所见过的一个相对知名的库的最丑陋的API是什么?为什么以及如何改进它?,coding-style,code-readability,Coding Style,Code Readability,我一直在研究Lucene 2.9(特别是redone tokenstream API)之间的差异,我突然想到,与旧的相比,它特别难看。如果您重用所述令牌,只需返回一个新的或重新填充给定的值 我没有做过任何分析,但使用映射来存储属性似乎没有那么有效,只需创建一个新的值类型来保存值等就更容易了。令牌流和属性内容看起来像对象池,这在如今对于简单的值类型(如文本令牌)来说几乎是不必要的。,大约20年前,它是一个著名的库,但我认为原始的btrieve数据引擎具有有史以来最差的api。几乎所有的东西都要经过
我没有做过任何分析,但使用映射来存储属性似乎没有那么有效,只需创建一个新的值类型来保存值等就更容易了。令牌流和属性内容看起来像对象池,这在如今对于简单的值类型(如文本令牌)来说几乎是不必要的。,大约20年前,它是一个著名的库,但我认为原始的btrieve数据引擎具有有史以来最差的api。几乎所有的东西都要经过一次调用,它的许多参数中的每一个都包含不同的值,这取决于您实际执行的调用(其中一个参数是一个标志,告诉系统您是否要打开文件、关闭文件、搜索、插入等)。当时我很喜欢btrieve,但我花了很长时间制作了一个好的抽象层 如果不将所有内容都强制到一个调用中,则可以很容易地进行改进。不仅一个调用很可怕,而且程序员还负责分配、传递和释放位置块。。。btrieve用于跟踪打开的文件句柄、位置等的一些内存。另一个改进是允许在定义索引时使用ascii文本。索引必须由卷积的二进制表示指定 致以最良好的祝愿,
不要做最丑的人。可能有这么多,但Flex在地狱里有一个特殊的位置。特别是与雪碧相比,它感觉就像用链锯削苹果皮。我相信,如果使用更轻量级的对象和类似于Dojo在Javascript端工作的mixin风格的特性,Flex将会得到很大的改进 ECMAScript/Actionscript日期类几乎是向后的,毫无用处。每当我需要做一些比在日志中添加时间戳更复杂的事情时,我总是感到痛苦。他们需要更多的解析选项(例如,指定输入格式的能力)和更好的时间管理,如智能增量、方便功能等
C++STL库(以及一般的模板)虽然显然很有用,但总感觉很难看。但是没有改进的建议。他们工作 某些对系统编程至关重要的
java.io.File
方法返回布尔值以指示成功或失败。如果这种方法(例如,mkdir
或delete
)失败,您根本无法找到原因
这总是让我的下巴张开。我从来都不是java.sql包的粉丝
总而言之,这是一个相当烦人的图书馆。谢天谢地,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);