プログラムをメソッドに切り分ける
//$end_index ソート時に最後に見る配列の位置を指す for($end_index = count($array) - 1; $end_index > 0; $end_index--) { // $1と$1-1を比較し、大きい数値の方を$1に入れる for($i = 1; $i <= $end_index; $i++) { if($array[$i] < $array[$i - 1]) { $temp = $array[$i]; $array[$i] = $array[$i - 1]; $array[$i - 1] = $temp; } } }
こんなプログラムを
// 昇順でソートする function asc_sort($array):array { //$end_index ソート時に最後に見る配列の位置を指す for($end_index = count($array) - 1; $end_index > 0; $end_index--) { for($i = 1; $i <= $end_index; $i++) { if($array[$i] < $array[$i - 1]) { swap($array[$i], $array[$i - 1]); } } } return $array; } // 変数の値を入れ替える function swap(&$a, &$b) { $temp = $a; $a = $b; $b = $temp; }
こんな風にする。
どういう意味を持つか。
swap()
の部分。これをメソッドにしたというのはどういう意味を持つか。
それは、見る人が下のコードの状態でも問題ないということ。
for($i = 1; $i <= $end_index; $i++) { if($array[$i] < $array[$i - 1]) { swap($array[$i], $array[$i - 1]); } }
swapがどんな風に実装されているかわからないけど、それでも問題ないということ。
私達はvar_dump()
の内部実装知らないけど使えてる。
これも抽象化
最初はswapの具体的な実装を見ないようにすれば、swapが私達から見て抽象的な存在と捉えられる。
具体的な実装、swapの中身見なきゃわからない、そりゃそうだ。
そして、メソッド化はいくらでも細かく出来るけど、内部実装がわからなくても問題のないように切り出すべき。
そうすると、『意味のある単位でメソッドを切り出す』ってことがより理解しやすくなる。
$array[$i] < $array[$i - 1]
もメソッドにしたっていいわけだし。
抽象化抽象化というけど、それはimplementsとか、実装がないメソッドを用意することが
即抽象化という意味と考えていると理解が足りないねって思えた。
日記
勉強会で出された何気ない宿題から、いろいろ勉強させてもらってる。
そして、自分の勉強になると思って、あえてツッコミが来るのを期待して破壊的なメソッド書いたら
『次回これが何か説明してねっ☆』って来た。
うへぇ(:3」∠)
とりあえず参照渡しを説明するってことだよね。たぶん。
もしシンボルテーブルの話してまで言われたらまだ無理ぃ(:3」∠)