ume

Ruby 拡張性のあるメソッドの作成方法

前書き

友人にコードを見ていただいた際 「この辺拡張性の低いコードやな」と指摘されました。

  • 「そもそも拡張性とは?」

  • 「なんで拡張性の高いコードを書かないといけないの?」

上記2つに対して疑問が湧いたので忘却録かつ誰かの学びに繋がればという想いで記事に残します。

そもそも拡張性とは?

辞書には以下のように言葉の定義されていました

概要 拡張性(extensibility)とは、機器やソフトウェア、システムなどの使用を開始した後に、その中核部分に大きな変更や交換、影響を伴わずに、機能追加や性能向上を行えること。また、そのような性質や能力(の高低)。

⇨要は「新しく機能を追加したときに既存のコードを使い回しできるか」ということ

使いまわせる(既存コード修正不要)⇨拡張性のあるコード.
使いまわせない(既存コード修正が必要)⇨拡張性の低いコード

拡張性のないコード例
class Calculator

#足し算をする処理
 def add(a, b)
  answer =    a + b
  puts answer
 end

end 

calc = Calculator.new
calc.add(1,1)
出力結果2

これは電卓を作成するプログラムとします.
電卓は「足し算、引き算、割り算、掛け算」 ができると思います.
現状足し算の機能しかありません。ここで「引き算の処理」を追加しようと思ったとします.
すると、以下の処理を追加する必要があります。

#引き算の処理
def subtract(a,b)
    answer = a - b
    puts answer
end

これだと新たに処理を追加するたびにメソッドが増えて拡張性がありません(1つのメソッドを使いまわせない)

拡張のあるコード例(1つのメソッドを使いまわせる)
class Calculator
  def calc(a, b,operation)
    answer =  eval("#{a} #{operation} #{b}")
    puts answer
  end
end

calc = Calculator.new
calc.calc(5, 3,"-")  出力結果2

これだとcalc.calc(5, 3,"-")の"-" に好きなもの(+,-など)を入れるだけで足し算、引き算、掛け算、割り算全てできるようになる。

「なんで拡張性の高いコードを書かないといけないの?」

⇨保守性と開発効率が上がる.
要はエラーが発見しやすいコードになる。いろんなとこで使いまわせることで開発効率が上がる.

保守性が上がるとは?
例エラーが出た際(拡張性のないコード)

class Calculator

#足し算をする処理
 def add(a, b)
  answer =    a + b
  puts answer
 end

#引き算の処理
def subtract(a,b)
    answer = a - b
    puts answer
end

end 

calc = Calculator.new
calc.add(1,1)

もし上記のクラス内でエラーが発生した場合addメソッドとsubstractメソッドの2つのメソッドの中の処理を調べる必要がある.

ただ拡張性のあるコードだとcalcメソッド内にエラーがあるとすぐわかる。

class Calculator
  def calc(a, b,operation)
    answer =  eval("#{a} #{operation} #{b}")
    puts answer
  end
end

calc = Calculator.new
calc.calc(5, 3,"-")  出力結果2

まとめ

  • 実務ではコード量が多いので1つのメソッドを他でも使いまわせるようにすることで新機能を実装してもコード量が増えにくいようにする