某ソフトの更新履歴 [戯言]
データのコンバータを作ることになりました。
と言っても、難しいものではなくて、
「変換元データの項目を、対応する別の項目に置き換える」という実に単純なコンバータです。
元データ | 新データ |
---|---|
項目A | 項目α |
項目B | 項目γ |
項目C | 項目β |
ここに1つ条件が付きました。
「この項目の対応表は頻繁に変わるから、外部の設定ファイルか何かで指定できるようにして欲しい。この不況時、ツール改変の予算は下りないから」
そこで、こんなXML形式の設定ファイルを用意してみました。
<TransTable> <data name="α"> A </data> <data name="β"> C </data> <data name="γ"> B </data> </TransTable>
これが「バージョン1」の仕様でした。
客「実は、項目αは(元データの)AとBをカンマで連結したものだったのだー」
そーなのかー
今までの設定ファイルでは対応できないので、
設定ファイルを変更して、変換先の項目1つに対して、変換元の項目を任意個指定できるようにしました。
なにやら、項目を連結する記号がカンマだけとは限らないという嫌な予感がしたので、これも任意に指定できるようにしてみました。
<TransTable> <data name="α"> <item>A</item>,<item>B</item> </data> <data name="β"> <item>C</item> </data> <data name="γ"> <item>B</item> </data> </TransTable>
副作用として、変換元データに関係なく常に一定の値(固定値)を持つデータを指定できるようになりました。
もちろんプログラムを変更しなければ対応できないので、開発費を請求して「バージョン1.1」を作りました。
【バージョン1.2】
客「実は、項目βは(元データの)AとBを掛け算してCを足して、その結果をDで割った計算結果だったのだー」
そーなのかー
設定ファイルを変更して、変換したデータを計算するかどうかの指定ができるようにしてみました。
<TransTable> <data name="α" calc="no"> <item>A</item>,<item>B</item> </data> <data name="β" calc="yes"> (<item>A</item>*<item>B</item>+<item>C</item>)/<item>D</item> </data> <data name="γ" calc="no"> <item>B</item> </data> </TransTable>
もちろんプログラムを変更しなければ対応できないので、開発費を請求して「バージョン1.2」を作りました。
この時の開発費は結構な金額になりました。
Microsoft社製のライブラリ以外を使ってはいけないという縛りがあるので、「(文字列で指定した)計算式を計算する」処理を全部自前で実装しなければならないのに加え、担当者が「実装方法が分からない」などと言い出したのです。
仕方なく昔作った1次方程式を解くプログラム(Java)を渡して移植&改造してもらったから、余計に工数がかかってしまっています。無駄も多いし。
【バージョン1.3】
客「項目γは項目Bなんだけど、実は(Bの)値が0の時は"false"、1の時は"true"、0,1以外は空欄だったのだー」
そーなのかー
設定ファイルを変更して、値の変換表みたいなものが指定できるようにしてみました。
<TransTable> <data name="α" calc="no"> <item>A</item>,<item>B</item> </data> <data name="β" calc="yes"> (<item>A</item>*<item>B</item>+<item>C</item>)/<item>D</item> </data> <data name="γ" calc="no"> <values item="B" default=""> <value src="0">false</value> <value src="1">true</value> </values> </data> </TransTable>
もちろんプログラムを変更しなければ対応できないので、開発費を請求して「バージョン1.3」を作りました。
【バージョン1.4】
客「実は(元データの)AとCは空欄になる場合があって、項目βが計算できない時があったのだー」
あー、そーですかー。
客「計算できない時は、"error"を設定してね」
設定ファイルを変更して、計算できない時の値を指定できるようにしてみました。
<TransTable> <data name="α" calc="no"> <item>A</item>,<item>B</item> </data> <data name="β" calc="yes" noCalcValue="error"> (<item>A</item>*<item>B</item>+<item>C</item>)/<item>D</item> </data> <data name="γ" calc="no"> <values item="B" default=""> <value src="0">false</value> <value src="1">true</value> </values> </data> </TransTable>
もちろんプログラムを変更しなければ対応できないので、開発費を請求して「バージョン1.4」を作りました。
というか、1.2を作った時に、どうして計算できない場合について検討しなかったかな。失敗
【バージョン1.5】
客「実は、項目δは(元データの)Dが0~1なら"1"、2~7なら"2"、8以上は"3"、それ以外は空欄だったのだー」
はいはい。
【バージョン1.6】
客「実は、項目εは(元データの)Eが"0"なら項目F、"0"以外なら項目Gだったのだー」
ふーん。
【バージョン1.7】
客「実は、項目βは(元データの)Eの値が"x"で始まるなら項目Eの2文字目以降、"y"で始まるなら空欄、それ以外なら(A*B+C)/Dの計算結果だったのだー。あ、もちろん計算に失敗したら "error"で」
それがなにか?
………
………
………
もうね、設定ファイルを変更するだけで何とかなった例がないのですよ。
と言うか、頻繁に変わるのは「項目の対応」じゃなくて、
変換先項目に変換するルールじゃないかと思うのですよ。
客「いや違う。変換ルールが変わったんじゃなくて、今の変換ルールじゃ駄目な場合があることに後から気づいただけだ。
対応する項目は一切変わっていないから」
最初に「項目の対応は頻繁に変わる」と言ったのは嘘ですか?
ちなみ、この時点で設定ファイルのXMLは、とってもカオスな状態になっていて「誰が設定変更できるんだ、これ」とか困ったことに……。
それでも設定ファイルで設定することにこだわる客。
これまでの状況を見る限り、設定ファイルは使わず、変換ルールを固定にして、その都度ツールを修正していた方が絶対にコストが安かったと思うのですが……。
プログラムの方も、設定を解釈する部分が複雑化しすぎて、これ以上新しい変換ルールが登場すると、原因不明のバグとか出そうです。
テスト件数がシャレになっていません。
とか言っているそばから、
客「実は、項目ζは(元データの)Gが"n"なら"0"、そうじゃないならGとHを連結して、連結結果が"abcd"になったら"-1"で、そうじゃなければGとHを連結した結果だったのだー」
もはや、何を言っているのかサッパリです。
仕方が無いので、全部作り直しました。
そして、これが新しい設定ファイルです。
【バージョン2.0】
某言語のインタープリタを組み込んだから、勝手に変換プログラムを書いてください。
<TransTable> <![CDATA[ DestData.set("α", SrcData.get("A") + "," + SrcData.get("B")); var srcE = SrcData.get("E"); if (srcE.charAt(0) == 'x') { DestData.set("β", srcE.substring(1)); } else if (srcE.charAt(0) == 'y') { DestData.set("β", ""); } else { var v = (SrcData.get("A") * SrcData.get("B") + SrcData.get("C")) / SrcData.get("D"); if (isNaN(v) || v == Number.POSITIVE_INFINITY || v == Number.NEGATIVE_INFINITY) { DestData.set("β", "error"); } else { DestData.set("β", "v"); } } switch (SrcData.get("B")) { case 0: DestData.set("γ", "false"); break; case 1: DestData.set("γ", "true"); break; default: DestData.set("γ", ""); break; } ]]> </TransTable>
設定ファイル?
なにそれ、おいしいの?
【バージョン3.0?】
プログラムが書けるんだから、どうにでもなると思っていたのに……。
客「実は、(元データの)Iの値が(別に用意してある)データベースの中に登録されていたら、Jの値の分だけ変換先データを作成して、その変換先の項目ηは1からの連番、(Iがデータベースに)登録されていなければ変換先データは1つで項目ηは空欄だったのだー」
こんなことまで設定ファイルで設定できるようにしておけと?
今日の一冊 | |
|
コメント 0