「より良い」練習はどれですか? Pythonでオブジェクト参照またはオブジェクトメソッド参照を渡す

StackOverflow https://stackoverflow.com/questions/4641216

質問

私はPythonで小さなコードを書いていますが、他の人がこれについてどう思うか興味があります。

いくつかのクラスがあり、それぞれにいくつかのメソッドがあり、「より良い」ものを決定しようとしています。メソッド呼び出しでオブジェクトを渡すか、オブジェクトから1つのメソッドのみが必要な場合はメソッド呼び出しを通過します。基本的に、私はこれを行うべきです:

def do_something(self, x, y, manipulator):
    self.my_value = manipulator.process(x, y)

またはこれ

def do_the_same_thing_but_differently(self, x, y, manipulation):
    self.my_value = manipulation(x, y)

私が見る方法では、2番目は間違いなく「より良い」です。なぜなら、それは操作と他のクラスの間の緩い結合/より強い結束を促進するからです。オブジェクトから単一のメソッドのみが必要な場合、このアプローチに対するいくつかの議論を見たいと思っています。

編集: それは明らかに動揺していたので、私はOOPの言葉遣いを削除しました。私は主にゆるい結合と高い結束について言及していました。

役に立ちましたか?

解決

2番目のソリューションは、より「機能的」であり、「OOP」ではなく、より「機能的」であるため、より緩い結合を提供する場合があります。最初のソリューションには、閉鎖を持たないC ++のような言語で機能するという利点があります(ただし、テンプレートとメンバーと対戦のポインタを使用して同様の効果を得ることができます)。しかし、Pythonのような言語では、2番目の代替案はより「自然」になっているようです。

編集:無料の本「Highdory Perl」に「機能とオブジェクト指向の」テクニックに関する非常に素晴らしい議論があります。

http://hop.perl.plover.com/

(第1章、パート6をご覧ください)。それはPerl(およびPythonではなく)の本ですが、そこでの議論はここで尋ねられた質問に正確に適合し、そこに記載されている機能的手法は同様の方法でPythonに適用できます。

他のヒント

2番目のアプローチを言います。それは間違いなくaのように見えるからです 折り返し電話 それらを使用するときに非常に使用されています ハリウッドの原則 (私たちに電話しないでください私たちはあなたに電話します)これは、高い結束と低い結合を伴うコードの開発を支援するパラダイムです[ref 2] .

私は間違いなく2番目のアプローチを使用します。

また、マニピュレータークラスのインターフェイスを変更できるように、 process 代わりに綴られています __call__, 、そして、それは2番目のアプローチで透過的に動作します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top