OOP vs 関数型プログラミング vs プロシージャル [終了]

StackOverflow https://stackoverflow.com/questions/552336

  •  23-08-2019
  •  | 
  •  

質問

これらのプログラミング パラダイムの違いは何ですか? 特定の問題により適しているのでしょうか、それとも、どちらかのユースケースが他よりも有利なのでしょうか?

アーキテクチャの例を歓迎します!

役に立ちましたか?

解決

それらのすべては、独自の方法で良いです - 彼らは同じ問題に単純に異なるアプローチです。

純粋な手続き型では、データは非常にそれを操作する機能から分離する傾向がある。

オブジェクト指向スタイルでは、データがそれを関数のコレクションを運ぶ傾向がある。

機能的なスタイルでは、データと関数は、関数が実際に使用される方法の点でより多くの柔軟性を提供しながら、(Lispやスキームのように)互いに共通以上を有する向かう傾向。アルゴリズムは、再帰及び組成の点ではなくループと反復で定義されるようにしても傾向がある。

スタイルが好まれる

もちろん、言語自体にのみ影響。でも、Haskellのような純粋な関数型言語では(つまりは非常に落胆ですが)、あなたが手続き型のスタイルで書くことができ、さらにはCなどの手続き型言語では、あなたがそのようなGTK +のように(オブジェクト指向のスタイルでプログラムすることができますし、 EFLのAPI)。

明確にするため、各パラダイムの「利点」は、あなたのアルゴリズムとデータ構造のモデリングに単純です。例えば、あなたのアルゴリズムは、リストやツリーが含まれている場合、機能的アルゴリズムは最も賢明かもしれません。例えば、あなたのデータが高度に構造化されている場合には、それはあなたの言語のネイティブのパラダイムである場合には、オブジェクトとして、それを構成するより多くの意味を行うことができる - あるいは、それは同じように簡単にモナドの機能的抽象化のように書くことができ、そのHaskellのか、MLのような言語のネイティブのパラダイムがある。

あなたが使用しているの選択は、あなたの言語がサポートする抽象ます。

プロジェクトのためのより多くの理にかなっているとどのような単純です

他のヒント

私が使用可能なライブラリ、ツール、サンプル、およびコミュニティが完全にこれらの日のパラダイムを切り札と思います。例えば、ML(または何でも)は、究極の万能プログラミングの言語のかもしれないが、あなたは、あなたがねじ込みしているやっていることのために何か良いのライブラリを得ることができない場合ます。

あなたがビデオゲームを作っている場合は、

たとえば、そこにC ++でより良いコード例とSDKがあるので、あなたはおそらくそれと方がいいでしょう。小規模なWebアプリケーションの場合は、あなたを下車し、非常に迅速に実行しますいくつかの素晴らしいのPython、PHP、およびRubyのフレームワークがあります。 Javaはので、コンパイル時のチェックや企業のライブラリやプラットフォームの大規模なプロジェクトのための素晴らしい選択肢です。

これは、異なる言語の標準ライブラリはかなり小さく、簡単に複製されたことをケースのように使用 - ...など、C、C ++、アセンブラ、ML、LISPの基礎となったが、それがに来たときに鶏アウトに傾向が見られました(XMLを含む)ネットワーク通信、暗号化、グラフィックス、データファイルフォーマットのようなものに標準化、バランスの取れた木やハッシュテーブルのようにも基本的なデータ構造が取り残された!

現代のPython、PHPのような言語、Rubyの、およびJavaは現在、はるかにまともな標準ライブラリが付属して、あなたは簡単に衝突したライブラリを維持するために、名前空間の採択に大きな部分で感謝を使用することができます多くの良いサードパーティのライブラリを持っています互いに、およびライブラリのメモリ管理方式を標準化するためにガベージコレクションます。

これらのパラダイムは、相互に排他的である必要はありません。あなたのpythonを見れば、それは関数やクラスをサポートしていますが、同時に、すべてが機能を含め、オブジェクトです。あなたは、コードの一枚で全ての機能/ OOP /手続きスタイルをミックスして一致させることができます。

である私は何を意味し、関数型言語では(少なくともHaskellでは、一つだけ私が勉強)は文はありません!機能はその中の一つの発現を許可されています!しかし、機能はあなたが他の能力の束と一緒に、パラメータとしてそれらを周りに渡すことができ、ファーストクラスの市民です。彼らは、数行のコードで強力なことを行うことができます。

