質問

しかし、おそらく最大の約束のオブジェクト指向パラダイムのコード再利用しています。その紛争することを実現しました。なぜったいない)実現するのでしょうか。

なコードとして再利用しOOPを定義しようとしたら起動しませんでしたプロジェクトをより生産?

以上の扱いや?又は維持しやすくなる?やりますか。

しょうた様コード再利用ができないと何もうまくいかないものはいくつかの方法が考えられているこの目標の達成に向けの方法についてのコード再利用によるOOP.になっているのではないでし便利だけれど、いいことばかり? がより良い方法で達成コード再利用 以上のオブジェクト指向、classing,多型うにはどうすればよいのですか。どうしていいですか? なぜ?

ご経験OOP再利用又はその他のパラダイムを再利用しています。

役に立ちましたか?

解決

コードの再利用はかなり良い考えです。 素晴らしいものではありません.

私は、約30年のソフトウェアエンジニアリングから引き出された視点を持ち、「再利用」しようとしています。

70年代前半に構築したOSの設計を70年代後半に構築した別のOSについて、80年代に「コード再利用」を調査トピックとして調査し始めました。

コードの再利用の大部分は、既存のコードに誠実に再利用する能力です。しかし、世界はそうです 満杯 コードの;どうすればあなたが欲しいものを見つけることができますか?これが私が呼んでいるものです 呪いを再利用します:

私はサンタクロース(OKオープンソース)で、10億のソフトウェアコンポーネントの袋を持っています。あなたはそれらのいずれかを持つことができます。

選んで幸運。

再利用の問題をうまく解決するには:

  • 再利用者は、彼が必要なもの(機能、パフォーマンス、ターゲット言語、環境の仮定、...)を何らかの形で指定する必要があります。
  • これらの潜在的な基準によってさまざまな方法でインデックス化された「再利用可能な」コードのライブラリが必要です
  • 候補要素を選択するためには、何十億の要素で、それらをすべて個人的に見ることはできません)には、いくつかのメカニズムが存在する必要があります)
  • 選ばれた候補者がどのくらいの仕様からどれだけ離れているかをキャラクター化する方法が必要です
  • 再利用者が選択した再利用可能なコードを変更できるようにするために、いくつかの定期的なプロセスが存在する必要があります(OOPの最大の貢献は次のとおりです。スロットをオーバーライドすることで既存のコンポーネント/オブジェクトを編集できます。OOPは他のヘルプを提供しません)。
  • これはすべて、単にそれを再コーディングするよりも明らかに安くなければなりません

ほとんどの場合、長年にわたって発見されてきたのは、コードを再利用可能にするためには、その目的のために設計する必要があるか、暗黙の仮定が多すぎるということです。最も成功したコードの再利用ライブラリは、実際にはかなり小さいものです。間違いなくライブラリとフレームワークは「再利用可能な」コードであり、それらは非常に成功しています。 JavaとC#は、それらが非常に優れたコンピューター言語であるためではなく、むしろ、利用可能な大きな設計、実装、文書化されたライブラリを持っているために成功します。しかし、人々はライブラリのソースコードを見ていません。彼らは単に十分に文書化されたAPI(一般的に使用可能になるように設計)を呼び出します。

コードの再利用が行っていない(OOPどちらも)これは、システムをコーディングする能力を桁違いに改善します。

重要な欠陥はそれだと思います コードが組み込まれているという仮定が多すぎるため、あらゆる種類のコードの再利用は根本的に制限されています. 。コードを小さくすると、仮定を最小限に抑えますが、ゼロから構築するためのコストはそれほど大きくなく、再利用のゲインは効果的ではありません。コードチャンクを巨大にすると、新しいコンテキストではほとんど役に立たない。ガリバーのように、彼らは100万の小さな弦によってビーチに縛られており、あなたはそれらをすべてカットする余裕がありません。

私たちが取り組むべきことはです コードを構築するための知識の再利用. 。これを行うことができれば、その知識を適用して、必要なコードを構築し、現在の仮定のセットを処理できます。

