まえに、ちょっと書くといった話、
「詳細設計書は、実装できる人が書かないと、とんでもない設計書(そんなの、実装できるわけねーだろ的な)を書かれることがあるよね。」ってことについて。
じつは、使用言語等によって、あることを実装しようとしたときに、ものすごーく手間になったり、超簡単だったりする。
たとえば、入力エリアでクリックすると、プルダウンメニューが出てきたりする。
このとき、
・プルダウンメニューにないものを入力できるもの(コンボボックスと呼ばれる)
・プルダウンメニューにないものは入力できないもの
の2種類がある。
前者のコンボボックスは、.net系のコンポーネントにはあるが、HTML、JSPなどではできない。そうとうなJavascriptを組み合わすことになる。
しかし、コンボボックスを許してしまうと、選択項目がDB等に入っている場合、DB
に入力された項目を追加するという作業が入り、面倒というか、危険になる(テキトーな項目を入力される可能性があるので)。
.netとJava、両方実装したことのある人なら、すぐに気付くんだけど、COBOLプログラマからSEになったような、JAVA、.net両方やってない人だと、HTMLでコンボボックスつくれみたいな、無茶ぶりをする。
そーなると、たいへんなことに(>_<!)
この手の、COBOLあがりのSEが、Web系をやってしまうと、やばやばな仕様を書きそうなのは、こんなかんじかな・・・
●画面設計
・タブキー移動
C++などで、フォームだと簡単にできるけど、JavaでHTMLの場合、Javascriptでタブキー制御するのは、たいへん。
ケータイだと、i-modeではたいへんっていうか、できたか?
Brewだと、このブログのほかのページを見ると出ている。
・Enterキーをタブと同じように使う(次項目へ飛ぶ)
JavaでHTMLの場合、Javascriptで、この操作をするのは、たいへん。
Brewだと、このブログのほかのページを見ると出ている。
i-modeでは、どーだったっけ?
・存在しないコントロール
上記のコンボボックスや、ツリー上に出したものから選択させる。なお、表枠をだして、選択する方法はJavaでできるが、やりかたを知らないと難問(このブログのほかのページに書いてある)。なお、ドラッグアンドドロップしたものを選択させるのは、Javascriptでできる。
一方、.netで実現しようとする場合は、DragPanelコントロールを考えるかもしれないが、このときは、自分の希望するイベントが取得できるかどうか確認のこと(ほしいイベントが取れないことがある)
・そのイベントは、とれない
Javascriptや.netを使う場合、「そのイベントは取れない」ということがある。
自分の欲するイベントが取れるかどうか、確認のこと。
・実現するには、サーバーアクセスが必要で、大量データを送ってくるが、
それを、一瞬に処理しないといけない
→1文字入力されるごとに、対象商品を絞り込んで、下に出す。
●画面以外のクライアント側
・ローカルのファイル保存
セキュリティ上、Webからでは出来ないことが多い
・ローカルプリンタから出す帳票を、サーバーから送る。
できることもあるが、一般論からすると、できない。一度PDFにする必要がある
・プッシュ型配信
できることもあるが、ブラウザからはできないことが多い。アプリを組んだほうが早いこと多し。
●UI以外のサーバー側
・DB処理
COBOLの人はカーソル処理したがるが、最近はSQLでいく、
また、一部SEが、すべてSQLで片付けようとするが(.netからきて、DataGrid大好きな人とか)実質、これは無理なことが多い(全く観点が違う集計の場合)
JavaであまりDB系のプログラム経験がなく、SEになってしまうと、トランザクションでロックをかけている期間が、無駄に長くなったり、データ矛盾のチェックが甘かったりする。
それと、COBOLの人でも、JavaのDB系のプログラム経験が少ない人がSEになってもよくあるんだけど、ものすごい大きいデータを連続的に何回も取り、大きなガベージコレクションを起こしてしまい、処理時間が異常に長くなるケースがある(自分で適当なところでSystem.gc()を送る)
・SORT,マージアルゴリズム
COBOLでならった、一般的SORT・マージ方法は、Javaでは使わない(キーが多くなると実は厄介になるから)。
Javaの場合、レコードをBean化し、Comparableインターフェースを実装する。つまり、compareToメソッドを記述する。ここで、キーが3つだろうと、100子だろうと、その大小関係決定法を記述する。
そうすれば、配列にして、Arrays.sort()をかければ、ソートしてくれる。
大小関係の修正時も、そのBeanを書き変えればいいだけ。
・メモリ確保方法
COBOLだとはじめにガーンととるが、他の言語だと、必要時に取る。なので、動いているときに、死ぬ可能性がある(動作中に死ぬのが嫌なら、汎用機+COBOLを使うしかない。汎用機なら、そのプロセスの起動時にJCLに書かれた資源を確保するから)。死ぬ時に安全に死ぬ記述が必要。
このとき、Exceptionを挙げるが、Exceptionをあげる人と、エラーコードでReturnする人がいる。例外を使い慣れてないとReturnで戻りたがるかな。。
・入出力時のメモリ確保
.netなど、C++において、大きな領域でStringをとろうとすると、時間がかかる場合がある。このことを知らないで、JPEG画像などを、
・1ファイル全部いっぺんに読み込み
・JPEG画像をライブラリに解析させて
・サムネイルを表示する
などすると、えらい時間がかかることがあるが、C++をやったことがない人(いやC++でやっている人でも)上記の手法を取ろうとすることがある。
この場合、1バイトずつ読み込み、適宜解析をかけていったほうが早い。
ただし、大きなファイルでなければ、いっぺんに読んじゃう上記のやり方のほうが簡単。
●UI,帳票
・外字フォントの扱い
フォントが存在しなくて表示できない
簡略化された文字が現存するとき、外字と簡略化された字が異なるため、検索にかからない。
・帳票の作り方
あーんど、外字フォントの取り扱い
ざっとあげても、これだけのことは知らないと、詳細設計は書けない。
だけど、知らない人のことが多いかも。。。