Cなどの手続き型言語では、あなたの周りの機能を渡すことができる唯一の方法だけでは多くの強力なタスクを有効にしないこと

関数ポインタを使用することです、そして一方でます。

Pythonでは、関数は第一級オブジェクトであるが、それは文の任意の数を含めることができます。だから、手続き型のコードが含まれている機能を持つことができますが、あなただけの関数型言語のようにそれを周りに渡すことができます。

同じことがOOPのために行きます。 Javaのような言語では、クラスの外で手続き/関数を記述することはできません。周りに関数を渡すための唯一の方法は、その機能を実装するオブジェクトでラップして、そのオブジェクトを周りに渡すことです。

Pythonでは、あなたはこの制限はありません。

GUIのために私はオブジェクト指向Paradigmaは非常に適していることを言うと思います。ウィンドウオブジェクトである、テキストボックスはオブジェクトであり、オーケー-ボタンも一つです。文字列処理などの他の手のもので、簡単な手続きparadigmaとはるかに少ないオーバーヘッドので、より簡単に行うことができます。

私はそれが言語でもないの問題ではないと思います。それはいくつかにいくつかの追加の努力であるかもしれないが、あなたは、ほぼすべての人気のある言語で、機能的な手続き型またはオブジェクト指向を書くことができます。

あなたの質問に答えるには、次の 2 つの要素が必要です。

  1. さまざまな建築スタイル/パターンの特徴を理解する。
  2. さまざまなプログラミング パラダイムの特性を理解する。

ソフトウェア アーキテクチャ スタイル/パターンのリストは、 ソフトウェアアーキテクチャの記事 ウィキペイダで。そして、それらについてはウェブ上で簡単に調べることができます。

簡単に一般的に言うと、Procedural は手順に従うモデルに適しており、OOP は設計に適しており、Functional は高レベルのプログラミングに適しています。

それぞれのパラダイムの歴史を読んでみて、なぜ人々がそれを生み出したのかを見てみると、簡単に理解できると思います。

両方を理解した後、アーキテクチャ スタイル/パターンの項目をプログラミング パラダイムにリンクできます。

私は、彼らが「対」が多いではないと思いますが、あなたはそれらを組み合わせることができます。私はまた、しばしば、あなたが言及言葉だけで流行語だと思います。実際には、「オブジェクト指向」とは何を意味するのか知っている少数の人々は、彼らはそれの激しい伝道者であっても、あります。

私の友人の 1 人が、次を使用してグラフィック アプリを作成しています。 NVIDIA CUDA. 。アプリケーションは OOP パラダイムに非常にうまく適合しており、問題はモジュールにきちんと分解できます。ただし、CUDA を使用するには、サポートされていない C を使用する必要があります。 継承. 。したがって、賢くなる必要があります。

a) 継承をある程度エミュレートする賢いシステムを考案します。できるよ!

i) を使用できます。 フックシステム, これは、親 P のすべての子 C が関数 F に対して特定のオーバーライドを持つことを期待します。子にオーバーライドを登録させることができます。オーバーライドは保存され、必要に応じて呼び出されます。

ii) 構造体を使用できます 記憶の調整 子を親にキャストする機能。

これはうまくいきますが、将来性のある信頼できるソリューションを考え出すのは簡単ではありません。システムの設計には多くの時間を費やしますが、プロジェクトの途中で問題が発生しないという保証はありません。実装する 多重継承 ほぼ不可能ではないにしても、さらに困難です。

b) 一貫した命名ポリシーを使用し、次を使用できます。 分割統治 プログラムを作成するアプローチ。継承はありませんが、関数は小さく、理解しやすく、一貫した形式であるため、継承は必要ありません。記述する必要があるコードの量は増えるため、集中力を維持し、簡単な解決策 (ハック) に屈しないようにするのは非常に困難です。ただし、この忍者のコーディング方法は C のコーディング方法です。低レベルの自由と優れたコードの作成との間のバランスを保つ。これを実現する良い方法は、関数型言語を使用してプロトタイプを作成することです。例えば、 ハスケル アルゴリズムのプロトタイピングに非常に適しています。

私はアプローチ b に向かう傾向があります。私はアプローチ a を使用して考えられる解決策を書きましたが、正直に言うと、そのコードを使用するのは非常に不自然に感じられました。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top