oop & func ( y )=>バンチ

16468 ワード

oop & func ( y )=>バンチ


第一部:二つのパラダイムの物語


免責事項1:私はされていませんし、約についてのトピックについての専門家であると主張しないでください.これは包括的なガイドを考慮しないでください、代わりに、これは、猛禽類開発者のまともな意見としてこれを見てください.
今、そのように.

一連の不運な質問


免責事項2:私はこれらの質問とJavaScriptのレンズを介して広範なトピックを見てされます
  • 「きれいな」コードは何ですか?
  • これは、最初にこのパラダイムをパラダイムとその万華鏡のファセットをコード化する領域に引き起こしたこの質問でした、そして、それは我々が戻って来続けるというこの質問です.
    その質問の収率の簡単なGoogle検索- 20億(正確にするには1940000000)検索結果.それで、明らかに私はこれに関して考える唯一の人ではありません.しかし、私は私たちに良い出発点を与える一連の頭字語に遭遇しました.
    1. KISS: (Keep It Simple Stupid) The philosophy of rendering down a design to its least complicated form. Ask yourself: 'Can this be written in a simpler way?'

    2. DRY: (Don't Repeat Yourself) The Mantra of Senior Developers and Coding Instructors every where. Ask yourself: 'Can this be abstracted and reused?'

    3. YAGNI: (You Ain't Gunna Need It) This one is a bit more for larger scale projects than what technomancers in training (like myself) might come across. Ask yourself: 'Does this functionality bring me closer to my MVP?'


    これらを使用すると、我々のコードを書くときにいくつかのガイドの記事を持って、不運にも、我々は今、いくつかの質問があります.それで、あなたの心の後ろにそれらを保ってください.
    Clean Code

    長い間、すべてのパラダイムのおかげで


    「Mr/msのブログライターの人、「正確にパラダイムとは何か?」
    よく、私はそれのより細かい点に入るつもりでありません、しかし、我々の目的のために、私はこの非常に単純な定義を使用しています

    A Paradigm is a collection of beliefs and thought patterns, a guiding philosophy if you will


    そこに コードパラダイム、この文脈では、我々は2つの上に行くだろう関数型プログラミングとオブジェクト指向プログラミング

    多く Fの単語(機能、単語は機能的です)


    ウィキページから

    In computer science, functional programming is a programming paradigm where programs are constructed by applying and composing functions. It is a declarative programming paradigm in which function definitions are trees of expressions. . .


    そして、我々は今、2つの新しい質問がありますまず、関数は何ですか?第二に、表現は何ですか
    簡単な例
    //数学でjsファイル
    を追加する
    この例では、全体としての行は関数(これは矢印関数式であることを気にすることはありません.................................................)矢印の右にあるすべてのものが式です.これはまた、機能的プログラミングのいくつかのコアテクトにうまく適合します.しかし、最初に引用:

    Functional Programming imposes discipline on mutating state


    我々が見ている関数プログラミングの第一原理は「純粋な」機能の考えです.純粋な関数は予測可能なものであり、それが取込むデータを突然変異させず、単一の値を返すだけである上の例では、関数は純粋です.関数の純度は、関数コードを書く際にはわずかです.
    純粋な関数とその予測可能性は、コード内の特定のレベルの透明性を考慮します.たとえば:
    単純な例v 2
        // in the math.js file
        const add = (a, b) => a + b
        const add = (1, 2) => 1 + 2
    
    変更された例では、関数とその式に渡す値は明確であり、単一の結果は式から解決され、副作用のない結果として返されます.
    機能プログラミングの第2の原理は、第一のクラスとしての機能の概念である.これが一般的に意味するのは、関数はデータとして扱うことができ、変数と同じように渡すことができるということです.これは、関数が変数として宣言されることができることを意味します.この例では別の例を見てください.ここで実際に行っているのは、const変数' add 'に匿名関数を代入することです.この特定の構文がJavaScriptの一部に組み込まれていることに注意することは重要です、これは少しより重要になるでしょうが、今のところ、基本的なファーストクラスの実体として機能する純粋な機能の2、3の例を見てみましょう.
    簡単な例v 3
        // in the math.js file
        const add      = (a, b) => a + b
        const subtract = (a, b) => a - b
        const multiply = (a, b) => a * b
        const divide   = (a, b) => a / b
    
    彼らは、ちょうどとてもきれいで、きれいに見えません..
    我々がカバーする3番目と最終原則は、高次の関数のそれです.高次関数では、関数として他の関数を返すことができます.これは関数型プログラミングでマジックが発生するところです.
    簡単な例v 4
        // in the math.js file
        const add      = (a, b) => a + b
        const subtract = (a, b) => a - b
        const multiply = (a, b) => a * b
        const divide   = (a, b) => a / b    
        const equation = (a, b) => subtract(multiply(add(a, b), divide(a, b)), add(multiply(add(a,b), divide(a, b))))
        equation(add(1, 2), subtract(5, 4))
    
    うまい読者?これは純粋ですか.これはおそらく'清潔'ですか?
    これらの原理を念頭においてパターンが出現し始めるが、ここでは機能的プログラミングの中心原理、すなわちimmutablityの概念に対処するためにここで休止することができます.
    機能的なプログラミングデータにおいて、一旦割り当てられると、関数と同じように扱われて、一度セットされることは決して変わらないべきです.しかし、空間的な時間(ここでは空間的な時間は、メモリの中で何かを占有するだけでなく、そのことについての行動を実行するために必要な時間を意味する)の周りに特に欠点があります.今、私はあなたが尋ねているのを聞いています:「しかし、MR/MS Blog Writerは非常に速く非常に時空集中を得ます.」短い答えはイエスです.長い答えもはいです.実際、唯一の答えはイエスです.言語が機能的な原則に基づいて構築された良いニュースは、これを扱う方法に組み込まれている、悪いニュースは、私たちのために、JavaScriptは、これらの言語の一つではないです.JavaScript DEVSは様々なライブラリの形でこれに対する答えがありますが、この特定の議論の範囲の外に落ちるので、どれも私はカバーしません.しかし、話題のビデオについてもっと知りたいと熱望する読者にとっては、良い場所になるべきです.
    今、我々は機能的なプログラミングの基本的な理解を我々は悪名高いo . o . p

    伝言オブジェクト


    ウィキから

    Object-oriented programming (OOP) is a programming paradigm based on the concept of "objects", which can contain data and code: data in the form of fields (often known as attributes or properties), and code, in the form of procedures (often known as methods).


    オブジェクト指向において、「オブジェクト」の考えは最高に支配しますしかし、我々が「オブジェクト」について話すとき、我々が意味するところでは、よく、そのコアのオブジェクトは単にデータ(価値)と方法(機能)を家にすることができるデータ構造です.しかし、このデータ構造は特別なもののcapabaleです、しかし、後でそれに関して、最初にオブジェクト、データとメソッドの関係を解き放しましょう.それで、カプセル化について話すことができます.
    カプセル化は、特定のオブジェクトへのデータ(値)、およびメソッド(関数)のスコープの原則です.これはOHPのコアのprinicipleではないかもしれませんが、後で重要なので、あなたが読んでいるように念頭に置いて物事の山に追加されます.クラスでコードをカプセル化することによって、データ(値)とメソッド(関数)が互いの関係によってグループ化されることを意味して、我々は各々のオブジェクトの懸念を分離することができます.私たちの例を見直すことができます(私はこれらの例のためにRubyに変わります、しかし、概念は特定の構文より重要です)
    簡単な例V 5
        # in the math.rb file
        class Math
    
          def initialize
            num_a = 1
            num_b = 2
            num_c = 3
            num_d = 4
            num_e = 5
            num_f = 6
          end
    
          def add(a, b)
            a + b
          end
    
          def subtract(a, b)
            a - b
          end
    
          def multiply(a, b)
            a * b
          end
    
          def divide(a, b)
            a / b
          end
    
          add(num_a, num_b)
          subtract(num_a, num_b)
          multiply(num_a, num_b)
          divide(num_a, num_b)
        end
    
    ここでは、アクションのカプセル化を見ます.このクラスの数学は完全に自己完結している.我々は数学のクラス(オブジェクト)のすべての数学のメソッド(機能)だけでなく、適切な操作を実行するために必要なすべてのデータ(値)と非常にきれいな、非常に組織化された、そのようなオブジェクトなどを持っています.これは、必要に応じて適用されたり無視されたりすることができる規約です(ほとんどの場合、コーディングにおけるすべての規則でない場合).このコードが書かれているのは、自分自身の中でのみ実行することができ、また、私たちが取り組んでいる(純粋に仮想的な)コードベースの中に他のコードはないのです.だから、このコードは'クリーン'ですか?
    もちろん、コードベースの残りの部分からクローズされたコードがあれば、複雑なプログラムを行うことができます.これは、我々の第2の原則が遊びに入るところです.継承によって、子が利用できる2つのクラスと親のデータ(値)とメソッド(関数)の間の親と子の関係を指定できます.しかし、我々の例でもう少し抽象的になることができます
    単純な例v 6
        # in the math.rb file
        class Math < Numbers
    
          def add(a, b)
            a + b
          end
    
          def subtract(a, b)
            a - b
          end
    
          def multiply(a, b)
            a * b
          end
    
          def divide(a, b)
            a / b
          end
    
          add(@num_a, @num_b)
          subtract(@num_a, @num_b)
          multiply(@num_a, @num_b)
          divide(@num_a, @num_b)
        end
    
        class Numbers
    
           def initialize
            @num_a = 1
            @num_b = 2
            @num_c = 3
            @num_d = 4
            @num_e = 5
            @num_f = 6
          end
    
        end
    
    ここでの例では、Math Class(Object)は@ numMany A、@ NumCore Bなどの値を継承しています.継承を使用すると、クラス(オブジェクト)が自分の特定の関心事に焦点を当てて、自分のスコープ外のコードにアクセスして操作することができます.この清潔度を維持しながら、我々のプログラムは、機能の深さの増加が可能です.
    これらの概念を利用することによって、我々は我々のコードをコード化して、抽象的に使用することができます(機能の深さを犠牲にすることなく、可能な限り軽量であるように、我々のプログラムを作るために努力しないでください).
    ここに挿入してください.

    エピローグ:善、悪、文体


    このブログの私の研究では、これらの2つのパラダイムが本当に異なっているというわけではありませんでした、私の目の中心的な違いは彼らの懸念の範囲であると、私に起こりました関数型プログラミングにはクラス(オブジェクト)のようなものの概念が全くありません.関数のプログラミングを閉じた状態は状態です.目的はOOグローバル変数と等価です.このすべては私たちのために何を意味しますか?それは、これらの2つのパラダイムが混合されることができるということを意味します、これがすることができる範囲は使用される言語の特徴によって決定されます、我々のために幸運なJavaScriptが存在します.
    純度に向かって目を向けた方法(関数)を書くことによって、クリーンで予測可能な複雑な出力を生成する複雑な手順を作成することができます.

    更なる読書


    ソース