オブジェクト指向プログラミングの代替案?


83

OOPは、おそらく今日のソフトウェア設計で最も使用されているプログラミングパラダイムです。私の質問は、他にどのようなパラダイムがそれと競合し、OOPの代わりに立つことができるかということです。その質問を明確にするために、私は他にどのようなパラダイムがあるかについて質問していません。たくさんありますが、どれがいいのか知りたい…

  • 理論だけでなく、実際に使用されてきました。
  • OOP競合できるため、大規模なプロジェクトで最小限の労力で使用できます。
  • ビジネスロジック、データベースなどを備えたデスクトップアプリの開発に使用できます。
  • OOPと一緒に使用されるのではなく、OOPの代わりとして使用されます。

そして、もしあれば、それの長所/短所は何ですか、それがOOPよりも良い/悪い理由、それを使用するのに最適な言語は何ですか、人気のある言語でそれを使用するのはどうですか、それはどんなデザインパターンを持っていますか、そしてそれはできますかOOPを完全に置き換えますか?


1
@Justin Ardini:たくさんあることは知っていますが、どれがおっとと競争できますか?@ Tobiasopdenbrouw&Macros:わかりました、変更されました。
ダリウスウォズニアック2010

OOPは人気があるため人気があります。OOPクールエイドを飲み込まないと、作業するプロジェクトがありません...
aoeu256 2017年

「dbオブジェクト」メソッドがカプセル化を提供する単一のオブジェクトではなく、オブジェクトコレクションとそれらの関係に関心がある場合、データ指向プログラミングの方が簡単です。JSONとsexpressionsはSQL、CSS、HTML、Excelを甘くし、シェルスクリプトは人気があり便利ですが、「プログラミング」とはOOPまたは手続き型を意味します。OOPはコードの20%ですが、Python / JavaScriptプログラムの保守が可能であることに感謝しています。クロージャとJSONは、オブジェクトの代わりに90%の時間使用でき、よりシンプルで使いやすくなっています。
aoeu256 2017年

回答:


51

関数型プログラミングは、主に学者に人気のあるもう1つのプログラミングパラダイムです。関数型プログラミング言語の最良の例は、HaskellStandardMLです。

関数型プログラミングとオブジェクト指向プログラミングの基本的な違いは、制御フローではなくデータフローの意味でプログラミングしていることです。良い紹介については、SimonPeyton-Jonesによる関数型プログラミングによる効果の調整のプレゼンテーションを参照してください。

業界で使用されている関数型プログラミングの良い例はErlangです。これは主に、電気通信、分散型、およびフォールトトレラントシステムで使用されます。プレゼンテーションを参照してください並行世界のためのソフトウェア-アーランによって、ジョー・アームストロング

関数型プログラミングとOOPを組み合わせた新しい関数型プログラミング言語もあります。2つの良い例は、.NETプラットフォーム用のF#とJavaプラットフォーム用のScalaです。多くの場合、他の言語で記述されたプラットフォーム上の既存のライブラリを使用できます。

現在、新しいプログラミング言語のトレンドはマルチパラダイムであり、オブジェクト指向プログラミングや関数型プログラミングなどの複数のパラダイムが同じ言語で組み合わされています。


4
Scalaは、オブジェクト指向言語と関数型言語の機能を統合することを目的としています。
フィリップ

5
良い答えですが、関数型プログラミングとオブジェクト指向プログラミングはメダルの両面ではなく、完全に共存できると思います(あなたが言ったように)。それはもっとこのようなものです:手続き型VSオブジェクト指向、命令型VS機能。Lispは人気のある手続き型関数型言語であり、Javaはオブジェクト指向の命令型言語です。
fhd 2010

1
@ ventr1s:はい、関数型プログラミングOOP置き換えることができます、ScalaやF#などの言語でOOPと一緒に使用される可能性が最も高いです。
Jonas

1
@ ventr1s:業界での関数型プログラミングの良い例は、Erlangで書かれた分散型NoSQLデータベースRIAKです。riak.basho.com
Jonas

2
@ ventr1s:関数型プログラミングとデザインパターンに関するこの質問を参照してください:stackoverflow.com/questions/327955/…–
Jonas

12

手続き型処理は、OOPが登場する前のすべてであり、いくつかの大規模な実世界のアプリケーション(実際、それらのほとんどは元々)と多くのオペレーティングシステムを生み出しました。

最小限の痛みと最大限のパフォーマンスで大規模な製品に確実に使用できます


4
ええ、そして数え切れないほどの測定基準の研究は、それがおよそ150KLOCでガスを使い果たすことを示しました。構造化プログラミングが複雑な負荷の下でどのように崩壊するかについての論文については、Petzoldの頃のWindows SDKを見てください。8つの引数を持つ関数、2つは6〜10のメンバーを持つ構造体です。計算のすべての単位にデータを出し入れすることは、最終的には機能しません。
ロブ

2
OKですが、これほど大きくなるアプリケーションはいくつありますか?OOPの問題は、理解するのが非常に複雑で、広大なアプリケーション向けに設計されていることですが、小さなアプリケーションでもデフォルトです。これには、小さなアプリを不必要に複雑にしすぎるという逆の効果があります。
niico 2013