これを行うには、ソフトウェアコンポーネントを特徴付ける同じ仕様機能が必要です(あなたが望むことを言わなければなりません!)。しかし、その後、あなたはこの「構造」知識を仕様に適用します 生む あなたが望むコード。

コミュニティとして、私たちはまだこれがあまり得意ではありません。しかし、人々はいつもそれをします。なぜ自動化できないのですか?多くの研究があり、これは多くの状況で行うことができることを示しています。

これに必要な機械の重要な作品の1つは、「コンポーネントの説明」を受け入れるための機械的ツールです(これらは単なる正式なドキュメントであり、プログラミング言語のように解析できます)。 プログラム変換 彼らへ。

コンパイラはすでにこれを行っています: - }そして彼らは彼らが取り組む問題のクラスが本当に得意です。

コード生成を伴うUMLモデルは、これを行うための1つの試みです。あまり良い試みではありません。ほとんどのUMLモデルで言うことは、「このように見えるデータがある」ということです。機能が除外されている場合、実際のプログラムを生成するのはかなり難しいです。

私は構築しようとしています DMSと呼ばれるツールである実用的なプログラム変換システム. 。プログラムの変換を抽象仕様を生成するための抽象的な仕様にそれほど適用することで、それをクリーンアップするためのレガシーコードに非常によく気を取られています。 (これらは抽象的に同じ問題です!)。 (そのようなツールを構築するには多くの時間がかかります。私はこれを15年間行ってきましたが、その間に食べなければなりません)。

しかし、DMSには上記の2つの重要なプロパティがあります。arbitrary意的な正式な仕様を処理する能力と、「コード生成知識」を変換としてキャプチャし、オンデマンドで適用する能力です。そして驚くべきことに、私たちはいくつかの特別なケースで生成します。仕様からのかなり興味深いコードです。 DMSは、その実装を生成するためにそれ自体を使用して主に構築されています。それは私たちにとって、少なくとも(知識)再利用の約束のいくつかを達成しました:非常に重要な生産性の向上。私は約7人の技術者のチームを持っています。おそらくDMSの「仕様」の1-2 MSLOCを作成しましたが、生成されたコードの10mslocが10mslocを持っています。

概要: 世代の知識の再利用 勝利ではありません コードの再利用.

他のヒント

コードの再利用はOOPで達成されますが、機能プログラミングでも達成されます。他の場所でこの機能を使用できるように、コードのブロックを取り、コードの残りの部分で呼び出すことができるようにするときはいつでもコードの再利用です。

このタイプのコードの再利用は、この1つの呼び出し可能なブロックを変更すると呼ばれるすべての場所を変更するため、コードがより管理しやすくなります。この結果も品質を向上させ、読みやすさを向上させます。

OOPが単にコードの再利用を提供するためにそこにいるかどうかはわかりません。 OOPは、オブジェクトと対話し、データ構造の詳細を抽象化する方法として見ています。

Wikpediaから:

オブジェクト指向のプログラミングには、1960年代にまでさかのぼることができるルーツがあります。ハードウェアとソフトウェアがますます複雑になるにつれて、管理性が懸念されることがよくありました。研究者は、ソフトウェアの品質を維持する方法を研究し、部分的にオブジェクト指向のプログラミングを開発し、プログラミングロジックの個別の再利用可能な単位を強く強調することにより、一般的な問題に対処しました。このテクノロジーは、プロセスではなくデータに焦点を当てており、プログラムは自給自足のモジュール(「クラス」)で構成されており、各インスタンス(「オブジェクト」)には、独自のデータ構造(「メンバー」)を操作するために必要なすべての情報が含まれています。これは、特にデータではなくモジュールの機能に焦点を当てた長年にわたって支配的であった既存のモジュラープログラミングとは対照的ですが、コードの再利用と、プログラミングロジックの自給自足の再利用可能な単位を等しく提供し、コラボレーションを可能にしますリンクされたモジュール(サブルーチン)の使用を通じて。まだ続いているこのより一般的なアプローチは、データと動作を個別に考慮する傾向があります。

