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

混乱せずにモンキーパッチを適用する3つの方法

モンキーパッチ。初めてRubyを試してみると、すばらしいです。コアクラスにメソッドを直接追加できます! Time.now.advance(days: -1)を呼び出す必要はありません 、1.day.agoと書くことができます !それはRubyを読み書きする喜びにします。まで…

パッチがHashを変更したため、奇妙なバグが発生しました 。

どのコードが実際に実行されたかについて混乱するため、コードが壊れたときにデバッグすることはできません。

そして、6か月前に、Enumerableにモンキーパッチを適用したときに、すべての問題が発生したことがようやくわかりました。 1行のコードを5文字短くします。

しかし、代替手段は何ですか?まったく便利ではありませんか? GroupableArray.new([1, 2, 3, 4]).in_groups_of(2)のようなコード ? blank? 優れたユーザー入力処理が許可される前に、コアRubyにするためですか?

モンキーパッチを完全に諦めたくはありません。 しかし、しないモンキーパッチをどのように書くことができますか 次回彼らに会ったときに無能で自分を解雇したくなりますか?

モジュールに入れます

クラスにモンキーパッチを適用するときは、クラスを再度開いてパッチを適用しないでください。

class DateTime
  def weekday?
    !sunday? && !saturday?
  end
end

なぜですか?

  • 2つのライブラリが同じメソッドにモンキーパッチを適用した場合、わかりません。

    最初のモンキーパッチは上書きされ、永久に消えます。

  • エラーがある場合は、DateTime内でエラーが発生したように見えます 。

    技術的には真実ですが、それほど役に立ちません。

  • モンキーパッチをオフにするのは難しいです。

    パッチ全体をコメントアウトするか、パッチなしでコードを実行する場合は、モンキーパッチファイルの要求をスキップする必要があります。

  • たとえば、require 'date'を忘れた場合 このモンキーパッチを実行する前に、誤って再定義することになります。 DateTime パッチを当てる代わりに。

代わりに、モンキーパッチをモジュールに入れてください:

module CoreExtensions
  module DateTime
    module BusinessDays
      def weekday?
        !sunday? && !saturday?
      end
    end
  end
end

このようにして、関連するモンキーパッチをまとめて整理できます。エラーが発生した場合、問題のコードがどこから来たのかが正確にわかります。 一度に1つのグループを含めることができます:

# Actually monkey-patch DateTime
DateTime.include CoreExtensions::DateTime::BusinessDays

パッチが不要になった場合は、その行をコメントアウトしてください。

それらを一緒に保つ

コアクラスにモンキーパッチを適用する場合は、コアRubyAPIに追加します。コアパッチを適用したすべてのアプリは、少し違った感じがします。 したがって、新しいコードベースにジャンプするときに、これらの変更をすばやく学習する方法が必要です。 モンキーパッチがどこにあるかを知る必要があります。

私は主にRailsのモンキーパッチの慣習に従います。パッチはlib/core_extensions/class_name/group.rbに入ります 。したがって、このパッチ:

module CoreExtensions
  module DateTime
    module BusinessDays
      def weekday?
        !sunday? && !saturday?
      end
    end
  end
end

lib/core_extensions/date_time/business_days.rbに移動します 。

新しい開発者なら誰でも、lib/core_extensions内のRubyファイルを参照できます。 Rubyに何を追加したかを学びましょう。 そして、彼らは実際に使用します 邪魔になるメソッドではなく、あなたが書いた便利な新しいメソッド。

エッジケースを検討する

Enumerableの理由がわかりません sumがありません 方法。よくあることですが、[1, 2, 3].sumと書けたらいいのにと思います。 、または["a", "b", "c"].sum 、または[Article.new, Article.new, Article.new].sum …ああ。

クラスにモンキーパッチを適用するときは、通常、簡単にしたいことを1つ考えています。 数値の合計を計算したいが、配列が他のものを保持できることを忘れてください。

