Ruby
 Computer >> コンピューター >  >> プログラミング >> Ruby

Rubyリファクタリングテクニック:はじめに

この用語に慣れていない場合、リファクタリングとは、コードの機能を変更せずにコードの品質を向上させる行為です。これにより、コードの操作が非常に簡単になります。

この投稿では、いくつかの一般的なRubyリファクタリング手法を学習します

始めましょう!

抽出メソッド

最も一般的なリファクタリングの1つは、「抽出メソッド」として知られているものです。このリファクタリングでは、コードを古いメソッドから新しいメソッドに移動します。これにより、わかりやすい名前の小さなメソッドを使用できるようになります。

例を見てみましょう:

@sold_items = %w( onions garlic potatoes )

def print_report
  puts "*** Sales Report for #{Time.new.strftime("%d/%m/%Y")} ***"
  @sold_items.each { |i| puts i }
  puts "*** End of Sales Report ***"
end

このメソッドの最も醜い部分である現在の日付生成を抽出することから始めることができます。

def print_report
  puts "*** Sales Report for #{current_date} ***"
  @sold_items.each { |i| puts i }
  puts "*** End of Sales Report ***"
end

def current_date
  Time.new.strftime("%d/%m/%Y")
end

これはすでに読みやすくなっていますが、もう少し先に進むことができます。このコードを作成するために、さらにいくつかのメソッドを抽出してみましょう。

def print_report
  print_header
  print_items
  print_footer
end

def print_header
  puts "*** Sales Report for #{current_date} ***"
end

def current_date
  Time.new.strftime("%d/%m/%Y")
end

def print_items
  @sold_items.each { |i| puts i }
end

def print_footer
  puts "*** End of Sales Report ***"
end

はい、コードは長くなりましたが、これは読みやすくなりませんか?小さなメソッドを恐れないでください。コードに適しています。

リファクタリング条件付き

複雑な条件をメソッドにリファクタリングして、読みやすくすることもできます。

def check_temperature
  if temperature > 30 && (Time.now.hour >= 9 && Time.now.hour <= 17)
    air_conditioner.enable!
  end
end

このifの2番目の部分 ステートメントは非常に読みやすいものではないので、メソッドに抽出してみましょう:

def check_temperature
  if temperature > 30 && working_hours
    air_conditioner.enable!
  end
end

def working_hours
  Time.now.hour >= 9 && Time.now.hour <= 17
end

ここで行ったことは、条件にわかりやすい名前を付けることです。これにより、このコードの将来の読者(あなたを含む)にとって非常に簡単になります。

メソッドをメソッドオブジェクトに置き換える

時々あなたは制御不能になった大きな方法を持っています。この場合、大きなメソッドには多くのローカル変数がある傾向があるため、リファクタリングが難しい場合があります。 1つの解決策は、「メソッドオブジェクト」リファクタリングを使用することです。

「大きなメソッドは、クラスが隠れるようになる場所です。」 -ボブおじさん

例を見てみましょう:

require 'socket'

class MailSender
  def initialize
    @sent_messages = []
  end

  def send_message(msg, recipient = "rubyguides.com")
    raise ArgumentError, "message too small" if msg.size < 5

    formatted_msg = "[New Message] #{msg}"

    TCPSocket.open(recipient, 80) do |socket|
      socket.write(formatted_msg)
    end

    @sent_messages << [msg, recipient]

    puts "Message sent."
  end
end

sender = MailSender.new
sender.send_message("testing")

リファクタリングを実行するために、新しいクラスを作成し、ローカル変数をインスタンス変数に昇格させることができます。これにより、データの受け渡しを心配することなく、このコードをさらにリファクタリングできるようになります。

おい! Rubyのスキルを大幅に向上させたいですか?私の美しいルビーコースをチェックしてください🙂

これはMailSenderです リファクタリング後のクラス:

class MailSender
  def initialize
    @sent_messages = []
  end

  def deliver_message(message)
    send(message)
    @sent_messages << message
    puts "Message sent."
  end

  def send(msg)
    TCPSocket.open(msg.recipient, 80) { |socket| socket.write(msg.formatted_msg) }
  end
end

そして、これは私たちが導入した新しいクラスです:

class Message
  attr_reader :msg, :recipient

  def initialize(msg, recipient = "rubyguides.com")
    raise ArgumentError, "message too small" if msg.size < 5

    @msg       = msg
    @recipient = recipient
  end

  def formatted_msg
    "[New Message] #{msg}"
  end
end

sender = MailSender.new
msg    = Message.new("testing")

sender.deliver_message(msg)

結論

これらのリファクタリング手法を使用すると、単一責任の原則を順守し、クラスとメソッドを管理できるようになります。

この記事を楽しんだら、友達にも楽しんでもらえるように共有してください🙂


  1. Rubyのニューラルネットワーク:それほど怖くない紹介

    この投稿では、ニューラルネットワークの基本と、Rubyを利用してそれらを実装する方法を学びます。人工知能とディープラーニングに興味があるが、開始方法がわからない場合は、この投稿が最適です。重要な概念を強調するために、簡単な例を見ていきます。 Rubyを使用して多層ニューラルネットワークを作成することはほとんどありませんが、単純さと読みやすさのために、何が起こっているのかを理解するための優れた方法です。まず、一歩下がって、どうやってここにたどり着いたかを見てみましょう。 映画ExMachniaの静止画。写真クレジット Ex Machinaは2014年に公開された映画です。Googleでタ

  2. Ruby2.6の9つの新機能

    Rubyの新しいバージョンには、新しい機能とパフォーマンスの改善が含まれています。 変更についていきますか? 見てみましょう! 無限の範囲 Ruby 2.5以前のバージョンは、すでに1つの形式の無限範囲をサポートしています( Float ::INFINITY を使用) )、しかしRuby2.6はこれを次のレベルに引き上げます。 新しい無限の範囲 次のようになります: (1..) これは、(1..10)のような終了値がないため、通常の範囲とは異なります。 。 使用例 : [a, b, c].zip(1..) # [[a, 1], [b, 2], [c, 3]] [1,2,3,