IF文で勘違いしたようなので掘り下げ

前回のエントリに頂いたツッコミ。(恐れ多くもBuriのオトウサンとオカアサンw)

makotan 2008/11/07 07:05
>IF文の種類
ちょっと違うかも〜vol14に何か書いてる予感

habuakihiro 2008/11/07 10:03
フローとルールとバリデーション。

続いてまこたんのBlogにて。

IFには3種類あります

* 要件のIF
* 仕様のIF
* 実装のIF

ちなみにこの言葉はそのままなので迷ったらこれを思い出せば基本的にはOK

2008-11-07


という訳で、前回の僕のエントリ。

一概には言えないのですが、id:makotanが言っていたIF文の種類「要件から生まれたIF」「設計から生まれたIF」「実装から生まれたIF」は基本的に状態を特定する為の条件付け的なIF文を指していて、「見せる為のIF」は含まれていないんだと思います。

要件から生まれたIFは、たとえると「○○の人が男性だったら××だけど、女性だったら▽▽として□□する」というもので、設計から生まれたIFとは、「なので、人は男性だったら○○だけど、女性だったら◇◇としよう」であり、実装から生まれたIFは、「だから人の情報を登録する際、男性だという人には"0"を、女性だという人には"1"を付けましょう」ということかな?

見せる為のIFとは、これらを踏まえて「"0"だったら"男"、"1"だったら"女"と表示する」というものなのでBuriのサポート外、っていうかプロセスを左右するようなIFじゃないのでどうでもいいよ、という事なんじゃないかなぁ。

ちなみに、例えとして性別を挙げたのはたぶん不適切で、本来は遷移するような状態の方が良かったのかも><

「xxから生まれる〜」という表現が微妙に違うニュアンスを生んでいるような。。。


という訳で、Vol.14の「ガンバレ新人!!現場で役立つプログラミングの基礎知識」を再読。(まとめDVDを買っておいて本当に良かった><)

Vol.14の記事はHowToに近い内容だったので一読してあまり意識していなかったのですが、再読して僕は「IF文ってのには"変換"ってもんもあるんだよ」と言っているのだろう、と考えていました。それをWassrにちらりとPOSTしたり。そうしたら羽生さんの「フローとルールとバリデーション。」が書かれてまして、「あ、なるほど。これは変換じゃないんだな」と日中は軽く混乱したりしましたw(まぁ、仕事そのものはそれ以上に混乱してるのでそもそも(ry)

そこで帰宅後、ぶり祭@java-jaのまこたんのプレゼン資料を見直していたらこんな記載が。

○プログラムには横の繋がりがある
 ○プログラムの出力は別のプログラムの入力
 ○設定する検索条件は他のプログラムの影響を受ける
○横の繋がりは業務フローから洗い出すことが出来る(著者談)

「ガンバレ新人!!」にまた惑わされた><(というか、僕が基礎知識を舐めていたのかも。。。慣れは本当に怖いです)


そこで、要件のIFがフローとルール、仕様のIFがまた別のルール、実装のIFがバリデーション、という結びつけで掘り下げてみますと。。。(ルールは、フローが分岐する際の、先に進む際の条件、という理解。)


まこたんの言うように「要件のIFは、システムの外に元々存在しているもの」という事なので、プログラミング言語が何であろうとアーキテクチャがどうであろうと設計が(ry・・・と、必ず分岐をさせないとユーザの業務に支障を生むものだと認識。仕様のIFは「システム開発のいろんな都合で追加されるもの」という事で、何気に一番パターンが多そうでイメージがなかなか出来ません><実装のIFは「プログラム的な都合で追加されるもの」という事で、単純にバリデーションをイメージしました。


ともあれ、少なくとも要件のIF=フロー以外は基本的にユーザ業務と直接関係しないもの、というのはたぶん間違いないでしょう。実装のIFは入力チェックなどで基本的には事前に定められたルールに則って作られていくというより、ぬるぽのようなエラーを出さないようにするもの。で、イメージし辛いと書いた仕様のIFはというと、入力されたパラメータによってメソッドを読み分けたりする為のものだったり、アノテーションでクラスやメソッドをごにょごにょする為のものだった、とイメージすると近いですかね。


で、BuriはこのIF文をどうしたいのか?という点なのですが、ぶり祭@java-jaでまこたんが「IF文は存在しているだけで悪」とか「IF文死ね」とか言っていたので、IF文撲滅を狙っているのは間違いないかと。ではどんなIF文を潰そうとしているのか、というと前述のまこたんのプレゼン資料からの抜粋が全て、という感じですね。

つまり業務システムのプログラムは、前のプログラムの出力が次のプログラムの入力となる訳で、これってつまりプログラムの仕様がおのずと決まるんじゃない?と思ってしまう訳です。そして、プログラムごとに何をしているのか、というとそこは前回の僕のエントリがちょっとだけ近くて、「とある状態のモノ」を特定して次のプログラムが受け取れる状態に変えてやる、と。

ここの状態が、フローとルールとしてきちんと定義されていれば、あとはそのフローとルールに沿っていけば良いんだよね?IF文いらなくね?

というのが、Buriの狙いではないか、と。


再び突っ込みがあればお願いします><