̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ IT ニュース&コラム 2016/ 3/28 通巻709号 技術版 ソフトウェアデザイン館 Sage Plaisir 21  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄    手戻りの少ない仕様には、必ずテスト コードが存在する 前回は、内包的定義は、開発対象のコードに、外延的定義は、サンプルやテストに 対応することを説明しました。 今回は、その具体例を紹介します。 ・HTML の   を、XSL テンプレートを使って出力したい。  (ただし、XSL の処理に MSXML を使いたい。) という、要求を例に見ていきましょう。   は、改行がない空白を表す HTML の文字実体参照です。 HTML の ソース ファイルに連続した空白があっても、HTML パーサーがパース(リード) するときに1つにまとめてしまうので、それを回避するために、連続した空白の 代わりに連続した   を書くと、連続した空白がブラウザーで表示できる ようになります。 ・HTML ソース「 」→ ブラウザー出力「 」 ・HTML ソース「     」→ ブラウザー出力「 」 XSL テンプレートに、  を書けば簡単に出力できるじゃん、余裕、余裕、 と思うかも知れませんが、  は、XML の実体参照ではないので、XML 出力モードの XSL から HTML の   を出力しようとするとエラーに なってしまいます。 XSL 2.0 では、その対策となる仕様がありますが、 MSXML は XSL 1.0 しか対応していないので、その経験から要求となって 表れたものです。 いろいろな方法があると思いますが、今回は、MSXML でもエラーにならないように、   の代わりとなる文字列を XSL から出力して(XSLT を通して)、後で別途   に置き換える方法をとることにします。 ・→ XSLT → (代わりとなる文字列)→ 別途変換 →「 」 代わりとなる文字列は何にしましょうか。 いろいろ考えられますが、たとえば、   を代わりとなる文字列と決めたとしましょう。 ・「 」→ 別途変換 →「 」 ただ、注意したほうがいいことがあります。 それは、代わりとなる文字列自体も 出力できるように、エスケープできるようにすることです。 エスケープは、たとえば、grep では \ 文字の機能です。 grep などの正規表現において、. $ ^ { } [ ] ( ) | * + ? は、メタ文字と呼ばれ、 検索キーワードで特別な機能を持っていますが、たとえば、. はピリオドではなく 任意の文字にマッチします。 \. のように、エスケープ文字を左に置くと、 特別な機能ではなく、通常の文字(ピリオド)として扱うようになります。 このように特別な機能を持った文字(文字列)を、通常の文字に戻すことを エスケープと呼びます。 つまり、  を別途   に置き換えるという仕様では、   自体を出力できなくなる(エスケープできない)ので、 これは悪い仕様です。 ・(存在しない)→ 別途変換 →「 」 そこで、第2の仕様案として、&; を & に置き換える仕様に決めたと しましょう。 では、エスケープできるか(  と「代わりとなる文字列」 の両方が出力できること)を検証してみましょう。 ・「&;nbsp;」→ 別途変換 →「 」 ・「&;;」→ 別途変換 →「&;」 できましたね。 ややこしいので、本当にそのように変換できるかを、簡易的な 変換プログラムを作って検証してみるとよいでしょう。 ちなみに、この仕様では、 よく使われる & は変換されないので、扱いやすいです。 ・「&」→ 別途変換 →「&」 (変換されない) このようにして、別途変換(R とする)の仕様が決まりました。 内包的定義は、 &; を & に置き換えることです。 Visual Basic のコードにすると次のように なります。 Function R( in_Text ) R = Replace( in_Text, "&;","&" ) End Function 外延的定義は、上記のとおりで、Visual Basic のコードにすると次のようになります。 Assert R( "&;nbsp;" ) = " " Assert R( "&;;" ) = "&;" このように、内包的定義は、開発対象のコードに、外延的定義は、サンプルやテストに 対応しています。 ちなみに、外延的定義は、数学的な定義とは言えませんが、 そんな定義は存在しないので十分なテストケースがある状態、または、それが予想される 状態を定義と呼ぶことにします。 実は、内包的定義のほうは、例外がないことの証明が 難しいので、定義と呼べるか怪しいのですが、それでもこれが定義だ!と押し通すのは 内包的定義が多いです。 始めの仕様は、  を   に変換するというものでした。 しかし、 検証もせずに、そのまま開発は進んで、テスト段階まで来て初めて手戻りが発生して しまっては、非常に効率が悪いです。 検証はつまりテストの一部ですから、良い仕様(手戻りがないか少ない仕様)という ものは、開発の初期段階にテストの一部が存在しているのです。 そして、その検証は PC で簡単にできるのであれば、客観的かつ高速な PC を使うべきであり、つまり、 テスト プログラム(の一部)を書くことになるのです。 どうしても、仕様定義の工程でテストをすべきでないとうるさいときは、テストを プロトタイプと呼ぶようにしてください。 CMM/CMMI で有名なハンフリー氏 も、要求の不安定さの対策として、プロトタイプによるテストをすることを述べて います[*1]。 *1 ソフトウェアプロセス成熟度の改善, ワッツ・S. ハンフリー, 日科技連出版社 注目ニュース 一覧 ◇ PlayStation VR、ソニー復活のカギ握る? http://www.itmedia.co.jp/news/articles/1603/17/news071.html … アメリカでは 100ドル安だが、日本では半額。 ◇ Appleの魅力がギュッと凝縮。新型iPhone SEとiPad Proを触ってみた。 http://www.itmedia.co.jp/mobile/articles/1603/22/news098.html … CPU をパワーアップした iPhone 5S。 ◇ FBI、iPhone ロック解除で独自手法を発見か。米司法省、予定されていた審理の中止を要請。 http://japan.cnet.com/news/service/35079884/ … 発見したかもしれないし、発見しなかったかもしれない。 ◇ iOSを狙う新マルウェア AceDeceiver を確認。ジェイルブレイクされていない端末にも感染。 http://japan.cnet.com/news/service/35079674/ … PC に入って iTunes になりすますソフトがインストールする。 ◇ スタジオジブリが磨き続けてきたアニメ制作ソフト OpenToonz とは何か。オープンソース化を実現。 http://www.4gamer.net/games/999/G999905/20160311122/ … ラスター系で軽量だったことがジブリの採用理由。 ◇ 日本初のUltra HD Blu-rayソフト、4K 夜景 HDR が3月26日発売。 http://av.watch.impress.co.jp/docs/news/20160309_747493.html … 詳細さだけでなく、色の深さもレベルアップ。 ◇ 本当は恐ろしいモノのインターネット。 http://japan.zdnet.com/article/35079698/ … IoT の課題は、値段。 ◇ MS、AIチャットボット Tay を停止。ヒトラー擁護など不適切なツイートの投稿で。 http://japan.cnet.com/news/service/35080128/ … 人々を喜ばせ、楽しませることに価値を置いたはず。皮肉をそのまま解釈したか。 ◇ Intelのプロセス技術開発にブレーキ。TICK TOCKサイクルが終焉。 http://pc.watch.impress.co.jp/docs/news/20160324_749825.html … 2サイクルから3サイクルへ。 ソフトウェアデザイン館 Sage Plaisir 21 ホームページ >>> http://www.sage-p.com/ メルマガ >>> http://www.mag2.com/m/0000083983.html ブログ >>> http://blog.livedoor.jp/sage_p/ ツイッター >>> http://twitter.com/Ts_Neko ダウンロード >>> http://www.sage-p.com/freesoft.htm サポート掲示板 >>> http://www.sage-p.com/kg_ban09/z6037C8.cgi 東日本大震災 >>> http://www.sage-p.com/saigai.html メール >>> ts-neko◇sage-p.com ←◇を@に変えてください 緊急メールは件名に「うどんメール」を付けてください。 このメルマガの登録・解除 - http://www.mag2.com/m/0000083983.htm