はいといいえ

コードの再利用は、さまざまなアクティビティのすべての用語です。

  1. 単一のプロジェクト内でコードの再利用。 OOはこれに完全に適しています。適切に設計されたアプリケーションは、モデル化された世界の関係を密接にマッピングするため、重複コードを可能な限り削除し、推奨されます。ただし、事前のテクノロジーは同じことを達成できると主張することができますが、それは真実ですが、OOは多くの点でより便利です。
  2. サードパーティライブラリ これは、OOの有無にかかわらず等しく機能しているようです。
  3. 相互目的コードの再利用 OOの最大のコードリューズの約束は、1つのアプリケーション用に書かれたコードを後で別のアプリケーションに再利用できることでしたが、これは特別に設計されていませんでした。これは、OOの概念がより高い管理オフィスのドアを通してフィルターをかけたとき、すべての怒りでした。目的はOO設計の重要な側面であることが判明しました(そしておそらくすべての手続きコードですが、それは私の理論にすぎません)。 (誰もがあえて修正することをあえてしている古いフレームワークのよく知られているアンチパッテルンとその友人、わずかに異なるフレームワークスのために、通常はここから生まれます。)

私は長い答えを投稿しますが、なぜですか?ウディ・ダハンは、私よりもはるかに優れていると説明しています。

http://www.udidahan.com/2009/06/07/the-fallacy-of-reuse/

これが投稿の始まりです:

この業界は再利用に夢中になっています。

より多くのコードを再利用するだけで、すべてがより良いと信じているという信念があります。

オブジェクト指向の全体的なポイントは再利用であると言っている限り、一部の人は、カプセル化が大きなものではなかった。その後、コンポーネント指向が再利用を実現することになっていたものでした。どうやらそれはあまりうまく機能しなかったようです。なぜなら、ここで私たちは今、サービス志向に再利用される希望を固定しているからです。

パターンの本全体が、その日の方向で再利用を達成する方法について書かれています。サービスは、エンティティサービスやアクティビティサービスから、プロセスサービスとオーケストレーションサービスを通じて、これを達成しようとする際にあらゆる方法で分類されています。構成サービスは、再利用し、再利用可能なサービスを作成するための鍵として宣伝されています。

私もあなたを汚い小さな秘密に入れてもらうかもしれません:

再利用は誤りです

私はクリスに同意します、機能プログラミングはコードを再利用する良い方法です。

多くのプログラムには、繰り返されるコード構造があります。このためにいくつか デザインパターン oop-worldで使用されますが、これは 再帰関数パターンマッチング 機能的なプログラミング言語で。詳細については、最初の章を参照してください 現実世界の機能プログラミング.

OOPの深い継承は、多くの場合誤解を招く可能性があると思います。クラスがあり、密接に関連するメソッドの多くは異なるファイルに実装されています。として ジョー・アームストロング OOPについて言った:

オブジェクト指向の言語の問題は、彼らが持ち歩くこのすべての暗黙の環境を持っていることです。あなたはバナナが欲しかったのですが、あなたが手に入れたのは、バナナとジャングル全体を持っているゴリラでした。

高次関数 コードの再利用に関しても非常に便利です mapfoldr それがGoogleの基盤です MapReduce.

非同期メッセージの合格 また、複雑なソフトウェアを整理する良い方法であり、一部のコンピューター科学者は、オブジェクトが互いの非同期と通信すると想定されていると述べています。 教えて、聞かないでください OOP原則。これの詳細をご覧ください オブジェクト指向プログラミング:間違ったパス? そうだった ジョー・アームストロング 引用されています:

私はオブジェクト指向プログラミングとは何かについて疑問に思い始めました。エルランはオブジェクト指向ではなく、機能的なプログラミング言語だと思いました。それから、私の論文監督者は「しかし、あなたは間違っている、エルランは非常に目的志向だ」と言った。彼は、オブジェクト指向の言語はオブジェクト指向ではないと言いました。私はこれを信じているかどうかはよくわかりませんが、オブジェクト指向プログラミングの3つの教義はそれが基づいているということであるため、Erlangが唯一のオブジェクト指向言語であるかもしれませんが メッセージの合格, 、あなたが持っていること 隔離 オブジェクトと持っている間 多型.

