エンジニアのひよこ_level10

毎日更新してた人。たまに記事書きます。

プログラムをメソッドに切り分ける、これはどういう意味を持つんだろう【98日目】

プログラムをメソッドに切り分ける

    //$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」∠)