手続き型プログラミングとは何ですか?OOPとはどのくらい違いますか?関数型プログラミングと同じですか?


32

私はJavaで非常にオブジェクト指向(OO)スタイルでプログラミングしています。OOPは非常に直感的に理解できますが、他の種類のプログラミングに関する知識はほとんどありません。

手続き型プログラミングとは何ですか?OOPとはどのくらい違いますか?関数型プログラミングと同じものですか?

私は、オブジェクト指向ではないプログラミングはすべて手続き型であると考えていました。しかし、私はこれが真実ではないと考え始めています。


9
あなたの研究を共有することは皆に役立ちます。試したことと、それがニーズに合わなかった理由を教えてください。これは、あなたが時間をかけて自分自身を助けようとしていること、明白な答えを繰り返すことから私たちを救うこと、そして何よりもあなたがより具体的で関連性のある答えを得ることを助けることを示しています。参照してください掲載する方法
GNAT

2
手続き型プログラミングは関数型プログラミングとは異なります。実際には、オブジェクト指向プログラミングと本質的に同じものから、オブジェクトとクラスを除いたものです。
メイソンウィーラー14

1
命令型OOPは実際にある、それはあなたがすべての時間をやっている正確に何であるので...、手続き型プログラミング
インゴ・

回答:


68

ウィキペディアには、これらの用語に関する適切な説明があります。とにかく、概要は次のとおりです。

  • 命令型プログラミングは、計算を可変状態を変更する一連のステートメントとしてモデル化します。
  • 手続き型プログラミングは、コードをサブルーチンに分解する必須のプログラミングです。
  • 構造化プログラミングは、任意のジャンプ(gotoなど)やグローバルな状態の変更を禁止する手続き型プログラミングへのより統制のとれたアプローチです。

  • 宣言型プログラミングは、命令型プログラミングの反対です-方法(SQL、正規表現など)ではなく、計算対象を指定します。

  • 関数型プログラミングは、値を生成する可能性のあるとして計算をモデル化します。関数は値であり、他の関数に渡したり、他の関数から返すことができます。突然変異は推奨されません。デフォルトでは、すべての変数は不変です。結果として、それはそれを達成するために必要な状態変化のシーケンスではなく、計算されているものを強調するため、命令型よりも宣言型です。

  • 純粋に関数型のプログラミングは、突然変異を完全に禁止します(ただし、一般的な信念に反して、副作用を達成するメカニズムはまだあります)。
  • 完全な関数型プログラミングは、例外と無限ループをさらに禁止します。(数学の総関数は、そのすべての入力に対して値を返す関数です。)

OOPはかなり負荷の高い用語であるため、それらの関係は少し複雑です。オブジェクトは関数型言語と手続き型言語の両方で使用できますが、オブジェクト指向として自らを宣伝する言語は手続き型です。問題をさらに混乱させるには:

  • ほとんどの人は、オブジェクトと抽象データ型の違いを知りません
  • 主流のOOP言語はADTについて言及せず、ADTのサポートが非常に貧弱であり、オブジェクトをThe One True Wayと宣伝しています。
  • Abstract Data Type-Oriented Programmingと言う人はいません(それは馬鹿げたことなので、ADTとオブジェクトの両方が必要です)。

これにより、人々はOOPが抽象化を達成する唯一の方法であり、関数型プログラミングとOOPはなんとなく反対または相互に排他的であると考えるようになります。多くの人々は、すべての関数型言語は純粋であり、突然変異を許さないと考えています。

さらに、人々は一般的に命令型/手続き型を互換的にやり取りし、OOP(抽象化のないコード、一般的にはC)と対比したり、関数型プログラミングと対比したりします。構造化プログラミングという用語は、私が知る限りほとんど使用されなくなりました(おそらく、この時点でgotoとglobalsは有害であるとほとんどの人が思っているからです)。


3
「ジャンプを禁止する」はかなり一般的です。if / while / etc。を含む。おそらく「任意のジャンプを禁止する」?
イズカタ14

@Izkata良い点、変わった。
ドーバル14

1
ウィキペディアのエントリに実際にリンクする価値があるかもしれません。
ヘイレム14

そして、それが、オブジェクトのみではなく、オブジェクト「指向」と呼ばれる理由です。
ジェフ14

1
@OrangeDog抽象データ型とはどう違うのですか?抽象データ型は、カプセル化されたデータのセットとそれに作用する機能定義していますか?さらに、不変オブジェクトを持つことができるので、その場合、どのような状態ですか?
ドーバル14