イベント駆動型のシステムやエルランのように非同期メッセージの合格は、システムを切り離すための非常に良い方法であり、 ゆるい結合 複雑なシステムでは重要です。十分に分離されたシステムを使用すると、実行中にシステムを進化させることができます。ユニベットはこれについて素晴らしいプレゼンテーションをしました: ドメインイベント駆動型アーキテクチャ

ただし、コードの再利用のほとんどは、ライブラリとフレームワークを使用して行われると思います。

謙虚なUnixパイプは、コードの再利用のために多くのことをしました。オブジェクトは、たまたまコードが来たときに直感的な方法であり、後に人々がそれにあらゆるものに取り組み始めました。一般的なオブジェクトはカプセル化用であり、コードの再利用ではなく、コードの再利用にはもっと何かが必要であり、クラス継承階層はコードの再利用メカニズムが本当にすべきであるべきものの貧弱な代替品です。

OOPは特別なものではありません。 OOPの有無にかかわらず、再利用可能なコードを作成できます。 純粋な機能は特に再利用可能です: : 例えば、 java.lang.math.sqrt(double) 数字を取り、数字を出します。 OOPはありませんが、ほとんどのコードよりも間違いなく再利用可能です。

機能的なプログラミングビューから、OOPは主に状態の管理に関するものです。

機能プログラミングでは、リストに何百もの有用な関数を簡単に持つことができます。 http://haskell.org/ghc/docs/6.12.1/html/libraries/base-4.2.0.0/data-list.html.

リストクラスに何百もの方法がありますか?パブリックメソッドは、内部状態へのインターフェイスと見なされます。

悲しいことに、多くの小さな機能を使用する代わりに、一部の人々は機能を複製します。私にとっては、OOPからです コードの再利用を奨励しません 機能的なプログラミングと同様に。

私にとっては、はい、しかし常にではなく、他の方法で行われた可能性があります。

ほとんどの場合、抽象的なベースクラスを作成し、そのクラスの具体的な実装を作成します。

また、多くのフレームワークが継承を利用してコードの再利用を提供します(Delphi、Java、.netは、すぐに頭に浮かぶものです)。

それは、多くのユーティリティライブラリとコードのスニペットも仕事をすることができなかったということではありませんが、適切に設計されたオブジェクトの階層には喜ばしいことがあります。

私の経験では、継承階層のようなOOP原則を使用していたよりも、一般的なプログラミング施設(C ++テンプレートなど)を使用して「再利用可能な」コードを活用することに成功しました。

OOPは、効果的な再利用には開いています。

再利用するにはあまりにも多くの方法があります。各パブリッククラスは次のように尋ねます。 「私の新しいインスタンスを作る!」, 、各パブリック方法には次のように書かれています。 "電話してね!", 、保護された各メソッドが生成します。 「私を無効に!」 - そして、これらの再利用方法はすべてです 違う, 、それらは異なるパラメーターを持ち、異なるコンテキストで表示され、すべて異なるルールがあり、それを呼び出す/拡張/オーバーライドする方法を持っています。

API より良いです、それはOOP(または非oop)ポイントの厳格なサブセットですが、実際の生活では、APIは過剰に発生し、永遠に成長しているため、まだ多くの接続ポイントがあります。また、優れたAPIは生活を楽にすることができます。これは、OOPにインターフェイスを提供する最良の方法です。


Datadlowパラダイム コンポーネントの厳格なインターフェイスを提供し、次のタイプのポートがあります。

  • 消費者(入力)、および
  • 生産者(出力)。

ドメインに依存すると、パケットタイプがいくつかあるため、消費者と生産者を接続できます。その中で最も美しい部分は、接続にパラメーターやオーハーの調整がないため、視覚的に行うことができるということです。彼らは本当に消費者とプロデューサーを接続します。

