風 山 堂

(foussin's diary)

冗長なテストコードと、冗長な実行結果と…

 gmcl.pl の挙動をチェックする【其ノ1】↓

#!/usr/bin/perl

# undef-chk.pl  (gmcl.pl の挙動をチェック)

# 引数(座標データ)が『undef』、もしくは『長さ 0』の
# 挙動をチェックするテストコード【其ノ1】(コピペ多用)

# フィクスの目的:
#
#       undef:何もしない(グラフィックコマンドの場合)
#       長さ0:座標の点を打つ

use strict;
use warnings;

require "txt_draw.pl";
require "gmcl.pl";

# 変数初期化
@gmcl::x    = ();
@gmcl::y    = ();
@gmcl::vari = ();
@gmcl::cons = ();
my $str     = "";
my $spc     = "";
my $icode   = "";
my $del_or_shift = "shift";

my ($x0, $y0, $x1, $y1, $len, $deg, $rad, $t);      # 最初は undef

# gmcl::italic は評価する必要なし

print "# box: undef\n";
&gmcl::box($x0, $y0, $x1, $y1);
my @x = @gmcl::x;
my @y = @gmcl::y;
&txt_draw::run(\@x, \@y, $str, $spc, $del_or_shift);

print "# box: 長さ0\n";
&gmcl::box(1, 1, 1, 1);
@x = @gmcl::x;
@y = @gmcl::y;
&txt_draw::run(\@x, \@y, $str, $spc, $del_or_shift);


print "# boxfill: undef\n";
&gmcl::boxfill($x0, $y0, $x1, $y1);
@x = @gmcl::x;
@y = @gmcl::y;
&txt_draw::run(\@x, \@y, $str, $spc, $del_or_shift);

print "# boxfill: 長さ0\n";
&gmcl::boxfill(1, 1, 1, 1);
@x = @gmcl::x;
@y = @gmcl::y;
&txt_draw::run(\@x, \@y, $str, $spc, $del_or_shift);


print "# line: undef\n";
my ($x, $y) = &gmcl::line($x0, $x1, $y0);
print "($x, $y)\n";
@x = @gmcl::vari;                       # 可変データ
@y = @gmcl::cons;                       # 不変データ
&txt_draw::run(\@x, \@y, $str, $spc, $del_or_shift);

print "# line: 長さ0\n";
($x, $y) = &gmcl::line(1, 1, 1);
print "($x, $y)\n";
@x = @gmcl::vari;                       # 可変データ
@y = @gmcl::cons;                       # 不変データ
&txt_draw::run(\@x, \@y, $str, $spc, $del_or_shift);


print "# line2: undef\n";
($x, $y) = &gmcl::line2($x0, $y0, $x1, $y1);
print "($x, $y)\n";
@x = @gmcl::x;
@y = @gmcl::y;
&txt_draw::run(\@x, \@y, $str, $spc, $del_or_shift);

print "# line2: 長さ0\n";
($x, $y) = &gmcl::line2(1, 1, 1, 1);
print "($x, $y)\n";
@x = @gmcl::x;
@y = @gmcl::y;
&txt_draw::run(\@x, \@y, $str, $spc, $del_or_shift);


print "# slash_line: undef\n";
($x, $y) = &gmcl::slash_line($x0, $y0, $len);
print "($x, $y)\n";
@x = @gmcl::x;
@y = @gmcl::y;
&txt_draw::run(\@x, \@y, $str, $spc, $del_or_shift);

print "# slash_line: 長さ0\n";
($x, $y) = &gmcl::slash_line(1, 1, $len);
print "($x, $y)\n";
@x = @gmcl::x;
@y = @gmcl::y;
&txt_draw::run(\@x, \@y, $str, $spc, $del_or_shift);


print "# bslash_line: undef\n";
($x, $y) = &gmcl::bslash_line($x0, $y0, $len);
print "($x, $y)\n";
@x = @gmcl::x;
@y = @gmcl::y;
&txt_draw::run(\@x, \@y, $str, $spc, $del_or_shift);

print "# bslash_line: 長さ0\n";
($x, $y) = &gmcl::bslash_line(1, 1, $len);
print "($x, $y)\n";
@x = @gmcl::x;
@y = @gmcl::y;
&txt_draw::run(\@x, \@y, $str, $spc, $del_or_shift);


print "# distance: undef\n";
$len = &gmcl::distance($x0, $y0, $x1, $y1);
print "len: $len\n";

print "# distance: 長さ0\n";
$len = &gmcl::distance(1, 1, 1, 1);
print "len: $len\n\n";


print "# take_angle: undef\n";
$t = &gmcl::take_angle($x0, $y0, $x1, $y1);
print "theta: $t\n";

print "# take_angle: 長さ0\n";
$t = &gmcl::take_angle(1, 1, 1, 1);
print "theta: $t\n\n";


# 10: ch_num (引数を数値コンテキストで評価する内部関数) 検証不要


print "# deg2rad: undef\n";
$rad = &gmcl::deg2rad($deg);
print "rad: $rad\n";

print "# deg2rad: 角度0\n";
$rad = &gmcl::deg2rad(0);
print "rad: $rad\n\n";


undef $rad;
print "# rad2deg: undef\n";
$deg = gmcl::rad2deg($rad);
print "deg: $deg\n";

print "# rad2deg: 角度0\n";
$deg = gmcl::rad2deg(0);
print "deg: $deg\n";


# 書式1:($tx0, $ty0) = gmcl::div0trap($x0, $y0);      # start of trap
# 書式2:($x, $y) = gmcl::div0trap($x0, $x1, $y1);     # end of trap
# 検証不要…引数は強引に数値に変換され、偽値は 0 となる。これは内部関数
# なので、この関数に辿り着く前に、引数値は適切に変換されているハズ。

# 今回はここまで
__END__

 ご覧のとおり、print 文の羅列なので、実行結果はどんどんスクロールする。まず、エラーが発生しているかをチェック。↓

c:\usr\edit>undef-chk.pl >nul

c:\usr\edit>

 エラー表示は『STDERR』に出力されるので、何かあれば必ず表示される。何も表示されていないので、とりあえず問題なし。じゃ、実行してみる。↓

c:\usr\edit>undef-chk.pl >chk.txt

c:\usr\edit>

 chk.txt の内容。↓

# box: undef


# box: 長さ0

 *

# boxfill: undef


# boxfill: 長さ0

 *

# line: undef
(0, 0)
*

# line: 長さ0
(1, 1)

 *

# line2: undef
(, )


# line2: 長さ0
(1, 1)

 *

# slash_line: undef
(, )


# slash_line: 長さ0
(1, 1)

 *

# bslash_line: undef
(, )


# bslash_line: 長さ0
(1, 1)

 *

# distance: undef
len: 0
# distance: 長さ0
len: 0

# take_angle: undef
theta: 0
# take_angle: 長さ0
theta: 0

# deg2rad: undef
rad: 0
# deg2rad: 角度0
rad: 0

# rad2deg: undef
deg: 0
# rad2deg: 角度0
deg: 0

 見たところ、問題はないと思う。問題はこのあと。

  ・gmcl.pl の挙動をチェックする【其ノ2】

    -----------------
  u 14: circle      【円弧】真円、円弧を描く(簡略版)
    -----------------
  u 15: circle0     【円弧】真円、楕円、円弧を描く(昔の circle 文)
    -----------------
  u 16: rad_lines   【直線】放射状の線を引く
    -----------------
  u 17: not         【効果】反転 (論理演算風)
    -----------------

 実は、gmcl::circle のみ、『半径 0』は『点を打つ』ではなく『何もしない』…そういう例外的な仕様にしたいと思っている。理由はまだ書かないけど。

 ところで、このように冗長なテストコードを書いていると、今、自分が立っている場所が『レガシー・コード』の限界地点かな、と思わざるを得ない。この状況を、仮に自分が神になったつもりで上空から俯瞰したならば…

    そこと、そこのブロックは、アレしたほうが良くない?

…なんてことが、色々と見えてきそうな、そんな予感がする。で、それこそがオブジェクト指向への入り口となるんじゃないだろうか。。。そんなことをぼんやりと思ったりしている。

 そういう意味では、保守管理を前提とした OOP なら、これらのコードはどう書き直すことができるか、そういう意味で、この冗長なコードを踏み台してもらえれば、それはそれでいいかな、と思う。

f:id:foussin:20120110193903j:plain

f:id:foussin:20120110194019j:plain

 じゃ、そういうことで。