5.メソッドの抽出

こんにちは管理人(@vip___p)です。

今回はリファクタリング/メソッドの抽出について触れていこうと思います。

初めて現場に出てたら色々驚かされます。
データ量の多さクラスの多さ長すぎるメソッド

今回行いたいのは似たような処理で
長すぎメソッドを短くして読みやすくしたいと思います。

リファクタリングについては下記の記事で簡単にまとめているので是非参考にしてください。

下記のような方は是非参考にしてください。

  • Java初学者
  • Java初学者
  • リファクタリングについて興味がある方
  • リファクタリングについて興味がある方

書籍:[Java言語で学ぶリファクタリング入門]
ヌルオブジェクトについて触れていきます。

[itemlink post_id=”4177″]

メソッドの抽出

とりあえず簡単なクラスを確認していきましょう。

改善前のコード

改善前のコード

public class Banner{  
  private final String content;
  public Banner(String content) {
  _content = content;
  }
  public void  print(int time){
  // 枠線
  System.out.print("+");
  for(int i = _content.length()l i++) {
    System.out.print("-");
  }
  System.out.print("+");

  // 文字列の内容
  for(int i = 0; i < times; i++) {
    System.out.print(":"+ _content +":");
  }
  // 枠線
  System.out.print("+");
  for(int i = _content.length()l i++) {
    System.out.print("-");
  }
    System.out.print("+");
  }
}
  public class Main {
  public static void main(String[] args) {
    Banner hello =  new Banner("result")
    hello.print(1)
  }
}

出力結果
+——+
:result:
+——+

内容としては要素数を[]で出力して
外枠の[+]はfor分の外で出力しています。

ここで注目してほしいのは重複しているコードがある点です。
上枠と下枠もコードの中身はすべて同じという点です。
今回は短いコードですが、内容を分かりやすくするためです。

改善後のコード

いくつか手順が簡単にですが紹介します。

  • メソッドの名前を考える
  • メソッド作成
  • 元コード削除

メソッド名を考えてみましょう。

[動詞+名詞]の順番が基本です。

何をするかを明確にすることが重要です。

printBorder

どのように」実装するかという名前を付けてしまうと

変更が生じた際メソッド名を作り直す必要があるからです。

何百とあるメソッドを作り直すなんてしたくないですよね。

それほど名前というものは重要になります。

初めのころは少し悩みますが意識していると徐々に慣れてきます。

メソッド作成

元のメソッドからコードをコピーしましょう。

private void printBorder() {
System.out.print("+");
for(int i = _content.length()l i++) {
System.out.print("-");
}
System.out.print("+");
}

このクラスだけで使用する目的なので
修飾子は今回privateとしています。
むやみにpublicにしないように注意してください。

public class Banner {
private final String content;
public Banner(String content) {
_content = content;
}
public void print(int time) {
printBorder();
printContent(time);
printBorder();
}
private void printBorder() {
System.out.print("+");
for(int i = content.length()l i++) {
System.out.print("-");
}
System.out.print("+");
}
private void printContent(int time) {
for(int i=0 i<times; i++) {
System.out.println(":"+ _content +":")
}
}
}

printメソッドの部分がだいぶスッキリしました。

まとめ

今回のまとめです。

メソッドの抽出について紹介しました。

メリットとしては振る舞いを変えず処理がわかりやすくなることです。

ですが捕らわれすぎないように注意してください。

皆さんの参考になれば幸いです。

[itemlink post_id=”4177″]