手続き型プログラミングとOOPの違いを説明できますか?


答え 1:

元の質問:

手続き型プログラミングとOOPの違いを説明できますか?

回答:

まず最初に、手続き型およびオブジェクト指向プログラミングの意味を定義しましょう。

定義-手続き言語とは何ですか?手続き言語とは、プログラミングコンテキスト内で一連の適切に構成された手順と手順を指定してプログラムを構成するコンピュータープログラミング言語の一種です。 手続き型言語は命令型言語とも呼ばれます。技術言語は、手続き型言語について説明します。名前が示すように、手続き型言語は、事前定義され、よく組織化された手続き、関数に依存しています。または、コンピューターが目的の状態または出力に到達するために必要なすべてのステップを指定することにより、プログラムのアーキテクチャー内のサブルーチン。手続き言語は、変数、関数、ステートメント、および条件演算子内でプログラムを分離します。 プロシージャまたは関数は、タスクを実行するためにデータと変数に実装されます。 これらのプロシージャは、プログラム階層間の任意の場所で呼び出すことができます。また、他のプロシージャからも呼び出すことができます。 手続き型言語で記述されたプログラムには、1つ以上のプロシージャが含まれています。手続き型言語は、使用中の最も一般的なプログラミング言語の1つであり、C / C ++、Java、ColdFusion、PASCALなどの注目すべき言語があります。

それでは、オブジェクト指向プログラミングを定義しましょう。

定義-オブジェクト指向プログラミング(OOP)の意味オブジェクト指向プログラミング(OOP)は、オブジェクトを中心に構築されたソフトウェアプログラミングモデルです。 このモデルは、データをオブジェクト(データフィールド)に区分し、クラス(メソッド)の宣言を通じてオブジェクトの内容と動作を記述します。OOP機能には次のものが含まれます。カプセル化:各オブジェクトの実装と状態が背後に隠されるため、プログラム構造の管理が容易になります。明確に定義された境界。ポリモーフィズム:これは、抽象エンティティが複数の方法で実装されることを意味します。継承:これは、実装フラグメントの階層配列を指します。オブジェクト指向プログラミングにより、プログラミングを簡素化できます。 その利点には、再利用性、リファクタリング、拡張性、メンテナンス、効率が含まれます。Techopediaによると、オブジェクト指向プログラミング(OOP)は、過去10年以上にわたって選択されたプログラミングモデルでした。 OOPのモジュール設計により、プログラマーは大量のシーケンシャルコードではなく、管理可能なチャンクでソフトウェアを構築できます。OOPの大きなメリットの1つは、オブジェクトと定義に有限の制限がないというスケーラビリティです。 また、データをメソッドから分離することにより、古い線形ソフトウェア言語で見られる一般的な問題を防ぎます。 線形コードにバグが表示された場合、それはシステムを介して変換され、トレースが困難な大量のエラーが作成されます。 逆に、メソッドとデータが分離されているOOPプログラムは、このようなエラーの影響を受けません。一般的なOOP言語には、Java、Cファミリの言語、VB.NET Shop、Pythonなどがあります。いわゆる「純粋な」OOP言語Scala、Ruby、Eiffel、JADE、Smalltalk、Emeraldが含まれます。

定義のソースは、オブジェクト指向プログラミング(OOP)とは何ですか? -Techopediaの定義と手続き言語とは何ですか? -Techopediaからの定義

今。 賢明な違いの実装を見てみましょう。

手続き型から始めます。これを行う最も簡単な方法は、ArduinoでC言語を使用することです。

基本的な実装の1つであるため、Blinking lightチュートリアルを基礎として使用することにしました。

//リセットを押すか、ボードに電源を入れると、セットアップ関数が1回実行されますvoid setup(){//デジタルピンLED_BUILTINを出力として初期化します。 pinMode(LED_BUILTIN、OUTPUT); } //ループ関数は何度も繰り返し実行されるvoid loop(){digitalWrite(LED_BUILTIN、HIGH); // LEDをオン(HIGHは電圧レベル)delay(1000); // 2番目のdigitalWrite(LED_BUILTIN、LOW); //電圧をlow delay(1000)にしてLEDをオフにします; //しばらく待つ}

それでは、コードについてもう少し詳しく説明しましょう。 セットアップとループの2つの機能があります。 ループは繰り返し呼び出され、セットアップは1回だけ呼び出されます。digitalWriteコマンドをLEDに送信して、電力定格をそれぞれ高および低にします。 遅延とは、ライトが点灯または消灯する時間のことで、この場合は1000ミリ秒または約1秒です。 かなり簡単ですが、これは手続き型プログラミングの本質を示しています。 プロシージャまたは命令を作成し、それが終了するまで繰り返されます。 必要なコードに追加の複雑さはありません。

C#およびOOPのサンプル時間。

