PHPのプログラミングに慣れてきた初心者のコードを見ると、ひたすら上から下へと書き連ねられていて、やたらに長い。思いつくままのコーディングはバグが出ても原因の発見に時間がかかる。また、書いてから時間の経ったコードは書いた本人でさえ思い出すのに苦労する。
理路整然としたコードを書くにはクラスなどオブジェクトという概念も必要だが、ここでは初心者を脱皮するために自作関数の有効性と注意点を記しておこうと思う。
下の<サンプルコード1>は、3つの文字列変数の中に含まれる「ガ」と発音する文字の数を求めるもの。
実行すると見事に「・・・3個有ります。」と表示される。結果オーライだ(ヤッター!)。
しかし、初心者を脱皮するにはこれではいけない。
例えば、上司から変更命令が出た。内容は「ガ」では無く「サ」の数を、しかも ’サ’ では無く ’さ’ で検索するようにというわけだ。このコードだけならば数箇所直すだけですむが、こっちのページあっちのページといろんな所にこの処理が入っていたとしたら、あなたはきっと上司を恨むでしょう。(簡単に変更変更って言うなよぅ)
確かに、仕様の変更なんて度々あってはたまらん。でも大小問わず変更はプログラミングには付き物。だからこそメンテしやすいコーディングが必要となる。
では<サンプルコード1>をどのようにすれば中級と呼ばれるコードになるか。
このコードをじっくり眺めると、ちょっとだけ違う同じようなことを3回繰り返している。
この ”同じような” ところを関数にできないか、またどうしたら保守性がアップするかを常に頭に置くようにしたい。
慣れてくれば自然にコーディングの手順が見えるようになる。
<サンプルコード1>
<?php
$str1 = “あさがお”;
$str2 = “ゴアイサツガアリマセン”;
$str3 = “ガンバリマショウ”;
$str1_temp = mb_convert_kana($str1, “CHKV”);
$str1_temps = mb_split(‘ガ’,$str1_temp);
$num1_count = count($str1_temps) – 1;
$score = $score + $num1_count;
$str2_temp = mb_convert_kana($str2, “CHKV”);
$str2_temps = mb_split(‘ガ’,$str2_temp);
$num2_count = count($str2_temps) – 1;
$score = $score + $num2_count;
$str3_temp = mb_convert_kana($str3, “CHKV”);
$str3_temps = mb_split(‘ガ’,$str3_temp);
$num3_count = count($str3_temps) – 1;
$score = $score + $num3_count;
echo ‘「ガ」と発音する文字は全部で ‘ . $score . ‘個 有りました。’;
?>
関数を利用したコードが下の<サンプルコード2>だ。
上から順に解説すると・・・
文字列はループ処理しやすいように配列に入れた。
配列の初期化・代入の方法はいくつかあるので調べてみると良い。
$score = 0; は無くても結果は変わらない。
PHP は変数宣言が必要ない。これは楽なのだが、変数が増えてくるとどれが何を意味していたのかわからなくなってくる。
そこで、主要な変数は変数宣言の意味で初期化しておくと後でメンテしやすい。
<サンプルコード1>の12行分がこの for文 たった1行に集約されている。自作関数のお陰だ。
もっともこの for文 は省略形式で書いているので1行だが、ちゃんと{}を使って改行してコーディングする方が見やすい。
function からが自作関数の宣言になる。関数名は char_counter と付けた。
() の中の $str が 引数 と呼ばれるもの。ここでは対象の文字列が入る。
return は 戻り値 を指定している。この 関数 は実行すると数値を返してくることがわかる。
今回の関数は引数と戻り値の有るパターンを紹介したが、無いパターンも存在する。
引数の無いものや戻り値の無い関数の解説はまたの機会に。
<サンプルコード2>
<?php
$strs[0] = “あさがお”;
$strs[1] = “ゴアイサツガアリマセン”;
$strs[2] = “ガンバリマショウ”;
$score = 0; //スコアの初期化
for($i=0; $i<count($strs); $i++) $score += char_counter($strs[$i]);
echo ‘「ガ」と発音する文字は全部で ‘ . $score . ‘個 有りました。’;
//文字を検索してその数を求める
//($str=対処の文字列、戻り値=文字の数)
function char_counter($str)
{
$str_temp = mb_convert_kana($str, “CHKV”);
$str_temps = mb_split(“ガ”,$str_temp);
$num_count = count($str_temps) – 1;
return $num_count;
}
?>
もう一度 for文 の行を見て欲しい。
char_counter に文字列を一つ入れると数値が返ってくる。それを $score に加算している。
関数はよくブラックボックスに例えられる。黒い箱(関数)に文字列(引数)を入れて振る(実行)と数値(戻り値)が出てくる。関数の完成度が高ければその内容を意識する必要は無い。つまり利用者にとってはその関数の使い方だけを知っていれば良いという事になる。echo や mb_split といった関数と同じように。
次回は、このコードをさらにメンテし易いように function 宣言部を別ファイルにして、インクルードして関数を使用する方法を記したい。
Recent Comments