結果の並び順が保証されていないという仕様の怖さ | Archive Redo Blog

Archive Redo Blog

DBエンジニアのあれこれ備忘録

SQL なんかもそうですが、何かを一覧で返すコマンドには、結果の並び順が保証されていないものが結構あります。

このようなコマンドを利用する際、後続の処理が特定の並び順を前提としていると思わぬトラブルに見舞われることがあります。


例えば、java.io.File の オブジェクトの listFiles() 。

listFiles() は特定のディレクトリにあるファイルを一覧で返すメソッドですが、結果の並び順は保証されていません。

API 仕様でも以下のように明記されています。

結果の配列の名前文字列は特定の順序にはなりません。アルファベット順になるわけではありません。

先日、この listFiles() の結果によってトラブルが発生しました。

後続の処理が特定の順序を前提としていたため、エラーが発生したのです。

しかも、単体テスト、結合テスト時にはうまく動作し、システムテストの段階での発覚です。

システムテストでも発覚しなければ、バグを抱えたままリリースしてしまうところでした。


listFiles() に限らず、この”並び順が保証されない”という仕様の厄介な点は、環境によってはたまたまうまく動作してしまうということがあるということです。

トラブルを未然に防ぐため、設計、実装、テスト、それぞれの段階で特に注意が必要なポイントです。