オブジェクト指向プログラミングでは、コンストラクターや長いゲッター/セッターメソッドが必要なため、アプリケーションが長くなることがあります。Cのようなこれらの初期の手続き型言語は、メタプログラミング、ポリモーフィズムのシステム、クロージャ、またはJSON /一般的なデータ表現の簡単な構文をサポートしていませんでした。Cは、オプションの引数もサポートしていませんでした。モナドとマクロを使用して、強力な組み込みドメイン固有言語を構築できます。
aoeu256 2016年

8つの引数を持つ関数-デフォルトの引数について聞いたことがありますか?HashTablesの手続き型+ファーストクラスのサポート+ JavaScript、Pythonなどのクロージャはどうですか?それらには、それほど多くのコードがなくてもOOPの多くの利点があります。
aoeu256 2017年

4

ベクトルリレーショナルデータモデリングは、ネットワーク常駐モデルブローカーであるグローバル情報ネットワークアーキテクチャ内で、ドメイン関連のセマンティクスを持つ実行可能な情報モデルを作成するために使用されます。


4

まず、現在使用されているプログラミング言語の多く(特に「高級言語」)はマルチパラダイムであることに注意してください。つまり、純粋にOOPであるプログラムを構築することは決してありません(SmalltalkまたはEiffelを使用して大きなプロジェクトを構築する場合を除く)。

たとえば、PHPを見てください。

  • OOPの多くの要素があります(バージョン5以降)
  • 以前はほとんど手続き型でした
  • 宣言型プログラミングの要素(配列関数など)があります
  • 関数型プログラミングの多くの要素を実装しました(バージョン5.4以降)

基本的に、PHPは多くの異なるパラダイムを結び付けています(そしてそれ自体が「グルー言語」です)。

また、Javaは、オブジェクト指向パラダイム(関数型プログラミングなど)からではない多くの概念を実装しています。

ウィキペディアでタイプ別のプログラミング言語のリストを確認してくださいhttps//en.wikipedia.org/wiki/List_of_programming_languages_by_type#Imperative_languages(100%正確ではありません)。

関数型プログラミング(宣言型プログラミングのサブセット)

  • Wideleyは実際に使用されています(PHPJavaなどの接着言語の一部になり、関数型プログラミングの概念を実装しています)
  • 多くのアイデアは間違いなく一見の価値があるLISPに由来します
  • たとえばHaskellを使用してアプリケーション全体を構築できるため、OOPを「置き換える」ことができます

手続き型プログラミング

  • C(主に手続き型言語として)は今でも最も広く使用されている言語の1つです
  • 多くの現代の接着剤言語は最初は手続き型でした
  • それでも多くのプログラムはほとんど手続き型です(したがって、必要に応じてOOPを「置き換える」ことができます)

論理プログラミング

  • 最も顕著な例はPrologです。これは、ルールベースの論理クエリの恩恵を受ける特定のタスクに使用されます
  • 大規模なプロジェクトの構築に関してOOPを「置き換える」ことはできませんが、他の用語で置き換えることはできます

一般的な宣言型/ドメイン固有言語

  • プロジェクトでSQLを使用していますか?その場合、それらは純粋にOOPではなく、SQLは本質的に宣言型です。
  • 多くのドメイン固有言語(CSSなど)は宣言型です

一般的な命令型プログラミング

このリストは完全ではありません、それはただ考えを与えるでしょう。大きなアプリケーションを作成するときは通常、さまざまなパラダイムを使用しており、使用している各言語でさえ複数のパラダイムを実装していることに注意してください。

OOPは通常、データをモデル化するときに大規模で複雑な関係を構築するための適切な選択と見なされます。他の多くのタスクに対応することが常にパラダイムであるとは限りません。


1

FP-関数型プログラミングは非常に人気のあるプログラミングパラダイムであり、非常に長い間存在しており、近年、ますます目立つようになり始めています。FPは、可変性、再帰、および副作用のない機能よりも不変性を優先します。人気のあるfp言語の例としては、Erlang、Scala、F#、Haskell、Lispなどがあります。


-6

現在、OOPを真に置き換えることができるパラダイムはありません。OOP(の利点)の問題は、リソースの自動解放、データの検証など、膨大な量の作業を実行し、コードの検証を容易にすることです。もちろん、世界の既存のライブラリの大部分はC ++、C#、JavaなどのOOP言語で記述されています。そのような大規模な図書館などなしでうまくやっていくという現実は非常に疑わしいです。

ニッチな世界や学術的な世界では、関数型プログラミングがたくさんあります。ただし、本当に大規模なプロジェクトを実行したい場合は、OOPが唯一の方法です。

ジェネリックプログラミングは新しいパラダイムとして登場すると思います。ただし、実際にはまだ開発段階にあり、C ++ / Dだけが真に優れたジェネリックプログラミングを提供します。


3
OOPはそれらのことを何もしません。.Netのように、OOフレームワークの設計にそれらが含まれている場合、またはそれらを作成する意思がある場合にのみ、それらを簡単にすることができます。
マットエレン

技術的には、その通りです。ただし、実際には、すべての一般的なオブジェクト指向言語には、オブジェクト指向の機能としてリソース管理が含まれています。それを含まない言語をサポートする直接オブジェクトを見つけるのは難しいでしょう。そしてOPは明らかに理論ではなく実践に興味を持っています。
子犬

3
リソース管理はオブジェクト指向の機能ではありません-リソース管理は、オブジェクト指向であるかどうかに関係なく、命令型プログラミング言語の機能です。システムリソースを明示的に管理することを強制する純粋に関数型言語を私は知りません。
マシューJモリソン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.