4

システムの特定の機能を有効/無効にするために、機能フラグを使用しています。

コード自体に機能フラグを追加する標準的な方法について、同僚と話し合いました。

次の方法を検討してください。

def featured_method
  do_this
  do_that
end

このメソッドは、コード内の約 15 の異なる場所から呼び出されています。

このメソッドを呼び出すたびに、機能が有効になっているかどうかのチェックを追加することをお勧めしますか?

if feature_enabled?(:feature_key)
  featured_method
end

または、次のように、featured_method 自体の内部で:

def featured_method
  if feature_enabled?(:feature_key)
    do_this
    do_that
  end
end

メソッド自体の中に条件があることの利点は明らかです。コードをドライアップすることと、機能を永続的に追加したい場合は、メソッド内から条件を削除するだけでよいという事実です。

featured_methodすべての呼び出しの前に条件を設定する利点は、コード自体に入ることなく、そのメソッドが実行されるかどうかが非常に明確であることです。これにより、多くの頭痛の種を減らすことができます。

この種の問題に対する別の解決策または標準があるかどうか疑問に思っていました。

4

2 に答える 2

3

私は両方のアプローチをマージします。

これにより、呼び出し側で DRY コードが発生します。の SRP に違反せず、feature_method何が起こっているかを明確に伝えます。私よりも適切な名前を見つけることができれば:

def may_execute_featured_method
  featured_method if feature_enabled?(:feature_key)
end

def featured_method
  do_this
  do_that
end

呼び出し元は使用しますmay_execute_featured_method

于 2013-05-14T10:42:42.047 に答える
1

機能のキーイングを独自のモジュールに分割して、次のように使用したくなるでしょう。

class Foo

  include FeatureKeyed

  def foo
    'foo'
  end
  feature_keyed :foo

  def bar
    'bar'
  end
  feature_keyed :bar

end

foo = Foo.new
p foo.foo    # => "foo"
p foo.bar    # => FeatureKeyed::FeatureDisabled

モジュールは次のとおりです。

module FeatureKeyed

  class FeatureDisabled < StandardError ; end

  def self.included(base)
    base.extend ClassMethods
  end

  module ClassMethods

    def feature_keyed(method_name, feature_key = method_name)
      orig_method = instance_method(method_name)
      define_method method_name do |*args|
        raise FeatureDisabled unless feature_enabled?(feature_key)
        orig_method.bind(self).call *args
      end
    end

  end

  def feature_enabled?(feature_key)
    feature_key == :foo
  end

end

ノート:

  • feature_enabled? 有効な機能名をハードコーディングします。あなたはそれを変えるでしょう。
  • 機能が無効になっている場合、このコードは例外を発生させます。質問のコードは単に返されます。アプリケーションにとって意味のあることを行います。メソッドごとに異なる「無効」動作が必要な場合は、その動作を feature_keyed に渡すことができます。
  • メソッド _feature_keyed_ は、機能キーである 2 番目の引数を取ります。欠落している場合は、メソッドの名前が機能キーとして使用されます。
于 2013-05-14T14:53:06.770 に答える