私は少し不明でした、あなたは見てみるかもしれません StackOverFlowの「DataFlow」タグ, 、 また ウィキペディア「DataFowプログラミング」 またはウィキペディア 「フローベースのプログラミング」.

(また、C ++でデータフローシステムを書きました。したがって、OOPとDFは敵ではありません。DFはより高いレベルの組織的方法です。)

Commonlispでは、再利用を達成するための多くの手段があります。

  • ダイナミックタイピング、デフォルトでコードをジェネリックにする

  • 命令的な抽象化、すなわちサブルーチン

  • 複数の継承を伴うオブジェクト指向 複数のディスパッチ

  • 構文 - アブストラクション、新しい構文コンストラクトを定義したり、ボイラープレートコードを省略したりする機能

  • 機能的抽象化、閉鎖、および高次関数

CommonLispエクスペリエンスを他の言語と比較しようとすると、コードの再利用を容易にする主要な機能はの存在であることがわかります。 両方とも オブジェクト指向および機能的抽象化。それらは代替よりも補完的なものです。それらのいずれかがなければ、不器用な方法で欠落している機能を再実装することを余儀なくされています。たとえば、閉鎖とパターンマッチングとして使用されるファンチャークラスを参照してください。

人々がそれを説明する方法を「再利用」するようなものは本当にありません。再利用はです 偶然 何の財産。計画するのは難しいです。 「再利用」について話すときにほとんどの人が意味することは「使用」です。それははるかに魅力的でエキサイティングな用語です。ライブラリを使用するとき、通常はそれが意図されていたものにそれを使用しています。あなたは いいえ あなたがそれで本当にクレイジーなことをしていない限り、それを再利用してください。

その意味で、現実の世界での再利用は、物事を再利用することです。ここでこれらの座席を再利用して、それらを形成するように再配置することができます...ベッド!あまり快適なベッドではありませんが、私はそれをすることができます。それは彼らの主な使用ではありません。私は彼らの元の適用性の領域の外でそれらを再利用しています。 [...]明日、私は英国に戻ります。私はそうします いいえ 飛行機を再利用します。私はそれが意図されていた目的のためにそれを使用します、それについて派手なものや刺激的なものは何もありません。

- ケブリン・ヘニー

と思い、リスクを嘲笑と、自白しんでみてOOPいことです。ませんでも私のところに来なさいます。自分の経験的関係データベースだと思っているテーブルが仲間入り。あこがしているので、これから、初めから回避するに配線をやり直お考えています。いる高級とを拒否するスクラップキャリアがアイボリータワー理論。のようなもんです。

最初に思ったの全体の概念が変だった。それだけでも不要!しかも夢中にしてくれます。明らかである程度の理解の前にできる特典もの又は任してます。

コードの再利用がかかる意志を繰り返さないコードに関する理解の達成に、先行す。きを回避するための再利用コードいただく場合もプライベートビーチがありのですか?とのない言語のよう厳重にOOで捨てるときにエラーが発生も考えるべき受け継いでいコードから別のクラスです。で提供されている環境を実施します。

私の最大の利益のOOPは一般に受け入れのコードできます。あとは肉汁.チームのプログラマーが完全に賛成どすべての授業が設計される必要があるものとなってくれることについてのコードです。

見ているが十分な手続き上のコードを知らないのも、もときます。

ooopはあなたに与えます もっと コードを再利用する方法。それだけです。

水平の再利用:アスペクト、特性、移植片

クラシックOOは、特にクラス間で実際の機能を共有するより良い方法がないためにすべての相続財産を狂気にするときに、コードの再利用に不足することがあります。この問題では、AOP、特性、移植片など、水平方向の再利用メカニズムが作成されています。

アスペクト指向プログラミング

私はAOPをOOPの半オレンジの欠落と考えています。 AOPは実際にはそれほど知られていませんが、生産コードに到達しました。

簡単な用語で説明するために試してみてください。アスペクトと呼ばれる特別な構造で機能を注入してフィルタリングできると想像してください。これらの側面には、どのようにどのように影響を受けるかを定義する「方法」があります。 反射, 、しかしコンパイル時に、このプロセスは呼ばれます 織り.

