関数を作るときに気をつけていること(PHPで説明)

 関数を作るときに気をつけていること(PHPで説明)

配信動画はこちら
https://www.youtube.com/watch?v=xwTrAzweGCY

もし良かったらムーザルちゃんねるのチャンネル登録お願いします!
https://www.youtube.com/channel/UCLPHXwLp90A5R69Eltxo-sg

Twitter でもプログラミングネタをつぶやいているのでフォローお待ちしております。
ムー
https://twitter.com/mu_vpoe
zaru
https://twitter.com/zaru

C302e84057a922dce0ecbe80207e3fcc?s=128

mu_zaru

July 23, 2020
Tweet

Transcript

  1. 関数を作るときに 気をつけていること YouTube Live (2020.07.23 Thur. 21:00~) CTO と VPoE

    が初学者向けに講義する オンライン勉強会です。 随時質問なども受け付けていますので、 お気軽にどうぞ。 ハッシュタグ #mu_zaru
  2. 話す事とゴール 話す事 - 関数とは? - 避けるべきアンチパターン - 関数をつくって学ぶポイント ゴール -

    次から関数を書く時に迷わない - 読みやすいコードが書ける 話さない事 - 言語特有のこと - クラスやデザインパターンなど
  3. 話す人 現役のエンジニア二人 赤貝が好きな CTO と デザイン勉強中のエンジニア @mu_vpoe 最近は SwiftUI で

    macOS アプリづくりが 趣味 ムー zaru @zaru CTO, Love 赤貝, JavaScript, Firebase, Web Components. Twitter フォロー お願いします!
  4. 関数とは…?

  5. 関数って何? f(x) input output 何かを与えると、一定の法則で、何かが得られるもの = 関数

  6. 関数って、いつ作るの? f(x) 処理をまとめて、名前だけで呼びたくなった時 処理を他の場所でも呼びたくなった時 処理 可読性 再利用性

  7. 名前重要 f(x) 関数にする処理に付ける名前が重要 - 曖昧な名前をつけない - 難しすぎる名前にしない - プロジェクト内の命名規則は統一させる -

    省略しすぎない なんで呼ぶ?
  8. 避けるべき アンチパターン

  9. こんな関数は嫌だ 名前が抽象的すぎる Bad function exec () {} Good function updateUserData

    () {} 抽象的で名前からは具体的に何をするのかが読み取れな い。そのような関数は、実装コードを読む必要があるの で可読性が低い。 動詞 + 目的語 で作るケースが多い。 (*) クラスメソッドなど適切な名前空間がある場合は、 クラス名が prefix になることがあるので省略されても読みやすいこともある
  10. こんな関数は嫌だ 名前が複雑でわかりにくい Bad function updateAndSendEmailByOrderIdWi thTransactionalPayment () {} Good function

    update () {} function sendEmail () {} function payment () {} もし作った関数名が、良かれと思って具体的な名前をつけた時に あまりにも複雑で分かりにくかった、もしくは名前が思いつかな い場合は、その関数が色んな役割を持ちすぎている可能性があ る。 適切に分割をし、それら関数を呼び出す関数を作るのが良い。
  11. プログラム内 プログラム内 こんな関数は嫌だ 名前から想像する挙動と違う Bad function getData () { //

    データベースや外部 API など // 時間のかかる処理をする } Good function fetchData () { // データベースや外部 API など // 時間のかかる処理をする } get や set などは外部リソースに依存せず即時処理が完了する事 をイメージするが、外部リソースに依存している場合は fetch な ど、想像つくものが名前についていると良い。 get データ データ fetch
  12. Bad Good 作った当初は名前と挙動が一致していた が、仕様変更が入った際に、関数名を変更 せずに挙動を変更してしまったケース。 面倒くさがらずに名前もきちんと修正す る。 function create ($data)

    { // データから新規作成する } function upsert ($data) { // なければデータを作成するが // あったら更新処理をしている } function create ($data) { // データから新規作成する // もし既に存在していたら更新する } 仕様変更が入った こんな関数は嫌だ 名前から想像する挙動と違う
  13. こんな関数は嫌だ 引数が6個以上ある Bad function update ( $a, $b, $c, $d,

    $e, $f ) { } Good function update ($object) { // $object->a } 引数が多すぎると呼び出す側も覚えるのが大変だし、関数側も煩 雑になる。もし、色々なデータを渡す必要がある場合は、オブ ジェクトなど構造化されたデータにして渡すと良い。
  14. こんな関数は嫌だ 複数の役割が混じっている Bad function update ($arg) { if ($arg ==

    'hoge') { // 複雑で↓と全然違う処理 } else if ($arg == 'piyo') { // 複雑で↑と全然違う処理 } } Good function updateHoge () {} function updatePiyo () {} 1つの関数で、ロジックが異なるものを無理やりまとめない。 抽象化すると両方ともデータを更新するという意味で同じだが、 更新対象やデータ構造が異なる場合は、素直に別関数にした方が 良い。
  15. こんな関数は嫌だ return が必ず最後 Bad function update ($data) { $result =

    validate($data); if ($result) { // 更新処理など $result = true; } else { $result = false; } return $result; } Good function update ($data) { $result = validate($data); if (!$result) { return false; } // 更新処理など return true; } 早めに返せる状況であればすぐ return させた方が良い。コード を最後まで読まないと何が返ってくるかが確定できないと、脳内 のメモリがリークしてしまう。 最後まで 読まないと 分からない
  16. 関数をつくって学ぶ ポイント

  17. お題 お店でお買い物をします。各商品の消費税は軽減税率 によって 8% か 10% の違いがあります。消費税を考 慮し、支払い金額を計算してください。 $cart =

    [ ['item' => 'お酒', 'price' => 300, 'quantity' => 4], ['item' => 'りんご', 'price' => 100, 'quantity' => 2], ]; $taxList = [ 'お酒' => 10, 'りんご' => 8, ]; $ php sample.php 1536
  18. 追加仕様 イートインの場合は、 消費税が全て 10% になる

  19. これが完全な正解というわけで はなく要件によって変わるので あくまで参考ということで

  20. 関数にすることで、コードを読まずに名前から処 理する内容をイメージすることができる。 Point 1 長い… ☺ スッキリ

  21. どこまで 使うんだろう? 変数がどの範囲で使われているかを、頭の中に記 憶しながらコードを読まないといけない。変数の 数を減らして可読性を上げる。 Point 2

  22. 税率計算の中に テイクアウトの条 件分岐が隠蔽され てスッキリ 関心のあることを1箇所に集める Point 3 テイクアウトかど うかは税率計算に に関係があるな…

  23. ありがとうございました! 次回は正規表現をやります! 木曜21時から30分 質問感想など呟いていただけると嬉しいです! - ハッシュタグ #mu_zaru - ツイッター情報 @mu_vpoe チャンネル登録

    Good ボタン お願いします! ムーザルちゃんねる