2013-05-14 62 views
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 

優勢條件內部的條件是顯而易見的:DRYing的代碼,以及事實上,當你想永久添加該功能,你只需從該方法內刪除條件。

在每次調用之前擁有這個條件的好處是,它非常清楚這個方法是否被執行或者沒有進入代碼本身,這可以節省相當多的頭痛。

我想知道是否有另一種解決方案或這些問題的標準。

+0

有人會投票結束_anything_。 – 2013-05-14 13:50:15

+0

大聲笑,我可以不在乎少,不用擔心:) – 2013-05-14 14:39:30

回答

3

我會合並這兩種方法。

這將導致來電方的干擾碼。它不會違反在feature_method的SRP,它會清楚地傳達正在發生的事情 - 如果你能找到比我更好的名字:

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

+4

鼓勵downvoter解釋downvote。否則我不能改善答案。 – 2013-05-14 10:56:56

+0

這實際上是一個不錯的方法:) – 2013-05-14 11:24:30

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_將獲取第二個參數,即特徵關鍵字。如果缺少,則使用該方法的名稱作爲功能鍵。
+0

非常,非常優雅,我喜歡它。 – 2013-05-16 06:59:16