例は、「GETから始まる特定のクラスのすべての方法について、プログラムがログファイルに入手したデータとGETの時間を書き込みます」を伝える側面です。

AOPをよりよく理解したい場合は、この2つの講演をご覧ください。

特性と移植片

特性 OOPを補完する再利用可能なコードを定義するための別の構成要素であり、それらはに似ています ミキシン, 、しかしクリーナー。

それらを説明するのではなく、あります 両方を説明する素晴らしいPHP RFC. 。特性はPHPのところに来ていますが、すでにトランクにコミットされています。

要約すれば

OOPはモジュール性の重要です。 OOPはまだ不完全です.

OOPは、それらのツールなしではより多くの場所で使用できるコードを作成できる便利なツールのセットを提供します。あなたが書くならば PrintIt 古いオブジェクトと呼び出しをとる関数 .toString() その上で、複数の種類のオブジェクトで呼び出すとすぐに、そのコードを再利用することになります。これらのツールで、 コードの各行はもっと多くのことを行います。

機能的なプログラミングは、今ではヒップスターの間で非常に暑いです。それはあなたにを提供します 全分離 コードの各行をより多くするためのツールのセット。それはおそらく良くも機能しませんが、ツールボックスに別のツールを提供します。

(オブジェクト指向の再利用の余分なレベルの余分なレベルのためにクレイジーなアイデアがありました:アイデアは、単一を定義できるということでした Customer クラスと私たちが書いたすべてのアプリケーションでそれを使用します。その後、アプリケーションはあちこちで少し接着剤になります。これは機能しませんでした。しかし、それはOOが失敗したか、その再利用が失敗したことを意味するものではありません。アプリケーション内での基本的なタイプのコード再利用により、アプリケーションをより多く作成し、それらをより速く書くことが可能になりました。)

上記の投稿を読んで、いくつかの発言:

  • 多くの人は、OOPでのコードの再利用は継承を意味すると考えています。私は同意しない。インターフェイスと契約は、OOPシステムで再利用するコアです。 OOPは、コンポーネントテクノロジーの作成におけるグレーボックスの試みです。
  • 再利用の主題としてのドメイン固有の「フレームワーク」の違いは、私をあまりにも抽象的であると考えています。物事に関する私の見解では、コンポーネント(簡潔で最小限の、再利用可能なインターフェイス契約と実装)は、それが対処する問題がよく理解されている場合にのみ行うことができます。ドメイン以外の専門家がドメインに関する知識を少なくして仕事をすることを可能にするドメイン固有のコンポーネントは、(再)有用なコンポーネントです。ユーザーはインターフェイスを理解する必要がありますが、問題ドメインの複雑さは少なくなります。
  • 再利用のレベルはしばしば忘れられます:アイデアの再利用、仕様の再利用、アーキテクチャ/デザインの再利用、インターフェイスの再利用、テストケースの再利用。コードの再利用は常に好ましいとは限りません。しかし、新しい類似の製品に取り組むために特定のアーキテクチャに固執するのは、多くの場合大きな時間を節約します。
  • OOPの設計パターン(Gammaet。Al)は、大規模なコードの再利用のコンテキストで意味があるのではなく、戦術的な実装技術について詳しく説明しました。 OOP要素を使用してアプリケーションを作成するのに役立ちますが、単一のアプリケーションを超えて「コードの再利用」の質問の解決策とは見なされません。
  • たぶんそれは公平ではありません:20年のC/C ++/C#体験と6か月の機能プログラミング(F#)。再利用を可能にする主要な要素の1つは、人々が「インターフェイス」を簡単に見つけ、それを研究し、理解し、それを使用する必要があることです。純粋な機能プログラミングでは、構造、再利用の候補、またはすべてがどこから始まるか、どこで終わるのかを簡単に見ることができません。非常に賞賛された「構文砂糖」は、私の目にはしばしば塩であり、何が起こるかを簡単に見ることができません。したがって、私は機能的なものを再利用しようとする可能性が低いでしょう(それは何ですか - 機能は何ですか?)、私は見られない隠れた副作用を持っているかもしれません(怠zyな評価、モナド、...)。誤解しないでください、機能的なプログラミングには非常にクールな側面がありますが、疑いの良い尺度で私が見るすべての強みは宣言されています。私は、職務後の未来が引退する前にそれをもたらし、それを見たいと思っていることを非常に興味があります;)
  • 仕様、設計、実装は結合されていますが、「同じもの」に関する簡単に横断できるビューはありません。新しいプログラミングのパラダイムよりも将来の生産性の向上には、ギャップを埋めることが、これらの見解間の相互利益を増加させる(自動化された推論、トレーサビリティ)がはるかに重要です。正式化された仕様言語、標準化されたテスト表記(TTCN3など)、およびコメントリッターなしの仕様に対するインターフェイスと契約の検証をサポートするプログラミング言語は、最も緊急に必要なものかもしれません。

