7

私は Lucene 2.9 とやり直し tokenstream API の違いを調べてきましたが、古いものと比べて特に醜いのは、トークンを再利用する場合に新しいものを返すか、指定された値を再入力するだけだと思います。

私はプロファイリングを行っていませんが、MAP を使用して属性を格納することは効率的ではないようで、値などを保持する新しい値の型を作成する方が簡単です。TokenStream と属性のものは、ほとんど必要のないオブジェクト プールのように見えます最近では、テキストのトークンのような単純な値の型が対象です。

4

14 に答える 14

10

creat()

ケン・トンプソンとデニス・リッチーが1983年のチューリング賞を受賞したとき、それぞれの受諾演説の後、聴衆の誰かがケンに、Unixでもう一度やり直すとしたらどうするかと尋ねました。彼は、「私は「作成」を「e」で綴るだろう」と述べた。

于 2009-10-13T06:44:19.330 に答える
7

Livelink (OpenText) API

  • すべてが奇妙な形のギザギザ配列として返されます
  • ドキュメントには例がまったくありません
  • [お気に入りの検索エンジン] は通常、特定の API メソッドに対して結果を返しません
  • サポートフォーラムは放棄されたように感じます
  • 結果のデータを理解する唯一の信頼できる方法は、Livelink デバッガーでデータを実行することです。
  • そして最後に... システムには数万ドルの費用がかかります

机の横の壁には私の頭の跡が…

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

于 2009-10-14T00:54:59.030 に答える
5

私は java.sql パッケージのファンではありませんでした...

  1. すべてのチェック済み例外をキャッチする必要があり、例外は 1 つしかないため、SQL コード文字列を調べないと、何が問題なのかを示すことはできません。
  2. それに加えて、java.util.Data の代わりに java.sql.Date を使用する必要があるため、常にいずれかの完全なパッケージを指定する必要があります。両者の間で行わなければならない変換は言うまでもありません。
  3. そして、パラメータ インデックスがあります。これは、0 ベース インデックスの Java の残りの部分ではなく、1 ベース インデックスです。

全体として、かなり面倒なライブラリです。ありがたいことに、Spring ライブラリを使用すると、作業がかなり簡単になります。

于 2009-10-13T03:01:05.927 に答える
4

コム。その最大の改良点は .NET でした。

于 2009-10-13T03:02:16.250 に答える
3

システム プログラミングに不可欠な特定のjava.io.Fileメソッドは、成功または失敗を示すブール値を返します。そのようなメソッド (たとえば、mkdiror などdelete) が失敗した場合、その理由を見つける方法はまったくありません。

これはいつも私のあごをぶら下げたままにします。

于 2009-10-13T02:57:07.463 に答える
3

Java の日付/時刻 API を扱うのは非常に厄介です。java.util.Date には、特定の日付のインスタンスを作成するコンストラクタがいくつかありますが、それらはすべて非推奨です。代わりに java.util.GregorianCalendar を使用する必要がありますが、これにはフィールドを設定する非常に煩わしい方法があります (calendar.setMonth(7) の代わりに calendar.setField(GregorianCalendar.MONTH, 7) を考えてください)。最後の仕上げとして、他のほとんどのクラスとライブラリは引き続き Calendar ではなく Date を想定しているため、常に相互に変換する必要があります。

于 2009-10-13T08:20:54.393 に答える
3

私はこの質問を逆手にとって、標準 API のほとんどが見苦しいライブラリーの美しい API に名前を付けます: OpenGL の Haskell バインディングです。

理由は次のとおりです。

  • すべてを少数のヘッダーにまとめるのではなく、ライブラリは個別のモジュールに論理的に編成されており、その内容は OpenGL 仕様の構造に対応しています。これにより、ドキュメントの閲覧が快適になります。

  • 「開始/終了」関数のペアは、高次の手順に置き換えられます。たとえば、代わりに

    pushMatrix();
      doSomeStuff();
      doSomeMoreStuff();
    popMatrix();
    

    あなたが言うだろう

    preservingMatrix $ do
        doSomeStuff
        doSomeMoreStuff
    

    バインディングの構文は、手動で行うのではなく、ライブラリの規則を強制します。これは、四角形、三角形、線などの描画プリミティブにも機能します。もちろん、これらはすべて例外セーフです。

  • ゲッターとセッターは慣用的な「StateVars」に置き換えられ、読み取りと書き込みがより対称的な操作になります。

  • 関数の複数のバージョンがポリモーフィズムと追加のデータ型に置き換えられました。glVertex2fたとえば、 2 つの float 値で呼び出す代わりに、vertextype の値で呼び出しますVertex2 GLFloat

参考文献:

于 2009-10-14T00:34:57.353 に答える
3

