ホーア式・初級
PHP, Ruby, Tuit, Work July 4th, 2007
仕事メモ。今日のミーティングはむちゃくちゃ面白かった。
=========================================
関数を2種類に分類しよう:
(1)query(accessorなど呼称多数)
(2)command(actionなど呼称多数)
*例外はある。
constructor(初期化したり…)、utility(掟破りでもあると便利なもの)など
■queryとは
SQLのSELECT文のように、実行されてもスタックやオブジェクトの状態に何ら影響を与えない関数
■commandとは
実行されることで状態に何らかの影響がある(副作用がある)
逆にいえば、関数をこの分類に従って書くことで享受出来るメリットがある。
■メリット
明確なやり方でユニットテストを計画、実施することができる。
■ホーア式:pre {command} post
pre状態でcommandを実行、例外が出なければpost状態になると真、という式。
■コードで考える
関数、といってもクラスのメソッドで考えることしか思いつかなかったので、とりあえず簡単なクラスで考えてみた。
===========================================
#!/usr/bin/env ruby
class TestClass
#query型の関数
def testQuery
@testValue
end
#command型の関数
def testCommand
@testValue = "これはテストです。"
end
end
#このクラスをテストする
test = TestClass.new
#pre状態(nilになる)
puts test.testQuery
#command実行
test.testCommand
#post状態(これはテストです。になる)
puts test.testQuery
===========================================
この場合、ホーア式は
test.testQuery === nil;←これがpre
{test.testCommand;}←command
test.testQuery == 'これはテストです。';←大方の予想通りこれがpost
となる。
preとpostを定義して、command実行後にそれぞれの結果を参照すればcommandに対するユニットテストになる。
問題があるとすれば:
commandで例外が発生した場合を考慮する必要がある。
commandで無限ループになった場合、post状態にならないのでホーア式が真偽判定できない。
*できないのだから偽、という考え方もある
ユニットテストでエラー出力レベルを上げる、無限ループはエラーとする、実行時間を仕様として決めて時間がかかりすぎるようであればエラーとする、などのルールで対応可能。