今のところ、それは理にかなっています。 あなたは ハッシュの束の平均を計算しようとしないでください。ただし、メソッドを呼び出すときに失敗するだけのオブジェクトにメソッドをアタッチすると、後で混乱することになります。

これにはいくつかの方法で対処できます。最高から最低へ:

  • 予期しない入力を合理的に処理します。

    これは、パッチが文字列で機能する場合にうまく機能します。 to_sを呼び出すと、ほとんどすべてのものから妥当なものを得ることができます 最初にそれに。そして、Confident Rubyは、さまざまな種類の入力を処理するためのさまざまな方法を教えてくれます。

  • エラーをより明確に処理します。

    これは、ArgumentErrorをスローするのと同じくらい簡単です。 予期しない入力が表示されたときに、良いメッセージが表示されます。ランダムなNoMethodErrorを理解している他の誰かに依存しないでください s。

  • コメントに期待する入力の種類を文書化します。

    他の2つのオプションは、使用できる場合はより適切です。ただし、パッチ内のエッジケースを確認できない場合は、少なくともそれらを文書化してください。そうすれば、発信者が問題の原因となっているのがパッチであることがわかると、発信者はあなたが何をしようとしていたかを知ることができます。

これまでで一番好きなモンキーパッチ

最後に、私の大好きなモンキーパッチHash#string_mergeを残しておきたいと思います。 :

lib / core_extensions / hash / mergeing.rb
module CoreExtensions
  module Hash
    module Merging
      def string_merge(other_hash, separator = " ")
        merge(other_hash) {|key, old, new| old.to_s + separator + new.to_s}
      end
    end
  end
end

{}.string_merge({:class => "btn"}) # => {:class=>"btn"}

h = {:class => "btn"} # => {:class=>"btn"}
h.string_merge({:class => "btn-primary"}) # => {:class=>"btn btn-primary"}

これにより、CSSクラスをHTML要素にアタッチできます so はるかに良い。

敏感なモンキーパッチ

モンキーパッチのコアクラスはすべて悪いわけではありません。うまくやれば、コードはRubyのように感じられます。 ただし、Rubyの鋭いエッジと同様に、使用する場合は特に注意する必要があります。

パッチをまとめてモジュールにグループ化し、予期しない事態に対処すれば、モンキーパッチは可能な限り安全になります。

これまでで最高のモンキーパッチは何ですか 書いた(または見た)?コメントを残して、それについて教えてください!


  1. Word を使用しない Excel での差し込み印刷 (2 つの適切な方法)

    差し込み印刷の方法を探しています エクセルで 単語なし ?次に、これはあなたにぴったりの場所です。 Microsoft Word の場合 何らかの理由で利用できません。差し込み印刷を実行しています トリッキーになります。ただし、 Word であるため、不可能ではありません。 差し込み印刷の実行に必須ではありません オペレーション。この記事では、 2 を紹介します。 VBA マクロ 差し込み印刷 エクセル 単語なし . 差し込み印刷 誰かまたは会社が、名前、受信者のメール アドレス、または受信者のアドレスなどを少し変更して大量のメールを送信したい場合。次に、関係者は、ニーズを満たすた

  2. データを失うことなくWindows 11を工場出荷時設定にリセットする3つの方法

    Windows 11 PC で問題が発生し、多くの解決策を適用しても解決しない場合があります。最後の手段として、Windows 11 を出荷時設定にリセットします。 PC は、問題を解決し、システム パフォーマンスを向上させるのに役立ちます。 Windows 11 PC の速度が遅い、または問題が発生している場合は、工場出荷時の設定にリセットして、最も一般的な問題を修正し、全体的なパフォーマンスを向上させることができます。この投稿では、Windows 11 をリセットする方法について説明しています ([この PC をリセット] オプションを使用して) データを失うことなくデフォルト設定に戻しま