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)
結論
これらのリファクタリング手法を使用すると、単一責任の原則を順守し、クラスとメソッドを管理できるようになります。
この記事を楽しんだら、友達にも楽しんでもらえるように共有してください🙂
-
Rubyのニューラルネットワーク:それほど怖くない紹介
この投稿では、ニューラルネットワークの基本と、Rubyを利用してそれらを実装する方法を学びます。人工知能とディープラーニングに興味があるが、開始方法がわからない場合は、この投稿が最適です。重要な概念を強調するために、簡単な例を見ていきます。 Rubyを使用して多層ニューラルネットワークを作成することはほとんどありませんが、単純さと読みやすさのために、何が起こっているのかを理解するための優れた方法です。まず、一歩下がって、どうやってここにたどり着いたかを見てみましょう。 映画ExMachniaの静止画。写真クレジット Ex Machinaは2014年に公開された映画です。Googleでタ
-
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,