12

手続き型プログラミングは、他の多くの言語設計(機能ではない)の基本的な構成要素の1つであるプログラミングへのアプローチです。

ほとんどの言語は「手続き型プログラミング」のセットに分類され、おそらくほとんどの人にとって最も自然な設計アプローチです(オブジェクト指向の観点から考えると、少数派だと思います)。

BASICは手続き型です。

他の人が言ったように、それはプログラムを順番に構造化するためのメカニズムです。

  • 最初にx
  • 二番目に
  • 三番目にZ

「プロシージャ」を定義するためのメカニズムが必要です-OOメソッドに似た名前付きコードのブロックで、0から多数のパラメーターを受け入れ、オプションで値を返すことができます(通常は関数と呼ばれます-おそらく関数型言語との混乱につながります) )

パラダイムは、あなたが何をするか、または受け渡されるもののやり方を決定するものではありません。

これは、プログラムが連続的に動作する一連の手順(または機能)として構成されることを簡単に説明しています。その後、データは手順とは無関係に定義されます。

これは、データのコレクションとそのデータに作用するメソッド(関数ではない)を中心にプログラムを構成するオブジェクト指向プログラミングとは異なります。

それについて考える1つの方法は、データ範囲の観点からです。

手続き型言語では、スコープはかなり簡単です。変数は、ネストされたスコープを使用して、(グローバルに宣言された)呼び出し元の最上位のレベルまで、特定のプロシージャ(ローカルに宣言された)のスコープ内にある場合があります。

オブジェクト指向言語では、現在使用中のオブジェクトのスコープである新しいスコープコンテキストを追加します。これは、上記とは直交します。

手続き型を考えるもう1つの方法は、オブジェクト指向と比較して、すべてのメソッドを静的として宣言する必要があるオブジェクト指向言語を考慮することです。その結果、手続き型言語となり、クラスを使用して手続きをグループ化できます。


5

手続き型プログラミングは間違いなく関数型プログラミングではありません。

手続き型プログラミングは、コンピューターのモデルを頭の中に機械として置いて、それがメモリー内のデータをどのように変更するかを考えている場合です。そのAため、最初に値3 を設定し、1を追加してメモリロケーションにA再度保存します(以前の値を上書きします)。

関数型プログラミングを言ってしまうA3である、とBされA + 1、その後、計算する方法をコンピュータ数値をさせますB。定義Aたら、不変(不変)でなければなりません。また、Functionalを使用すると、関数をファーストクラスの値として渡すこともできます(関数は引数として関数を取ることができます)。

多くの場合、オブジェクト指向プログラミングは両方を組み合わせており、両方に直交しています。関数型プログラミングを使用して不変オブジェクトを返すことができます。そのオブジェクトには、計算された値を返すメソッドを含めることができます。「リポジトリ」(データベースの抽象的なバージョン)を表すオブジェクトを持つこともできます。また、リポジトリに「保存」して「元に戻す」ことができ、そのオブジェクトにその方法のすべての詳細を処理させることができます。 。それは基本的にオブジェクト指向の手続き型プログラミングです。


0

OOPは、手続き型プログラミングの少し洗練された形式に過ぎず、これも命令型プログラミングのより大きなファミリーに属します。その主張の証拠は、多くのC#/ Javaプログラマーが「何かをする」傾向があり、次のような方法を好むことです。

void doThisAndThat(....) { ... do something ... }

したがって、一連のvoidメソッド(以前はプロシージャ(sic!)と呼ばれていた)と次のようなコードで構成されるプログラム:

doThis();
if (state is that) doSomethingElse();
doThat();

完全な手続き型プログラミングです。


doThisAndThat(....)は、メソッドが複数のことを行うことを意味しますが、これは一般的には良い習慣ではありません。JavaおよびC#の開発者は、主に単一責任原則を順守しています。あなたの類推には欠陥があると思います。 objectmentor.com/resources/articles/srp.pdf
JohnK

@JohnK私はそれが良い習慣ではないことを知っています。まだ一般的なもの。特にJava開発者の間で、SOで毎日見ているものによって判断できる場合。
インゴ14

@JohnK JavaとC#の開発者は、主に単一責任原則 -リップサービスを遵守していますか?
インゴ14

Java開発者は、主に単一責任に準拠していますか?唯一の本当の生活の中で本当だったこと...もし
シュリダールSarnobat
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.