2005-07-29
_ 整然
以前 djb なプログラムのうち if が整然と並んでいて美しいなあなどと感心したのだけどどのプログラムだったかと探してみた。
たとえば dnsq.c の main() のところ。
int main(int argc,char **argv)
{
uint16 u16;
dns_random_init(seed);
if (!*argv) usage();
if (!*++argv) usage();
if (!parsetype(*argv,type)) usage();
if (!*++argv) usage();
if (!dns_domain_fromdot(&q,*argv,str_len(*argv))) oops();
if (!*++argv) usage();
if (!stralloc_copys(&out,*argv)) oops();
if (dns_ip4_qualify(&ip,&fqdn,&out) == -1) oops();
if (ip.len >= 64) ip.len = 64;
byte_zero(servers,64);
byte_copy(servers,ip.len,ip.s);
if (!stralloc_copys(&out,"")) oops();
uint16_unpack_big(type,&u16);
if (!stralloc_catulong0(&out,u16,0)) oops();
if (!stralloc_cats(&out," ")) oops();
if (!dns_domain_todot_cat(&out,q)) oops();
if (!stralloc_cats(&out,":\n")) oops();
if (resolve(q,type,servers) == -1) {
if (!stralloc_cats(&out,error_str(errno))) oops();
if (!stralloc_cats(&out,"\n")) oops();
}
else {
if (!printpacket_cat(&out,tx.packet,tx.packetlen)) oops();
}
buffer_putflush(buffer_1,out.s,out.len);
_exit(0);
}
このように関数や機能の「 契約 」がしっかりしているとテストしやすいのでありますな。
「 契約 」とは、関数でいえば「 この引数を渡すとこの戻り値が返る 」ということを保証するもの。
プログラムのテストというのはこの「 契約 」についてテストするのであります。むしろ「 契約 」がないとテストできない。
「 契約 」については達人プログラマーに書いてあったのだだったか。
4894712741




それはそこのメロンがあるからw
「 そこにあるから 」って、マロリー病か笑
関数の先頭での引数や関数戻り時の戻り値が許容範囲内に収まってるか確認するのは普通なんじゃ?<br>これやっておかないと、いつセグメンテーションフォルトが起こるか判らないし。<br>まぁ、この判定文=単体検査項目とも言えるけど。