2017-12-02 12 views
0

私はPythonを学んでいて、一般的にプログラミングしています。私は、より哲学的な観点から何かを知りたいと思っています。具体的には、クラス内の個々のメソッドを完全にモジュラー化する方法や、相互に依存するメソッドを作る方法が理にかなっていますか?メソッドをモジュール化するか、依存する/リンクさせるのが理にかなっていますか?

たとえば、私の現在の使用例では、クラス内のすべてのメソッドを従属的な方法で使用しています。すなわち、あるメソッドからの出力または戻り値を意味し、次のメソッドのパラメータとして使用されます。この場合は、次のメソッドでそのメソッドの値を直接呼び出すほうが簡単ですが、私はまだジェネリックパラメータを使用しており、モジュール化してコード化しています。スクリプトを実行すると、それを呼び出すために私は、私が言っていることが意味をなさないかどうか分からないので、例を示しますが、私はあなたの意見を得たいと思っていました。ありがとう!!

クラスのメソッドの2のモジュラー例に:それが来るとき

self.parse(get_token(values, url)) ... and this goes on as there are several other methods 

:私はこれを呼び出すと

def get_token(self, values, url): 
    self.values = values 
    self.url = url 
    tls_version = ssl.SSLContext(ssl.PROTOCOL_TLSv1_2) 
    data = urllib.parse.urlencode(self.values).encode("utf-8") 
    req = urllib.request.Request(self.url, data) 
    res = urllib.request.urlopen(req, context=tls_version).read() 
    response_js = json.loads(res) 
    return response_js 

def parse(self, json_block): 
    self.json_block = json_block 
    token = self.json_block['access_token'] 
    inst_url = self.json_block['instance_url'] 
    return token, inst_url 

、それはその後、長いリスト(IE)になりこれは基本的には似ていますが、パラメータの指定を許可する代わりに、関数内でget_token()から取得したデータを使用するだけです。これによりメソッドが短くなり、呼び出すのがはるかに簡単になりますが、汎用性を持たないため、これは間違った方法であると心配しています。

ご意見はありがとうございます。

答えて

0

私の個人的な意見では(これがそうであるように)、最も有用な方法は、それらをすべて互いに切り離すことですが、すべてを一緒に計算する機能があります。あなたは他の関数またはそのような痛みを伴うものを経由せず、好きなパラメータを持つFoo.method3呼び出して、すぐにそれの結果を得ることができ、ここで

class Foo: 
    def method1(self, var1, var2): 
     # do things 
     return var3, var4 

    def method2(self, var1, var2): 
     # do things 
     return var3 

    def method3(self, var1): 
     # do things 
     return var3, var4, var5 

    def method4(self, var1, var2, var3): 
     # do things 
     return var3 

    def calculate_meaning_of_life(self, var1, var2): 
     inter_var1, inter_var2 = method1(var1, var2) 

     inter_var3 = method2(inter_var1, inter_var2) 

     inter_var4, inter_var5, inter_var6 = method3(inter_var3) 

     answer = method4(inter_var4, inter_var5, inter_var6) 

     return answer # happens to always output 42 

はコードを参照してください。また、 Foo.calculate_meaning_of_life func(注:1行ではなく、非常に判読不能なので)を呼び出すことで、すべての変数を素早く計算することができます。

特に、デバッグの観点からは、それらをすべて別々に呼び出して返すものを分析できるようにしたいと思います。

また、他の人にインストールするパッケージを作成する場合は、特定のプロジェクトにFoo.method2を使用する理由があるため、作成したすべてのコードをできるだけ簡単にアクセスできるようにする必要があります。

希望すると便利です。

0

私はそれは可読性のためのものです。なぜならあなた(そしておそらく他の人もそうです)があなたのコードを見直さなければならないからです。この点であなたのために働く方法が必要です。

これは私の方法である:

は、他の人とは別のすべてのメソッドを保管してください。ヘルパーメソッドの使用を検討している場合は、それらが使用されているメソッドに保持するか、(同じ操作で多く使用されている場合は)自分のクラスでそれらをグループ化することをお勧めします。

class MyClass: 
    def distinct_method(self): 
     def distinct_helper(): 
      # helper 
      return ", right?" 
     # do some distinct stuff 
     return other_distinct_method() + distinct_helper() 

    def other_distinct_method(self.): 
     # do some other distinct stuff 
     return "it should be distinct" 

if __name__ == "__main__": 
    print MyClass().distinct_method() 

親指の良いルールは、それが他の複数のインスタンスメソッドで使用されていない限りヘルパーメソッドクラスの一部をしないことです、例えば:

class MyClass2: 
    def helper(self): 
     return "help!" 

    def method1(self): 
     return "I use " + self.helper() 

    def method2(self): 
     return "I also use " + self.helper() 

代わりの

class MyClass1: 
    def helper(self): 
     return "help!" 

    def method1(self): 
     return "I use " + self.helper() 

    def method2(self): 
     return "I don't use helper!" 
関連する問題