問題はより微妙な私見です:

  1. ooopはaです 可変状態でコードを構築するための優れた方法. 。状態をオブジェクトにカプセル化することにより、命令的な状態コードがより理解しやすくなります。たとえば、状態がクラスの私的フィールドとして表現されている場合、あなたはそれを知っているので 少なくともこの特定の状態は、このクラスの方法によってのみ変更できます。 (そして、あなたは相続財産を乱用することでこの利益を簡単に破ることができます。)これで十分ですが、 waaayもっと これでさえないことよりも。
  2. 可変状態のコードは、本質的に再利用が困難です. 。不変のデータ構造を使用したコードよりもはるかに硬い。

それで OOP自体は、再利用可能なコードを作成することのPOVから悪くはありません, 、 しかし OOPを使用して記述されるコードの種類は、本質的に再利用するのが難しい.

また、 機能プログラミング 結果として生じる可能性があります より再利用可能なコード. 。しかし、期限を満たしている間に正気の機能コードを書くために抽象化を正しく取得することは実行不可能かもしれません。そして、「半分の」抽象化は、OOPスタイルをより簡単に表現できます。そして、それは生じる傾向がありません コードの再利用が簡単です - より高いレベルの抽象化は、コードの理解には、プログラマーの限られた認知能力からのより高い前払い投資が必要になることを意味します。

実用的な例として: ゲームコードには多くの可変状態が含まれます。これは、非常にパズル/アルゴリズムのものでない限り、ゲームのコーディングについて考える自然な方法であるため、OOを使用して明らかに構造化されることになります。そしてもちろん、再利用するのは難しいです。しかし、同じ知識を含む同じコード、 OOPなしで再利用するのはさらに難しいでしょう. 。そして、それを機能的なスタイルに書き換える必要があるかもしれません そのコード、その背後にある知識についての考え方を完全に変えます。 ええ、結果 コードの背後にある知識 OOからFPの書き直しの後、はるかに明確になるでしょう...しかし コストは膨大になる可能性があります そしてそれはそうかもしれません 信じられないほどスマートでよく抽象化されたコードを再利用したい人によっても支払わなければならない種類のコスト, 、逆説的に、技術的にはより再利用可能であっても、人々はコードを再利用しないことになります。

...最後の繊細さにつながる:コードの再利用は 人々|コード インターフェイス、コードのみではありません。 OOPは、最近書かれた多くの種類のコードについて考える人の数をうまくマッピングするため、このインターフェイスを提供するというまともな仕事をしています。 fpはコードの再利用に適しているかもしれませんが、私見ではありません 最近、人々が実際に書く必要がある種類のコードを簡単に再利用します。 これは、変更を記述する必要がある種類のコードとして変更されます。

PSそして、「OOは可変状態に関するものではないと言いたい場合は、不変の状態を持つOOを持つこともできます」...私は「FPを名前空間として使用するFP」と呼びます。それがあなたのために働くとき、それは素晴らしいことであり、それはいくつかの言語のモジュールシステムのいくつかの欠点を回避し、より再利用可能なコードをもたらす可能性があります。しかし、それはooではありません;)

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