Closed1

「ムーザルちゃんねる:プログラミングで良い関数を作るために大切なポイント」を観た

HTMLGOHTMLGO

元動画

https://www.youtube.com/live/xwTrAzweGCY

観ていてとてもいいこと言ってるなー、と思ったのでメモ。
それぞれの再生時間のリンクを貼ってます。
↓↓↓↓↓↓↓↓↓↓↓

「名前が抽象的すぎる」

https://www.youtube.com/live/xwTrAzweGCY?si=VVyUP7ndx4BKhGaF&t=252

基本、関数の中を読まなくても、名前だけで理解できる方がいいよね。

「名前が複雑でわかりにくい」

https://www.youtube.com/live/xwTrAzweGCY?si=mMMheW9zOMnjxzHF&t=352

1つの関数に色々な役割を詰め込み過ぎるやつ。よくやってしまう。
1つの関数は1つの役割にする、などした方が再利用しやすいし、テストも書きやすい。

「名前から想像する挙動と違う」

https://www.youtube.com/live/xwTrAzweGCY?si=mDnt21NPZxMs8KNl&t=375

getData → 外部リソースに依存せず、即時処理
fetchData → 外部リソースに依存する、時間がかる処理

これは目から鱗。
get使いがちだったので、fetchとちゃんと区別して書こうと思う。

https://www.youtube.com/live/xwTrAzweGCY?si=8UFxWcwnI9TkfFrE&t=459

仕様変更に伴って、関数名をちゃんと変えようという話。

createupsert (insertとupdateを両用やる、というのでよく使うらしい)

「引数が6個以上ある」

https://www.youtube.com/live/xwTrAzweGCY?si=UcdGDv_uCPCCdrVu&t=547

こういうメソッドは個人的にも好きじゃ無い。
引数の順番が把握しずらい。

自分の場合は、max3個くらいまでかなー。
オブジェクトにしてしまう派。

function update($a,$b,$c,$d,$e,$f){}

function update($object){
 // $object->a
}

「複数の役割が混じっている」

https://www.youtube.com/live/xwTrAzweGCY?si=mni_unMKYxzj2hLq&t=677

無理に1つにまとめない。
抽象化したつもりが、逆に複雑になって読みづらくなる。
多少処理が被っていても、別関数で分けちゃった方がいい場合もある。
動画でも言っているが、この辺は確かにセンスが要るかもしれない。

「returnが必ず最後」

https://www.youtube.com/live/xwTrAzweGCY?si=3YlYJLHzc8gCpq3N&t=717

早期リターンは完全同意!

演習問題

https://www.youtube.com/live/xwTrAzweGCY?si=2YkbK-eL1CV7Y6ts&t=824

自分でやってみた。
メソッド無しでやったやつ

https://php-play.dev/?c=DwfgDgFmBQ0CQGMCGAnALgAgLwYNrTwHIBLNAUwFtDsA%2BDQwKQZAlRMIBp6wViEzqs6AzAAYh7QgEcArkgB2aUgE8%2BdACwBdVgVwlyVWvUBRDIGSGQCoMbDlx7KMARhFips%2BWiX6ATBuhqA3LDhokAA8AGWIAZ0wcfAwY%2BmZrO01Yw1NrAA4vX3g0AHsAgBtsDCEsgDMclDIkBAgACkRUTCQwjEQIYnyAEwBKAG8CWLgUJHIi-yDQiNw2js7tUkpCNTUMAHpbEV9k-zykQoBqHBmu7U5uXhWAKlaa2e1HOUUljGvamwx91uHybt8AX1gZBqOVauQKvlW6xsAFYBAA2aBAA&v=8.3&f=html


<?php

$cart = [
 ['item' => 'お酒', 'price' => 300, 'quantity' => 4],
 ['item' => 'りんご', 'price' => 100, 'quantity' => 2],
];

$taxList = [
    'お酒' => 10,
    'りんご' => 8
];

$total = 0;

foreach($cart as $child){
    $rate = $taxList[$child['item']] / 100;
    $total += $child['price'] * $child['quantity'] * (1 + $rate);
}

echo $total;
// 1536

このままでもいい気がするが、練習のために関数化してみる。

