2

ベンダーから提供された本番環境で、いくつかの既存のコードに出くわしました。文字列を使用してカンマ区切りの値を保存し、DB からフィルタリングされた結果を保存します。これは、AIX システムに存在するデータベースとインターフェースをとるPowerOnという独自のスクリプト言語用ですが、文字列、整数、および配列をサポートする言語であることに注意してください。

たとえば、次のようなものがあります。

Account
----------------
123
234
3456
28390

疑似コードは次のようになります。

Define accounts As String
For Each Account
   accounts=accounts + CharCast(Account) + ","
End

私が期待するものとは対照的に

Define accounts As Integer Array(99)
Define index as Integer=0
For Each Account
   accounts(index)=Account
   index=index+1
End

ループが完了するまでに、次のaccountsようになります。123,234,3456,28390,. 文字列は、後で特定のインスタンスが存在するかどうかをテストするために使用されます。

If CharSearch("28390", accounts) > 0 Then Call DoSomething

この例では、ステートメントは true と評価され、DoSomething呼び出されます。 配列のオプションを考えると、カンマ区切り値の文字列内に整数値を格納する必要があるのはなぜですか? 私が遭遇したすべての言語で、ほとんどの場合、整数ベースの操作よりも文字列ベースの操作を実行する方がコストがかかります。

このテクニックは見たことがなく、経験も限られていることを考えると、これに名前はありますか? これは一般的な慣行ですか、それとも文字列型が強すぎる別の例ですか? 既存のコードを拡張するには、引き続き文字列メソッドを使用する必要がありますか? ベンダーから汚いコードを入手しましたか?

4

2 に答える 2

2

私がコメントに入れたことはまだ有効ですが、私の本当の答えは次のとおりです。おそらく、互換性/移植性に関する設計上の決定です。整数配列の場合 (および API のレベルが十分に低い場合) では、通常、「今日の」マシンでの整数のサイズの安全な推測はどのくらいか、などの質問をすることがあります。エンディアンについてはどうですか。

すべてのデータ形式の中で最も移植性と柔軟性が高いのは、常に印刷された表現です。それを処理するのはそれほど速くないかもしれませんが、それがアダプター/コンバーターなどが機能する場所です。特にあなたが説明したようなデータベースAPIで何かの(人間が読める)印刷された表現を見つけても驚かないでしょう。

高速なものが必要な場合は、与えられたものを何でも取得し、それをより効率的な内部形式に変換し、処理して元に戻します。

于 2012-07-31T15:42:51.280 に答える
0

配列の代わりにカンマ区切りの文字列を使用しても、本質的に問題はありません。確かに、そのようなコレクションの random の要素に簡単にアクセスすることはできませんnが、そのようなランダム アクセスが必要ない場合、ペナルティはありませんよね?

私が知る限り、Oracle DBはNUMBER値を文字列として保存します(私の記憶が正しければ、DATEsも同様です)。これは非常に実用的な理由からです。

特定の例では、プロセスの境界を越えずにデータを渡す場合、文字列を使用するのはやり過ぎのようです。しかし、データを有線で送信する場合やディスクに保存する場合は、文字列データ型の選択がより理にかなっているのではないでしょうか?

于 2012-07-31T15:43:22.997 に答える