システムを使用して; System.Collections.Genericを使用します。 System.Linqを使用します。 using System.Text; 名前空間oops {public class customer {//メンバー変数public int CustID; パブリック文字列Name; パブリック文字列アドレス。 //フィールドを初期化するためのコンストラクタcustomer(){CustID = 1101; Name = "Tom"; Address = "USA"; } //顧客レコードを表示するメソッド(機能)public void displayData(){Console.WriteLine( "Customer =" + CustID); Console.WriteLine( "Name =" + Name); Console.WriteLine( "Address =" + Address); } //エントリポイントのコード}}クラスプログラム{static void Main(string [] args){//オブジェクトのインスタンス化customer obj = new customer(); //obj.displayData()を呼び出すメソッド; // Console.WriteLine(obj.CustID)を呼び出すフィールド; Console.WriteLine(obj.Name); Console.WriteLine(obj.Address); }}}

OOPの典型的な例を次に示します。 使用可能なすべてのオブジェクトを定義する顧客クラスがあります。 記述する関数/メソッドがまだあります。 ただし、重要な違いは、すべてのメソッド/機能を、それが何をすべきかに応じて分割することです。 そこから、メインメソッドがプログラムのエントリポイントになるため、ここに重要なコードを含める必要があります。


答え 2:

JavaのOOPSコンセプト

手続き型言語は関数に基づいていますが、オブジェクト指向言語は実世界のオブジェクトに基づいています。手続き型言語は関数実行のシーケンスに重要性を与えますが、オブジェクト指向言語はオブジェクトの状態と動作に重要性を与えます。手続き型言語はプログラム全体にデータを公開します。オブジェクト指向言語はデータをカプセル化します。手続き型言語はトップダウンプログラミングパラダイムに従いますが、オブジェクト指向言語はボトムアッププログラミングパラダイムに従います。手続き型言語は本質的に複雑であるため、変更、拡張、保守が困難ですが、オブジェクト指向言語は本質的にそれほど複雑ではありません手続き型言語ではコードの再利用の範囲が狭くなりますが、オブジェクト指向言語ではコードの再利用の範囲が広がります。


答え 3:

手続き型プログラミングは、主要な抽象化メカニズムとしてプロシージャを使用したプログラミングです。 ほら

手順とは何ですか? 名前で呼び出すことができる名前付きのコードの塊であり、呼び出されたコンテキスト、パラメーターから値と参照を受け取り、何らかの作業を行った後にそのコンテキストへの値と参照を返すことがあります。

多くの場合、1つの特定の値が戻り値としてプロシージャ内に示されます。 プロシージャをサポートする言語では、それらが関数であるかのように使用されるのが一般的です。パラメータは引数として扱われ、戻り値はそれらの引数の関数の値としてプロシージャ内で計算されます。 ただし、言語がサポートしている場合は「出力」パラメータを使用するか、参照によって渡される値を変更することにより、パラメータを介してプロシージャが呼び出しコンテキストに1つ以上の値を返すことも慣用的です。フラグ、ステータス、またはエラーインジケータ。 Unixの影響を強く受けるプログラミング文化では、成功(または少なくとも既知の障害がないこと)を示すために0が返され、既知の障害モードを示す負の数が表示されることがよくあります。

モデルに厳密に必要というわけではありませんが、プロシージャをその主要な抽象化メカニズムとして使用し、よく知られているセミマジカルのほぼ同じセットを使用した制御の流れも持たない言語を考えることはできません次のようなもの:

if(条件){doThisThing()} else {doThatThing()}

そして

while(条件){keepOnDoingThisThing()}

ほとんどのプログラマーの心では、「手続き型」プログラミングは「構造化プログラミング」とかなり混同されていると思います。 構造化プログラミングが新しい時代にさかのぼると、プロシージャ内で必要なすべての制御フローのパターンを構築できる、便利な制御フロー構造のセットがあることがわかりました。

選択肢を選ぶ

  • if then else(ブール値に基づく2つの選択肢)caseまたはswitch(任意のセットに基づく多くの選択肢)

繰り返し

既知の境界を持つ:

  • forループ(通常は指定された反復回数)foreachループ(いくつかのコレクションのサイズと同じ回数、おそらくメンバー自体に対して繰り返し)

アドホック境界の場合:

  • while do(0回以上の繰り返し)do while(1回以上の繰り返し)

そして悲しいことに不人気なのは:

  • 終了ループ

出口の前のコードを少なくとも1回実行し、出口の後のコードを0回以上実行します。

これらの構造は、相互に関連して実装できますが、場合によっては驚くほど困難です。 Switch / caseステートメントは、ネストされたifで正確にエミュレートするには非常に注意が必要です。 そして、私たちの目的にとって重要なことは、これらはほとんど常に言語実装に組み込まれており、作業中のプログラマーが実行するコードを書くのに苦労することを行うことができるということです。 私が考えることができるすべての純粋にまたは主に手続き型言語では、組み込みのものと同じように機能する独自の制御構造を書くことは非常に難しく、多くの場合不可能です。 したがって、組み込みのものを使用します。手続き型の構造化されたプログラミングは、非常に制約の多い世界です。

手続き型プログラミング言語には、いくつかの種類のモジュール概念、つまり一連のプロシージャの名前付きコンテナも含まれる傾向があります。 これらの手順の一部はモジュールの外で表示され、使用可能になります。一部はモジュール内でのみ表示され、使用可能になります。つまり、同じモジュール内の他の手順によっても使用できます。 モジュールを使用するほとんどの言語では、モジュール内に定義されたプロシージャから参照および共有できる変数をモジュールに含めることもできます。 Cでもこれを行うことができます。 このようなモジュールシステムにより、ある程度のカプセル化と情報の隠蔽が可能になります。モジュール内のこれらのプロシージャと変数は、モジュールの外部から見えるプロシージャの実装を提供することで、システム構造全体の結合を制御できます。 いいね

さらに一歩進んで、同じモジュールの複数の使用を許可し、各使用がモジュールで定義された変数の独自のコピーを持っている場合、モジュールはオブジェクトのプリミティブなソートのように見え始めます。 そして、変数を持つモジュールのインスタンスを主要なものにし、それらの間で何らかの方法でプロシージャを共有するので、それらのコピーが1つしかない場合、C ++の動作にかなり近づきます。 このきめ細かいモジュール式の手続き型構造化プログラミングは、オブジェクト指向プログラミングではありません。

オブジェクト指向プログラミングは、主要な抽象化メカニズムとしてオブジェクトを使用したプログラミングです。 ほら

オブジェクトとは何ですか? それは何かをするように頼むことができる長命の計算エンティティです。 オブジェクト指向プログラミングの原型および模範はSmalltalkです。 Smalltalkでは、すべての値はオブジェクトです(または、少なくとも、オブジェクトではない非常に少数の値は、あたかもそれらがそうであるかのように見えるようにします)。 相互にメッセージを送信するオブジェクトによって計算が進行します。 Smalltalkの実装は多少異なりますが、これは一般的な考え方です。

メモリ内に設定されたオブジェクト。 オブジェクトが別のオブジェクトに何かをさせたい場合、それを求めるメッセージを作成し、それを目的のオブジェクトに送信します。 メッセージはオブジェクトです。 オブジェクトは状態を維持する責任があります。つまり、変数を保持します。 彼らはコードを実行しません。 オブジェクトがメッセージを受信すると、そのメッセージをクラスに渡します。 クラスはオブジェクトです。 クラスはオブジェクトの作成と管理を担当し、コードを実行しません。 クラスは、そのメタクラスにメッセージを渡します。 メタクラスはオブジェクトです。 メタクラスはメソッドの管理を担当します。 メタクラスはそのメソッドを見て、メッセージに対応するものを見つけます。 メソッドはオブジェクトです。 途中で、メッセージオブジェクトは、メッセージを受信したオブジェクトへの参照を含む、さまざまな追加情報で装飾されました。 メソッドはコードの実行を担当し、元のメッセージで渡された引数を使用して実行します。 メソッドは、メッセージを受信したオブジェクトのコンテキストでコードを実行します。 メソッドのコードは、ビルドして他のオブジェクトに送信するメッセージのスクリプトです。 メタクラスがメッセージに一致するメソッドを見つけられない場合、オブジェクトのクラスの親クラスのメタクラスで検索が開始されます。 これは「継承」と呼ばれます。

ある実装または別の実装では、効率上の理由から実装に特定のメソッドが組み込まれている場合がありますが、原則としてSmalltalkシステム全体がこの方法で機能します。

Smalltalkでのプログラミングとは、スクリプトメッセージを送信してメソッドに入ることと、メソッドが住むための新しいクラス(メタクラスを含む)を作成することを意味します。これは、フローの制御と同じです。そうしないと。

手続き型言語では、この擬似コードのようなコードを使用して、コレクションの各メンバーに対して何らかのアクションを実行できます。

foreach(コレクションのtheThing)doThisActionOn(theThing)

典型的なSmalltalkでは、メッセージ送信の同等のスクリプトは次のようになります。

aCollection do:[aThing | aThing takeThisAction]。

ここで、takeThisActionは、コレクションaCollectionの各aThingオブジェクトに送信されるメッセージです。 (ところで、角かっこ内のコードはブロックであり、Smalltalkはラムダと呼びます。オブジェクトです。)2つを比較すると、手続き型とは対照的にオブジェクト指向プログラミングのいくつかの重要な特性を見ることができます。

  • 手続きコードでは、コレクションのメンバーを走査する方法を選択し、foreachメカニズムを選択します。 オブジェクト指向のコードでは、コレクションにトラバースを行うように依頼しますが、どのように実行するかはわかりません。手続き型のコードでは、呼び出し元のコードはオブジェクト指向のコードtakeThisActionのdoThisActionOnという名前のプロシージャにアクセスできる必要があります。ただのシンボル。 コレクション内のオブジェクトがそれをどのように解釈するかはわかりません。

これがオブジェクト指向プログラミングの本質であり、「バックを渡すことによるプログラミング」と言われています。 一方、手続き型プログラミングでは、すべての計算が行うことを明示的に述べる必要があります。