6

原則として、CやMATLABなどの手続き言語でさえオブジェクト指向のものにすることは可能です。この質問は、かなりよく議論されているherehereです。オブジェクト指向の原則を手続き型言語で適用する必要がありますか?

私がこれらの議論およびそれらの参考文献から欠落していることが、1つがであるべきかどうかについての説明であったことが、はそのような原則を適用することであった。そうして得られる具体的なことはありますか?明らかにが可能です。ですが、それはとなるようにお勧めします?オープンソースプロジェクトには、この慣行が明確な利点をもたらした例がありますか?

明確化おそらく例は、オーダーです。

いくつかの機械学習アルゴリズムを実装するMATLABコードを継承しました。渡されるフラグに応じて、モデルを訓練するか、将来の値を予測するためにそれを使用するか、単一の関数building_modelは基本的にあります:

building_model('train', ...) % ... stands for the data with which the model is trained 

モデル自体を用いて実装されますMATLABの永続変数はbuilding_modelです。

building_modelは、トレーニング用と予測用の2つの機能に分解されました。固定変数として実装するために使用されるモデルはいわば、外部化されています。これは、大まかに話している

model = new_model() 
model = model_train(model, ...) 
prediction = model_predict(model) 

、限り私はMATLABでOOPの一部の機能をエミュレート管理できるよう。私のビルドモデルモジュールは、コンストラクタと2つのメソッドmodel_trainmodel_predictを使って、クラスのように機能します。私はある程度のカプセル化を達成しましたが(発信者がmodelの内部で手を出すのを妨げるものは何もありません)、原則として多形性も適応できます。余分なボーナスとして、はmodelを返さないので、コマンド/クエリーの分離はほぼ無料であるため、modelを変更することはできません。

(賢明な読者は、MATLABが既にオブジェクト指向のシステムを有していることが指摘されます。以前のバージョンとの性能と互換性を含む様々な理由のために、私はそれを使用することはできません。)

IがCで同様の機構を想像することができいくつかのデータ構造を設計し、最初の引数がそのデータ構造のインスタンスになる関数を記述します。

私が知りたいことは、このプログラミング方法をどこまで押し込めるかということです。これは一般的に受け入れられているパターンですか(私はその言葉を言っています)?私が注意すべき性能上の問題はありますか?

+1

これは、一般的にオブジェクト指向の慣行についての議論から欠落していることがあります。 OOPが言語に組み込まれているかどうか、または言語の助けを借りずに採用しようとする設計方法論に過ぎないかどうかは、依然として決定する必要があります。どちらの場合も同じ利点(および短所)が適用されます。 –

答えて

2

私はこれは本当に重要な議論だと思います。私は、OOPは常にすべての言語で最高のソリューションではないと言うのは安全だと思います。例えば。 C++またはPythonの場合、OOPは通常、例えば、データをカプセル化します。これらの言語はクラスに焦点を当てて設計されています。他の言語では、他の方法で良質のコードを作成する方が簡単かもしれません。

私はCommon Lispが良い例だと思います。それは本当に良いOOPシステム(CLOS)を持っていると私は本当に完全だと言うだろう。しかし、OOPは、PythonやC++のように、Common Lispではほとんど使われていません。これは、基本的なソフトウェアエンジニアリングビルディングブロックを提供するために必要なものではなく、便利な機能なのでです。

OOPを使用するかどうかは、解決しようとしている問題によって異なります。一例として、私はGUIのものはOOPに取り組むのに本当に役立つと思います。

+0

+1 "私はGUIのものはOOPに取り組むのに本当に便利だと思います。"これは、Stroustrup博士が学生にOOPを紹介する方法です。 – AraK

-1

オブジェクト指向は ソフトウェア工学の目標を達成するための手段です。

目的:メンテナンス性、拡張性、組織化されたソースコード(検索可能性など))
OOの構築物:カプセル化(「データ型/構造」そのデータを操作することができます)が所有する唯一の方法は

目標:既存のものを変更することなく、新しい機能を開発する能力、コードは
OOの構築物を再利用します:実装の継承、ポリモーフィズム

目標:抽象化(あなたは、クライアントを変更することなく、実装の変更、特定の種類または操作にコミットする必要はありません)
OOコンストラクト:インターフェイスの継承、インターフェース、抽象クラス

目的は正当化を必要としません。 OO言語のサポートが必要なのかどうかは、あなたの特定の状況によって異なります。 Cを使用する必要がある場合でも、いくつかのオブジェクト指向の構築を模倣し、うまくいけばそれを楽しむことができます。

あなたには、すべてのOOの原則を遵守しながら、コードの大混乱を開発することは絶対に可能です。

私は他の人が他の目標と例を​​リストアップ(とstackoverflowの記事でテーブルを編集する方法を知っている)ことができると確信してい

+3

私は本当にOOが上記の目標を達成するための手段であることには同意しません。このすべては、OOの発明以前には本当に可能でした。 –

関連する問題