Slide 1

Slide 1 text

Exercism のすすめ 海外メンターから コードレビューを受けてみた @yukibe 20190731 #phpstudy

Slide 2

Slide 2 text

自己紹介 @yukibe - 自社サービス会社のWebエンジニア - 入社して今日でちょうど1年(●´∀`)ノ - 数年前に趣味で英語勉強してました - 海外ドラマが好き(でも見るのは吹替版) - 写真を撮られるのが苦手

Slide 3

Slide 3 text

今日の話、こんな人に合うと思うよ - プログラミング初心者 - アルゴリズムより組み込み関数の勉強がしたい - 海外の人と英語でコミュニケーションを取りたい - 英語のドキュメントが読めるようになりたい - 気軽に他人のコードを読んでみたい

Slide 4

Slide 4 text

Exercismの概要 - Exercismとは? - はじめかた - すすめかた - Core track - Extra exercises

Slide 5

Slide 5 text

Exercismとは?

Slide 6

Slide 6 text

Exercismとは?

Slide 7

Slide 7 text

はじめかた 公式サイトを見てね! https://exercism.io/

Slide 8

Slide 8 text

すすめかた 1. 課題に必要なファイルをダウンロード 2. 仕様確認 3. 実装 4. テスト 5. 提出 6. メンターからコードレビューをもらう 7. 修正後、再提出 8. 合格

Slide 9

Slide 9 text

Core track

Slide 10

Slide 10 text

- メインの課題 - メンターの承認を受けないと次の課題がアンロックされない - 自己判断で課題を完了することもできるが、以降はその課題について再度メ ンターと交流することができなくなる - 課題完了後は、他の生徒のコードを読むことができる - PHP Trackの課題数は13(2019年7月現在) Core track

Slide 11

Slide 11 text

Extra exercises

Slide 12

Slide 12 text

- 追加演習 - メンターの承認を受けずに先へ進むことができる - 課題完了後は、他の生徒のコードを読むことができる - コードレビューの優先順位は低め - PHP Trackの課題数は53(2019年7月現在) Extra exercises

Slide 13

Slide 13 text

- レビュー前のコード - レビューの内容 - 修正後のコード コードレビューについて

Slide 14

Slide 14 text

例① - 日付を10日加算したオブジェクトを返すメソッド - 今のままだとDateTimeImmutableクラスのオブジェクトしか使えない function addDay1(DateTimeImmutable $date_obj) { return $date_obj->add(new DateInterval('P10D')); } $im_date = new DateTimeImmutable('2019-01-01'); $date = new DateTime('2019-01-01'); var_dump(addDay1($im_date)); // 加算されたDateTimeImmutableオブジェクトが返る var_dump(addDay1($date)); // Fatal Error

Slide 15

Slide 15 text

レビューはこんな感じ The solution to accept both Datetime and DatetimeImmutable objects, is to ensure to clone the argument object and assigning it to a new variable prior to adding time. DateTimeオブジェクトとDateTimeImmutableオブジェクトの両方を使うためには、時間を 加算する前に引数のオブジェクトをcloneして、新しい変数に割り当てると良いよ。 This exercise is a great opportunity to learn the difference between the DateTime and DateTimeImmutable classes. What would happen, if a DateTime object were (first accepted by the function and second) to be passed? この演習はDateTimeクラスとDateTimeImmutableクラスの違いを学ぶ良い機会だ。 DateTimeオブジェクトが(最初に(時間を加算する)関数を通過して、その次に)渡される とどうなるかな?

Slide 16

Slide 16 text

修正したよ - DateTimeクラスとDateTimeImmutableクラスの両方のオブジェクトが使える - DateTimeクラスの場合、オブジェクトの元の値を変えずにメソッドを実行できる function addDay2($date_obj) { $new_date_obj = clone $date_obj; return $new_date_obj->add(new DateInterval('P10D')); } $im_date = new DateTimeImmutable('2019-01-01'); $date = new DateTime('2019-01-01'); var_dump(addDay2($im_date)); // 加算されたDateTimeImmutableオブジェクトが返る var_dump(addDay2($date)); // 加算されたDateTimeオブジェクトが返る var_dump($date); // 加算前のDateTimeオブジェクトが返る

Slide 17

Slide 17 text

例② class Greet { function reply1(string $your_greet): string { $is_question = preg_match('/[\?]/', substr(trim($your_greet), -1)); $is_exclamation = preg_match('/[\!]/', substr(trim($your_greet), -1)); $is_space = preg_match('/^[\s]+$/', $your_greet); // 末尾が?の場合 if ($is_question) { $res = 'Wait a moment.'; // 末尾が!の場合 } elseif ($is_exclamation) { $res = 'You\'re looking well'; // 文字が存在しない場合 } elseif (!$your_greet || $is_space) { $res = 'Pardon?'; } else { $res = 'Hello.'; } return $res; } } $greeting = New Greet; var_dump($greeting->reply1('Hi!')); - 渡された文字列の種類によって異なる返事を するメソッド - 判定用のパラメータを作ってから、if文で処理 を分けている

Slide 18

Slide 18 text

レビューはこんな感じ The verifications on lines 5-7 can be abstracted into separate methods. Thus making it possible to call them only when needed. And lessen the code complexity number by using only if statements together with a direct return. 5〜7行目の検証は別々のメソッドに抽象化することができる。よって、必要なときにだけ そのメソッドを呼び出すことを可能にできる。また、if文だけを使いダイレクトにreturnを返 すことによって、コードの複雑さを減らせるんだ。

Slide 19

Slide 19 text

修正したよ 次ページへ続く>>> class Greet { function reply2(string $your_greet): string { // 末尾が?の場合 if ($this->isQuestion($your_greet)) { return 'Wait a moment.'; } // 末尾が!の場合 if ($this->isExclamation($your_greet)) { return 'You\'re looking well'; } // 文字が存在しない場合 if ($this->isSilence($your_greet)) { return 'Pardon?'; } return 'Hello.'; }

Slide 20

Slide 20 text

- コード量が少ないので利点が分かりにくい&賛否両論かも・・・ - 文字列の判定を別メソッドに分けたので、コードの見通しがよくなった - if文とreturnを一対にしているので、処理の流れが直感的に理解できる function isQuestion(string $your_greet): bool { return preg_match('/[\?]/', substr(trim($your_greet), -1)) ? true : false; } function isExclamation(string $your_greet): bool { return preg_match('/[\!]/', substr(trim($your_greet), -1)) ? true : false; } function isSilence(string $your_greet): bool { return !$your_greet || preg_match('/^[\s]+$/', $your_greet) ? true : false; } } $greeting = New Greet; var_dump($greeting->reply2('Hi!'));

Slide 21

Slide 21 text

- Exercismの良いところ - Exercismのちょっとした欠点 使ってみた感想

Slide 22

Slide 22 text

Exercismの良いところ 1. 無料 2. 英語が学べる 3. プログラミング言語も学べる 4. 他人のコードが読める 5. UIが使いやすい

Slide 23

Slide 23 text

Exercismのちょっとした欠点 1. 進み方が遅い 2. アルゴリズムはあまり学べない 3. 課題の内容が分かりにくい

Slide 24

Slide 24 text

手軽に始められるので、 興味のある方は試してみてください!

Slide 25

Slide 25 text

ご静聴ありがとうございました m(_ _)m