勝者ではありませんが、名誉ある言及に値します。アンドロイド。Java 5 プログラミング言語を使用しますが、Java 5 言語機能はほとんど使用しません。列挙型の代わりに、接頭辞または接尾辞付きの整数定数を取得します。

オブジェクト指向にするべきか、手続き型にするべきかを完全に決定することはできません。ダイアログの表示がその代表的な例です。古い C API のにおいがする、ダイアログの呼び出しを表示するための自己定義された整数 ID を持ついくつかのコールバック。そして、チェーンされたメソッドを持つ内部ビルダー クラス クラスを取得します。これは、最悪の種類の過剰にアーキテクチャ化された OOP の匂いがします。

MotionEvent クラスには、同じアクセサリ メソッドからの絶対値および相対値として X および Y 座標があります。しかし、現在保持している座標の種類を確認する方法はありません。

Androidは確かに混合バッグです。

于 2009-10-13T08:32:29.160 に答える
2

ダイレクト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バージョンだけで正しくなりました...

于 2009-10-14T01:06:08.587 に答える
1

最も醜いものではないことは間違いありません。おそらく非常に多くありますが、Flex には地獄のような特別な場所があります。具体的には、Sprite と比較すると、チェーンソーを使ってリンゴの皮をむくような UIComponent です。Dojo が Javascript 側でどのように動作するかに似た、より軽量なオブジェクトと mixin スタイルの機能を使用することで、Flex は大幅に改善されたと思います。

ECMAScript/Actionscript の Date クラスはほとんど逆で役に立たない。ログにタイムスタンプを追加するよりも複雑なことをする必要があるときはいつでも、それは常に苦痛でした. より多くの解析オプション (入力形式を指定する機能など) と、インテリジェントなインクリメント、便利な関数などのようなより良い時間管理が必要です...

C++ STL ライブラリ (および一般的なテンプレート) は、明らかに有用ですが、常に見苦しく感じられてきました。ただし、改善の提案はありません。彼らが働きます。

于 2009-10-13T02:25:22.753 に答える
1

MFC、ATL、WTL だと思います。これらの 3 つのライブラリはすべて、過度のハンガリー語表記を使用し、明らかな理由もなくデータ型を再定義し (CString が何度も再定義されています)、Visual Studio の各バージョンで悪名高く変更されています。

COMが好きです。.NET が開発されるずっと前から、コンポーネント指向のアーキテクチャを提供します。ただし、COM から DCOM への拡張、ATL などの多くのラッパー、および包括的なドキュメントの一般的な欠如により、仕事で対処しなければならない最も醜い API になっています。

于 2009-10-13T08:10:57.097 に答える
1

Oracle の Pro C、Pro Ada、Pro*this-that-the-other など。それらは、C、Ada、および Fortran のプリプロセッサ フロント エンドであり、SQL をソース コードに詰め込むことができるものでした。

彼らはまた、はるかにうまく機能し、はるかに柔軟なライブラリを持っていました.

(それは 10 年以上前のことです。彼らが今何をしているのかはわかりませんが、人々のコードを壊さないようにするためだけに、それがまだ同じであったとしても驚かないでしょう。)

于 2009-10-14T01:42:40.660 に答える
0

多くの CRT ライブラリ関数は、当時のレガシー コーディングの制限が原因で、不適切または漠然とした名前が付けられているため、適切な関数を見つけて適切な引数を指定するには、F1 キーを頻繁に使用する必要があります。

私はしばらくの間 CRT 機能を使用してきましたが、まだ F1 をかなりの頻度で使用していることに気付きます。

于 2009-10-13T03:01:40.730 に答える
0

まあ、20年ほど前にはよく知られたライブラリでしたが、オリジナルのbtrieveデータエンジンはこれまでに書かれた最悪のAPIを持っていると思います。ほとんどすべてが 1 回の呼び出しで行われ、多くのパラメーターのそれぞれには、実際に実行している呼び出しに応じて異なる値が含まれます (1 つのパラメーターは、ファイルを開くか、ファイルを閉じるか、検索するかをシステムに伝えるフラグでした)。挿入など)。昔から btrieve が好きでしたが、良い抽象化レイヤーを作るのに長い時間を費やしました。

すべてを 1 回の呼び出しに強制しないことで、簡単に改善できたはずです。1回の呼び出しが恐ろしいだけでなく、プログラマーは位置ブロックの割り当て、受け渡し、および解放を担当していました...開いているファイルハンドル、位置などを追跡するためにbtrieveによって使用されるメモリの一部。別の改善はasciiを許可することです索引付けを定義するときに使用されるテキスト。インデックスは、複雑なバイナリ表現で指定する必要がありました。

よろしく、ドン

于 2009-10-13T02:02:20.523 に答える