Kenneth Reitz大神からのアドバイス:不要なオブジェクト向けプログラミングを避ける

5183 ワード

Pythonに対する評価を見たことがあるかもしれませんが、Pythonは「スクリプト言語」と「接着言語」と言っています.ある程度、彼らの言うことは正しいです.しかし、Pythonを学んだことがあるなら、Pythonもオブジェクト向けのプログラミングをサポートしていることを知っています.さらに、Pythonではすべてのものがオブジェクトであることを知っています.
実際、Pythonはオブジェクト向けのプログラミングをサポートする強力な能力を持っています.例えば、私たちが紹介したpathlibモジュール(ポイントリンクレビュー)は、オブジェクト向けの思想でファイルシステムを処理するモジュールです.
Pythonは「屈めることができて伸ばすことができる」と言えるでしょう.小騒ぎをするときは箱を開けて軽く手を使い、まじめに大刀を振るうのも虎が風を起こして譲れないほどです.
ただ、相手に向かうのはいいことなのでしょうか?オブジェクト向けプログラミングをサポートするには、常にこのように使用する必要がありますか?
次の段落は「Pythonベストプラクティスガイド」から出ています.これは圏内の大神Kenneth Reitzが発起し、維持しているオープンソースプロジェクト(文末に関連リンクが添付されています)です.K神の提案を見てみましょう.
Kenneth Reitz大神のアドバイス
Pythonは、オブジェクト向けのプログラミング言語として記述されることがある.これは皆さんに少し誤解しているかもしれませんが、明らかにする必要があります.
Pythonでは、すべてのものを1つのオブジェクトと見なし、オブジェクト別に処理することができます.関数は「一級」オブジェクトであり、関数をオブジェクトと見なすという意味です.関数、クラス、文字列、さらにはタイプがPythonのオブジェクトです.任意のオブジェクトのように、関数パラメータとして渡すことができ、方法と属性がある可能性があります.このように、Pythonはオブジェクト向けの言語です.
しかし,Javaと異なりPythonはオブジェクト向けのプログラミングを主なプログラミング例として実装していない.Pythonプロジェクトは、クラス定義、クラス継承、またはオブジェクト向けプログラミングに固有の他のメカニズムを使用しないか、またはあまり使用しない、オブジェクト向けの方法を採用しないことは完全に可能です.
さらに,モジュール部分から,Pythonがモジュールと名前空間を処理する方法は,抽象層のカプセル化と分離を確保するために開発者に自然な方法を提供していることが分かるが,これらはいずれもオブジェクト向けの最も一般的な原因である.したがって,ビジネスモデルがオブジェクト向けを必要としない場合,Pythonプログラマーはオブジェクト向けプログラミングを使用しないより大きな自由を持つ.
いくつかの要因の考慮に基づいて,不要なオブジェクト向けプログラミングを避けるべきである.いくつかのステータスと機能を結合したい場合は、カスタムクラスを定義するのに役立ちます.関数プログラミングの議論では,「不要なオブジェクト向けプログラミング」という問題は方程式の「状態」部分から生じると指摘した.
一部のアーキテクチャでは、典型的なWebアプリケーションなど、同時に発生する可能性のある外部要求に応答するために、複数のPythonプロセスインスタンスが生成されます.この場合、いくつかのステータスをインスタンスオブジェクトに保存することは、世界に関する静的情報を保持することを意味し、同時または競合の問題が発生しやすい.時々、オブジェクトの初期化(通常は__init__()メソッドで行われる)状態と実際に使用されるオブジェクトメソッドの状態との間で、世界情報が変更された可能性があり、保持された状態は時代遅れになっている可能性があります.たとえば、1つのリクエストがメモリのいずれかをロードし、ユーザーによって読み込まれたとマークされます.もう1つのリクエストは、1つ目のプロセスがロードされた後に発生する可能性があります.を選択し、削除したオブジェクトとしてマークする必要があります.
上記および他の問題は,無状態関数を用いることがより良いプログラミング例であるという考えを引き出した.
**もう1つの言い方は、暗黙的なコンテキストと副作用を持つ関数とプログラムをできるだけ少なく使用することをお勧めします.**関数の暗黙的コンテキストは、グローバル変数と永続性レベルのデータアイテム(メソッド・アクセス)で構成されます.副作用とは、関数が暗黙的コンテキストに加えた変更です.関数がグローバル変数または永続性レベルのデータを保存または削除する場合は、副作用と呼ばれます.
コンテキストと副作用のある関数と論理関数(純関数と呼ばれる)を分離すると、次のようなメリットが得られます.
  • 純関数は決定的である:一定の入力が与えられ、出力は常に同じである.
  • 純関数を再構築または最適化する必要がある場合、変更または置換が容易になります.
  • 純関数は、複雑なコンテキスト設定および事後のデータクリーンアップの必要性がより少ないユニットテストを使用してテストしやすくなります.
  • 純関数は、操作、修飾、および伝達が容易である.

  • 要するに、いくつかのアーキテクチャでは、コンテキストまたは副作用がないため、純粋な関数はクラスおよびオブジェクトよりも効率的な構築ブロックである.
    オブジェクト向けプログラミングは、グラフィックス化されたデスクトップアプリケーションやゲームを開発する際に、操作されるもの(ウィンドウ、ボタン、アバタ、車両)がコンピュータメモリにおいて比較的長い寿命を有するなど、多くの場合に有用であることは明らかである.
    猫の思考
    以上、K神のアドバイスです.彼は後半に純関数(pure functions)に言及し、猫に関数式プログラミング(Functional Programming)を連想させたが、純関数はもっと普遍的なもののようで、数学的な定義のようだ.純関数は本当にそんなに神がいるのだろうか.
    そこで、猫は「純関数」をgoogleに行きました.意外にも、上位に並んだ結果はすべてJavascriptに関連していた.
    ウィキペディアの項目を除いて、最初の答えはGitBookの「JS関数式プログラミングガイド」を指して、好奇心のある猫が中に入って見て、結果は大いに感服しました!条件があれば読んでみることをお勧めします(リンクは文末を参照して、jsが分からなくても理解に影響しません).
    偶然なことに、この本の著者もオブジェクト向けのプログラミングについての見方を発表しました.
    私が一番好きな名言の一つは、Erlang言語の著者Joe Armstrongが言った言葉です.「対象言語向けの問題は、いつまでも隠れた環境を持っていなければならないことです.バナナは1つしか必要ありませんが、バナナを持っているゴリラを手に入れることができます.そしてジャングル全体を手に入れることができます」.
    「純関数のメリット」の章を読んで、猫はいくつかのノートを精錬した.一方では純関数の理解を強化するため、実戦では「不純」な使い方を避ける一方で、いくつかの思考や疑問も提起されており、今後Pythonを学ぶ過程で、答えを見つけることに注意しています.
    1、不純な関数の使用を避ける.JSのspliceは不純な関数ですが、Pythonにもこのような関数がありますか?
    2、次の例では、関数の結果はminimumという可変変数に依存するため、最初は不純である.言い換えれば、それはシステム状態(system state)に依存する.これは外部の環境を導入し、認知負荷(cognitive load)を増加させるため、がっかりさせる.(余談:この例、猫は大いに感銘を受けました.会社のあるプロジェクトの古いバージョンのコードには、様々なグローバル変数があふれていて、仲間たちはメンテナンス中に苦労しました!)JSではObject.freeze法でminimumを可変の対象にすることができますが、Pythonでは類のような実現がありますか?
    //    
    var minimum = 21;
    var checkAge = function(age) {
      return age >= minimum;
    };
    
    //   
    var checkAge = function(age) {
      var minimum = 21;
      return age >= minimum;
    };
    

    3、不純な関数は「副作用」をもたらし、その「作用」自体には悪いところはないが、その「副」はバグを繁殖させる温床である.すべての副作用の使用を禁止するのではなく、制御可能な範囲内で発生させるということです.この「同じ入力で同じ出力を得る」という原則を堅持します.
    4、純関数は実際には数学定義の関数です.「関数は異なる数値間の特殊な関係です.入力値ごとに返され、出力値は1つだけ返されます.」
    5、「純」を追求する理由:キャッシュ性(ジェネレータに似ていて、実行が遅れている)、移植性/ドキュメント化(完全自給自足、依存関係が明確)、テスト性(関数式環境のためにカスタマイズされたテストツール、JSにQuickcheck、Pythonはありますか?)、合理性(参照の透明性:コードのセグメントは、実行された結果に置き換えることができ、プログラム全体の動作を変更することなく置き換えることができます)、パラレルコード(純粋な関数は共有メモリにアクセスする必要がなく、純粋な関数も副作用によって競合状態に入ることはありません).
    今日の分かち合いはここまでで、最後にもう少し論理的にします.この文章では、Pythonコードが一言もなく、本当に「やる」ことができます.猫は時々このような文章を読むのが好きです.それはあなたに思想的な啓発を与えるので、絶世の高人が秘籍の心法を伝授しているようです.だから、猫もこのような問題を転述して考えるのが好きで、例えば前に出した「超強要約:Pythonリストを勉強して、この文章だけで十分です」は、コードレベルの内容だけでなく、わざわざGuidoのお父さんがPythonリストのインデックスについて0からの解釈や、他のプログラミング言語のインデックス値に対する考慮を加えた.
    どこで見たか覚えていないが、みんなに励ましを送った.
    もし一人の目にコードしか見えないなら、彼は塩(ma)魚(nong)と何の違いがありますか?
    最后の最后:开通が遅いため、公众号には伝言机能がありません.もし本文があなたに役に立つと思ったら、「いいね」を歓迎します.最后のPS:バックグラウンドで「勉强が好き」と返信し、ベストエレクトロニクス20册を无料で入手.
    拡張読書:
    Pythonベストプラクティスガイド(中国語):pythonguidecn.readthedocs.io/zh/latest/
    Pythonベストプラクティスガイド(英語):docs.python-guide.org/
    JS関数式プログラミングガイド:llh 911001.gitbooks.io/mostly-adeq…
    本文は微信の公衆番号【Python猫】に先発し、楽屋は「勉強が好き」と返事し、無料で20冊のベスト電子書籍を獲得した.