私はJavaで非常にオブジェクト指向(OO)スタイルでプログラミングしています。OOPは非常に直感的に理解できますが、他の種類のプログラミングに関する知識はほとんどありません。
手続き型プログラミングとは何ですか?OOPとはどのくらい違いますか?関数型プログラミングと同じものですか?
私は、オブジェクト指向ではないプログラミングはすべて手続き型であると考えていました。しかし、私はこれが真実ではないと考え始めています。
私はJavaで非常にオブジェクト指向(OO)スタイルでプログラミングしています。OOPは非常に直感的に理解できますが、他の種類のプログラミングに関する知識はほとんどありません。
手続き型プログラミングとは何ですか?OOPとはどのくらい違いますか?関数型プログラミングと同じものですか?
私は、オブジェクト指向ではないプログラミングはすべて手続き型であると考えていました。しかし、私はこれが真実ではないと考え始めています。
回答:
ウィキペディアには、これらの用語に関する適切な説明があります。とにかく、概要は次のとおりです。
宣言型プログラミングは、命令型プログラミングの反対です-方法(SQL、正規表現など)ではなく、計算対象を指定します。
関数型プログラミングは、値を生成する可能性のある式として計算をモデル化します。関数は値であり、他の関数に渡したり、他の関数から返すことができます。突然変異は推奨されません。デフォルトでは、すべての変数は不変です。結果として、それはそれを達成するために必要な状態変化のシーケンスではなく、計算されているものを強調するため、命令型よりも宣言型です。
OOPはかなり負荷の高い用語であるため、それらの関係は少し複雑です。オブジェクトは関数型言語と手続き型言語の両方で使用できますが、オブジェクト指向として自らを宣伝する言語は手続き型です。問題をさらに混乱させるには:
これにより、人々はOOPが抽象化を達成する唯一の方法であり、関数型プログラミングとOOPはなんとなく反対または相互に排他的であると考えるようになります。多くの人々は、すべての関数型言語は純粋であり、突然変異を許さないと考えています。
さらに、人々は一般的に命令型/手続き型を互換的にやり取りし、OOP(抽象化のないコード、一般的にはC)と対比したり、関数型プログラミングと対比したりします。構造化プログラミングという用語は、私が知る限りほとんど使用されなくなりました(おそらく、この時点でgotoとglobalsは有害であるとほとんどの人が思っているからです)。
手続き型プログラミングは、他の多くの言語設計(機能ではない)の基本的な構成要素の1つであるプログラミングへのアプローチです。
ほとんどの言語は「手続き型プログラミング」のセットに分類され、おそらくほとんどの人にとって最も自然な設計アプローチです(オブジェクト指向の観点から考えると、少数派だと思います)。
BASICは手続き型です。
他の人が言ったように、それはプログラムを順番に構造化するためのメカニズムです。
「プロシージャ」を定義するためのメカニズムが必要です-OOメソッドに似た名前付きコードのブロックで、0から多数のパラメーターを受け入れ、オプションで値を返すことができます(通常は関数と呼ばれます-おそらく関数型言語との混乱につながります) )
パラダイムは、あなたが何をするか、または受け渡されるもののやり方を決定するものではありません。
これは、プログラムが連続的に動作する一連の手順(または機能)として構成されることを簡単に説明しています。その後、データは手順とは無関係に定義されます。
これは、データのコレクションとそのデータに作用するメソッド(関数ではない)を中心にプログラムを構成するオブジェクト指向プログラミングとは異なります。
それについて考える1つの方法は、データ範囲の観点からです。
手続き型言語では、スコープはかなり簡単です。変数は、ネストされたスコープを使用して、(グローバルに宣言された)呼び出し元の最上位のレベルまで、特定のプロシージャ(ローカルに宣言された)のスコープ内にある場合があります。
オブジェクト指向言語では、現在使用中のオブジェクトのスコープである新しいスコープコンテキストを追加します。これは、上記とは直交します。
手続き型を考えるもう1つの方法は、オブジェクト指向と比較して、すべてのメソッドを静的として宣言する必要があるオブジェクト指向言語を考慮することです。その結果、手続き型言語となり、クラスを使用して手続きをグループ化できます。
手続き型プログラミングは間違いなく関数型プログラミングではありません。
手続き型プログラミングは、コンピューターのモデルを頭の中に機械として置いて、それがメモリー内のデータをどのように変更するかを考えている場合です。そのA
ため、最初に値3 を設定し、1を追加してメモリロケーションにA
再度保存します(以前の値を上書きします)。
関数型プログラミングを言ってしまうA
3である、とB
されA + 1
、その後、計算する方法をコンピュータ数値をさせますB
。定義A
したら、不変(不変)でなければなりません。また、Functionalを使用すると、関数をファーストクラスの値として渡すこともできます(関数は引数として関数を取ることができます)。
多くの場合、オブジェクト指向プログラミングは両方を組み合わせており、両方に直交しています。関数型プログラミングを使用して不変オブジェクトを返すことができます。そのオブジェクトには、計算された値を返すメソッドを含めることができます。「リポジトリ」(データベースの抽象的なバージョン)を表すオブジェクトを持つこともできます。また、リポジトリに「保存」して「元に戻す」ことができ、そのオブジェクトにその方法のすべての詳細を処理させることができます。 。それは基本的にオブジェクト指向の手続き型プログラミングです。
OOPは、手続き型プログラミングの少し洗練された形式に過ぎず、これも命令型プログラミングのより大きなファミリーに属します。その主張の証拠は、多くのC#/ Javaプログラマーが「何かをする」傾向があり、次のような方法を好むことです。
void doThisAndThat(....) { ... do something ... }
したがって、一連のvoidメソッド(以前はプロシージャ(sic!)と呼ばれていた)と次のようなコードで構成されるプログラム:
doThis();
if (state is that) doSomethingElse();
doThat();
完全な手続き型プログラミングです。