Slide 1

Slide 1 text

関数を作るときに 気をつけていること YouTube Live (2020.07.23 Thur. 21:00~) CTO と VPoE が初学者向けに講義する オンライン勉強会です。 随時質問なども受け付けていますので、 お気軽にどうぞ。 ハッシュタグ #mu_zaru

Slide 2

Slide 2 text

話す事とゴール 話す事 - 関数とは? - 避けるべきアンチパターン - 関数をつくって学ぶポイント ゴール - 次から関数を書く時に迷わない - 読みやすいコードが書ける 話さない事 - 言語特有のこと - クラスやデザインパターンなど

Slide 3

Slide 3 text

話す人 現役のエンジニア二人 赤貝が好きな CTO と デザイン勉強中のエンジニア @mu_vpoe 最近は SwiftUI で macOS アプリづくりが 趣味 ムー zaru @zaru CTO, Love 赤貝, JavaScript, Firebase, Web Components. Twitter フォロー お願いします!

Slide 4

Slide 4 text

関数とは…?

Slide 5

Slide 5 text

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

Slide 6

Slide 6 text

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

Slide 7

Slide 7 text

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

Slide 8

Slide 8 text

避けるべき アンチパターン

Slide 9

Slide 9 text

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

Slide 10

Slide 10 text

こんな関数は嫌だ 名前が複雑でわかりにくい Bad function updateAndSendEmailByOrderIdWi thTransactionalPayment () {} Good function update () {} function sendEmail () {} function payment () {} もし作った関数名が、良かれと思って具体的な名前をつけた時に あまりにも複雑で分かりにくかった、もしくは名前が思いつかな い場合は、その関数が色んな役割を持ちすぎている可能性があ る。 適切に分割をし、それら関数を呼び出す関数を作るのが良い。

Slide 11

Slide 11 text

プログラム内 プログラム内 こんな関数は嫌だ 名前から想像する挙動と違う Bad function getData () { // データベースや外部 API など // 時間のかかる処理をする } Good function fetchData () { // データベースや外部 API など // 時間のかかる処理をする } get や set などは外部リソースに依存せず即時処理が完了する事 をイメージするが、外部リソースに依存している場合は fetch な ど、想像つくものが名前についていると良い。 get データ データ fetch

Slide 12

Slide 12 text

Bad Good 作った当初は名前と挙動が一致していた が、仕様変更が入った際に、関数名を変更 せずに挙動を変更してしまったケース。 面倒くさがらずに名前もきちんと修正す る。 function create ($data) { // データから新規作成する } function upsert ($data) { // なければデータを作成するが // あったら更新処理をしている } function create ($data) { // データから新規作成する // もし既に存在していたら更新する } 仕様変更が入った こんな関数は嫌だ 名前から想像する挙動と違う

Slide 13

Slide 13 text

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

Slide 14

Slide 14 text

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

Slide 15

Slide 15 text

こんな関数は嫌だ 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 させた方が良い。コード を最後まで読まないと何が返ってくるかが確定できないと、脳内 のメモリがリークしてしまう。 最後まで 読まないと 分からない

Slide 16

Slide 16 text

関数をつくって学ぶ ポイント

Slide 17

Slide 17 text

お題 お店でお買い物をします。各商品の消費税は軽減税率 によって 8% か 10% の違いがあります。消費税を考 慮し、支払い金額を計算してください。 $cart = [ ['item' => 'お酒', 'price' => 300, 'quantity' => 4], ['item' => 'りんご', 'price' => 100, 'quantity' => 2], ]; $taxList = [ 'お酒' => 10, 'りんご' => 8, ]; $ php sample.php 1536

Slide 18

Slide 18 text

追加仕様 イートインの場合は、 消費税が全て 10% になる

Slide 19

Slide 19 text

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

Slide 20

Slide 20 text

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

Slide 21

Slide 21 text

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

Slide 22

Slide 22 text

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

Slide 23

Slide 23 text

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