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

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

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

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

kirimaru

June 24, 2020
Tweet

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/-