Upgrade to Pro — share decks privately, control downloads, hide ads and more …

初心者がリファクタリングで目をつけるべき場所

Sponsored · SiteGround - Reliable hosting with speed, security, and support you can count on.
Avatar for kirimaru kirimaru
June 24, 2020

 初心者がリファクタリングで目をつけるべき場所

リファクタリングは重要ですが、初めて行う場合はどこから着手していいかわかりません。
この資料では、どういう点に着目すべきかという点を記載いたします。

Avatar for kirimaru

kirimaru

June 24, 2020

More Decks by kirimaru

Other Decks in Technology

Transcript

  1. 話すこと / 話さないこと • リファクタリングをする際に注目す るところ • Code Smells •

    リファクタリングの重要性 • Design Pattern ◦ 私が良く知らない • やらないこと ◦ ライブコーディング 話すこと 話さないこと
  2. どちらがいいコード? if (true) { } if (true) { } if

    (hoge == true){ } if (hoge != false){ } if (きのこの山 > たけのこの里){ } if (たけのこの里 > きのこの山){ }
  3. リファクタリングで勉強する優先度 • アンチパターン ◦ 問題を発見する • 見つける難易度は容易 • 修正も簡単 ◦

    IDEで自動修正できる可能性が ある • ★訓練がしやすい • グッドパターン ◦ 問題を解決する • 解決できれば影響が大きい • 難易度が高い • 覚えると銀の弾丸のように思えてし まって、パターンに振り回されることも ある Code Smells Design Pattern
  4. Code Smells の 一部抜粋 ★ Large Class ★ Long Method

    ★ Long Parameter ★ Duplicate Code ★ Magic Number ★ Comments ★ Arrow ★ Primitive Obsession ★ Feature Envy ★ Data Clumbs
  5. Long Parameter public 学名 find学名( 界, 門, 亜門, 上綱, 綱

    ) パラメータが3つ、4つ以上のメ ソッド。 Interfaceで必要なパラメータ のみを露出させることで、使用 するときはシンプルにできる。 public 学名 find学名( 界 ) { this.find学名( 界, null, null, null, null ); } ・・・
  6. Long Parameter public 学名 find学名( 界, 門, 亜門, 上綱, 綱

    ) または、共通項を見つけて、新 規のクラスにすることも有効。 ※主キー項目で一つのクラス にまとめるのはあり。 public 学名 find学名( 種別 ) public class 種別 { private 界 界; private 門 門; private 亜門 亜門; private 上綱 上綱; private 綱 綱; }
  7. 重複コード。 ただし、判断が難しい。 DRY(繰り返しを避ける)より、 SRP(単一責任の原則)を意識し たほうが良い。 Duplicate Code private static int

    userId = 0; private static int issueId = 0; public static int takeUserId() { return userId++; } public static int takeIssueId() { return issueId++; } private static int id = 0; public static int takeId() { return id++; } // あとから、userIdはUUIDで発行したくなっちゃった… // ※ UUID(Universally Unique Identifier) // 例 (550e8400-e29b-41d4-a716-446655440000) ?
  8. Magic Number 固定値。 単純な数字ではなく、数字に意味 を持たせて表現する。 public void addPlayerPoint(){ switch (point)

    { case 0: this.point = 15; case 15: this.point = 30; case 30: this.point = 40; } } public void addPlayerPoint(){ switch (point) { case ZERO: this.point = ONE; case ONE: this.point = TWO; case THREE: this.point = FOUR; } }
  9. Arrow if が大量に使用されている状態。 早期リターン や 別メソッドに切り出 して、脳みその一時領域を解放して あげるべき。 public void

    arrow(){ if (A != null){ if (B != null){ if (C != null){ if(D != null) {} } } } // ここで、AやBを使うかも… } public void arrow(){ if (A == null){ return; } if (B == null){ return; } ・・・ }
  10. ★ Primitive Obsession プログラムが用意した型しか使って いない状態。 プリミティブ型のint , long等 だけの話ではない。 自作型にすることで、fromXXToYY

    -> toYY だけで伝えられるようになる。 public String fromJaToEn(String ja){ return this.translate(ja); } public English toEn(Japanese ja){ return this.translate(ja); } public abstract class Language{ String 文字; } public class Japanese extends Language{} public class English extends Language{}
  11. ★ Primitive Obsession List や Mapも対象。 単純なListではない限り、 同じListでも違う挙動をする可能性 があるので、別クラスにした方が良 い。

    通称:FCC (First Collection class) public class Duel{ List<Card> deck; // 山札 List<Card> trash; // 捨て札 List<Card> banish; // 除外 } public class Duel{ Deck deck; // 山札 Trash trash; // 捨て札 Banish banish; // 除外 } public class Deck{ List<Card> deck; } …
  12. ★ Feature Envy 別のクラスの値を使用して、処理し ている状態。 対象クラスの情報が流出してしまっ ている。 流出後の処理は追いづらく、リファ クタリングが困難になる。 public

    void Deck{ List<Card> deck; public Card searchMagicCard(){ for(Card card: deck){ String type = card.getType(); if (”magic”.equals(type)) return card; } } } public void Deck{ List<Card> deck; public Card searchMagicCard(){ for(Card card: deck){ if (card.isMagicCard()) return card; } } }
  13. ★ Data Clumbs 本来は一か所で管理されているべき、 データが散らばっている状態。 掲載開始、終了の掲載期間や X, Y, Zの座標等。 public

    class Notice{ String id; String description; LocalDateTime displayStart; LocalDateTime displayEnd; } public class Notice{ String id; String description; Term displayTerm; } public class Term { LocalDateTime start; LocalDateTime end; }
  14. Code Smells の 一部抜粋 ★ Large Class ★ Long Method

    ★ Long Parameter ★ Duplicate Code ★ Magic Number ★ Comments ★ Arrow ★ Primitive Obsession ★ Feature Envy ★ Data Clumbs
  15. Code Smells の 一部抜粋 ★ Large Class ★ Long Method

    ★ Long Parameter ★ Duplicate Code ★ Magic Number ★ Comments ★ Arrow ★ ドメイン知識不足 ◦ Primitive Obsession ◦ Feature Envy ◦ Data Clumbs
  16. 参考資料 および テンプレート • CSD研修 https://www.odd-e.jp/ja/service_csd/ • CSD研修の講師のかたの直近の登壇 Scrum fest Osaka 2020

    テスタビリティが低いシステムのためのテスティングテクニック -ライブコーディング https://confengine.com/scrum-fest-osaka-2020/proposal/14016/-