https://php-play.dev/?c=DwfgDgFmBQ0CQGMCGAnALgAgLwYNrTwHIBLNAUwFtDsA%2BDQwKQZAlRMIBp6wViEzqs6AzAAYh7QgEcArkgB2aUgE8%2BdACwBdVgVwlyVWvUBRDIGSGQCoMbDlx7KMARhFips%2BWiX6ATBuhqA3LABmkjII8gD2MhgA5mRoACpIAB4AMsQAzmgAFACUAN4EGPko0ZIo4fj55eWMLPp2mhUVhMZm%2BgAcefk%2B0AC%2BsAD0vRiAYqqAgyqAdgyAcF6A4c6ASQyAa8qA6frQAUGh4VGxCQBKSOTpcGgJyWnscDJIFGQnqQCiOwCSMjntGMR%2Bezf3jxiFaMXhQgA6Gy%2BCo-P4YfaHVJoXCnc5kNQYAZ2IS%2BHrQfpDYYmQAWDKNAPA6gAgouaLZbBYhhSLRO66GIhA4AGwACpYyO9dCcDvFtuQnqCiiUIaRKNpONxeIiAFRC3TaRxyRSEKUYdI2DAAaghXJ5ZEyaL6A0AFoqAMwZRmh6UgGaNCYB07yWgXJlPWdMZLPFe2Q6CuKVuaAeWD8lpSutyFX2FoZ2AwqOefhChSQCAgHtQmCQKRllD59XykO5OzIUedWwL6WLSWhWSusp0lCV3t9Dz1zzD5sZGpw6xplBdlrdPHZlE5Jd5IPKPX5v0F4cZ%2BoxyIArAIAGzQMhJkJU2IR-tsxCp5vriCbwjAABGKBohF8R83zp3rJTXrQKEkuu8QA&v=8.3&f=html

<?php

$cart = [
 ['item' => 'お酒', 'price' => 300, 'quantity' => 4],
 ['item' => 'りんご', 'price' => 100, 'quantity' => 2],
];

function getTaxList(){
    return [
        'お酒' => 10,
        'りんご' => 8
    ];
}

// 商品の税率を取得
function getTaxRate($taxList, $name, $isEatIn){
    if($isEatIn) return 0.1;
    return $taxList[$name] / 100;
}

// 商品ごとの小計を取得
function getItemTotalPrice($item, $taxRate){
    return $item['price'] * $item['quantity'] * (1 + $taxRate);
}

// 全てのtotalの計算
function getTotalPrice($cart, $isEatIn=false){
    $total = 0;
    foreach($cart as $item){
        $taxRate = getTaxRate(getTaxList(), $item['item'], $isEatIn);
        $total += getItemTotalPrice($item, $taxRate);
    }
    return $total;
}

// 1536
echo getTotalPrice($cart);
echo '<br>';
echo getTotalPrice($cart,true);

商品ごとの小計を取得 → getItemTotalPriceという名前が微妙だ。
動画だと calcSubTotal としていた。なるほどー。

https://www.youtube.com/live/xwTrAzweGCY?si=EYEYlCExLDTHLYhv

このtaxListの配列を引数として渡したくない、というのもなんかわかる。
というわけで修正した。
↓↓↓↓↓↓↓↓↓↓↓v↓


function getTaxList(){
    return [
        'お酒' => 10,
        'りんご' => 8
    ];
}

// 商品の税率を取得
function getTaxRate($name, $isEatIn){
    if($isEatIn) return 0.1;
    return getTaxList()[$name] / 100;
}

// 全てのtotalの計算
function getTotalPrice($cart, $isEatIn=false){
    $total = 0;
    foreach($cart as $item){
        $taxRate = getTaxRate($item['item'], $isEatIn);
        $total += getItemTotalPrice($item, $taxRate);
    }
    return $total;
}

https://php-play.dev/?c=DwfgDgFmBQ0CQGMCGAnALgAgLwYNrTwHIBLNAUwFtDsA%2BDQwKQZAlRMIBp6wViEzqs6AzAAYh7QgEcArkgB2aUgE8%2BdACwBdVgVwlyVWvUBRDIGSGQCoMbDlx7KMARhFips%2BWiX6ATBuhqA3LABmkjII8gD2MhgA5mRoACpIAB4AMsQAzmgAFACUAN4EGPko0ZIo4fj55eWMLPp2mhUVhMZm%2BgAcefk%2B0AC%2BsAD0vRiAYqqAgyqAdgyAcF6A4c6ASQyAa8qA6frQAUGh4VGxCQBKSOTpcDJIFGTscKkAojsAkjI57RjEfnvnVzcYhWjF4UIAdDa%2BFe9PpFonEkqkMplcPtDmQ1BgBnYhL4etB%2BkNhiZABYMo0A8DqACCi5otlsFiGFgWhLroYiE0EgADYABUsZCeuhOtPi23ItwBRRKGFOum0nG4vDhACoBaRKNpHHJFIQJRh0jYMABqAUcrlkTLIvoDQAWioAzBlGaBp9NGeMA6d5LQIksnram0xnMvbIdAnZ4UmRYPz0lI63IVOBm53YDBIu5%2BEKFJAICBu1CYJApKW6Hn1fIhrY7Mjhx053aCmU6SiKz0pC7e3V3YOh%2BnqnDrSmUJ30pmi1mUdmFnX-co9Xkffkh810vWohEAVgEADZoGR4yFyW2XZ3EEma4uIMvCMAAEYoGiEXzb5eOscdniJj1oFCSPtAA&v=8.3&f=html

このスクラップは1ヶ月前にクローズされました