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,