今の仕事はスポットで他のプロジェクトの「お手伝い」をしてる。で、超久しぶりに他人が作ったライブラリを使用していたりするんだけど、そのライブラリ仕様が自分の感覚と合わないところがあって思わぬバグにつながったりする。


その仕事はデータベースからデータを受けとって、色々加工して、データベースに出力/更新。てなパターンだが、データベースから受け取ったデータは数値だとうと文字列だろうと「ただの文字の羅列」だ。C言語で文字列を扱う場合はASCIIZ形式が普通だが、NULLでターミネイトされていないから、本当に「ただの文字の羅列」。だから、ここ最近無いくらいに大量のsizeof()書いたよ(笑)。

で、ライブラリはこのデータを渡すと色々してくれちゃったりするんだが、渡すデータの桁数が可変のモノは仕方ないとして、固定のモノまで呼ぶ側で事前にASCIIZ形式にしてから渡さなくちゃいけないのが鬱陶しい。そーゆー処理がある度に、そのデータ長+1の領域にコピーしてから末尾にNULLを付加するという作業が必要になる。毎回ワーク用の変数と処理が必要になり、ソースが汚らしい。これくらいはライブラリ側でやってくれてもバチ当たらないと思うし、自分ならそのような設計にする(正確にはNULLが有っても無くても良い仕様にする)。

他には、データベースアクセスライブラリの制限で、数値項目のデータは実際の桁数+2の長さになる(符号用とピリオド用らしい)。で、非10進数な計算をする必要があるので、そのためのライブラリ関数があるのだが、こいつがまた、その“+2”の部分を考慮してくれない。呼ぶ側で「&hogehoge[2]」とかで渡さないといけない。これまた汚らしい(このライブラリの場合、ASCIIZ形式化しなくて良いのが救いだ)。


「ライブラリ作成」というテーマはそれなりに深い気がする。便利の為に色々ゴテゴテと機能付けると、汎用性に問題が出て来たりするし、低機能だとライブラリ使う意味が無かったりする。まぁ、結局デザイナのセンスになってしまうんだけどね。

自分が長年(といっても6年くらいだが)のライブラリ作りから思ったこの辺りの設計方針は「単機能で使う人はなるべく楽チンできるように」だ。あと、「モジュール結合度」なんていう昔学校で習ったヤツを持ち出すと「極力低く」ってのもある。おかげてここ最近の仕事(今手伝いでやってる仕事除く)では、ほとんどのコードがコピー&ペーストで済んでいる(自分のコーディング作業がやたら速い事があるのは、これの御蔭だ)。


前にも書いたかもしれないし人にも良く言うんだけど、最近はコーディング中2〜3行書いて「あ、この処理は前に書いたアレと同じだな。コピーしよう」と思ってコピー元のソース見ると、なんと書いちゃった2〜3行が全く同じでニヤリとしてしまう事が多い。変数名もインデントの深さもコメントもみんな同じ(笑)。
# 変数名に関しては、Windowsのプログラムをするようになった前後で変化が
# ある。理由は、例のWindowsな命名規約を採用しているから。
# (ちなみに、アレが効果的とはあまり思っていない)

そのせいか、「昔の自分のコードは、もはや他人のコードだ」という人が理解できない。自分の書くコードはほとんどコメントが無いにもかかわらず、かなり昔のコードでも、さっきまでコーディングしていたかのような感覚でメンテできるんだけど。
# まれに、そうじゃない時もある(笑)