私には、電気工学、物理工学、機械工学のバックグラウンドを持つたくさんの友達がいて、「OOP」とは何なのかについて知りたいと思っています。彼らはすべてMatlabをよく知っているので、基本的なプログラミングのバックグラウンドがあります。しかし、それらは、OOPが紹介する概念から利益を得ることができる複雑な型システムを把握するのに非常に苦労しています。
誰にでも説明できる方法を提案できますか?私はMatlabに慣れていないので、類似点を見つけるのに苦労しています。形や動物のような単純な例を使用することは、それらのエンジニアにとって少し抽象的すぎると思います。これまで、Matrixインターフェイスと配列ベース/スパース/あらゆる実装の使用を試みましたが、Matlabでさまざまなマトリックスタイプが既に十分にサポートされているため、うまく機能しませんでした。
2008年以降、Matlabはオブジェクト指向プログラミングをサポートしています。したがって、もし慣れ親しんだ方法でOOPについて知りたい場合は、 MatlabのOOPに関するドキュメント 、特に 例 。
少し前に、私はMatlabを使用している同僚の何人かをOOPに紹介していました。ここに私が使用したいくつかの例があります。
重要なのは、OOPで行うすべてのことですが、それ以外の場合でも行うことができます。 OOPで許可されるのは、(1)より優れた構造を作成し、(2)バンドルコードを作成し、(3)コードのモジュール化とプログラミングの高速化を容易にすることです。
自動的に更新されるフィールドを持つ構造。たとえば、座標をピクセル単位で保存します(画像上で測定するため)が、距離の計算にはミクロン単位にする必要があります。構造体に両方を格納することは問題があります。1つを変更した場合、もう1つを変更することを忘れてはならないからです(そうすることになります)。したがって、すべての座標をミクロン単位で保存することを選択します。つまり、ピクセル単位で座標を必要とするたびに、変換する必要があり、煩わしく、エラーが発生しやすくなります。
オブジェクトでは、「ピクセル単位の座標」を依存プロパティにし、変換が自動的に行われ、2つの座標を同時に更新することを心配する必要がありません。もちろん、さらに多くのことができます。たとえば、構造に「編集」メソッドを含めると、GUIがポップアップ表示され、値を簡単に編集できます。または、構造体の値が変更されるたびに呼び出されるsaveメソッドを持つこともできます。
関数をデータ構造にバンドルできます。たとえば、plot(myDataStructure)
を呼び出すデータ用にカスタマイズされたプロット関数を持つことができます。同様に、disp
メソッドをカスタマイズしたり、データ処理メソッドをデータにアタッチしたりすることもできます。
ブリッジの例を見つけようとしないでください。 OOPは、「MATLABスタイルのコード」とは完全に異なる領域に適しています(逆も同様です)。同じ種類の説明に行き、手続き型プログラミングについて少し説明しますが、構造体や同様のデータ構造を扱ったことはありません。
ベクトル化されたMATLABコードは、それに対して強い機能的で宣言的な感じがします。行列は、ある空間でサンプルとして頻繁に見られ、それらの行列に対する操作はその空間の変換として行われます。現象、プロセス、またはエンティティが(ベクトル化された)MATLABを使用してモデル化される場合、プログラムロジックとモデル化されるエンティティの概念要素との間の媒介として機能する明示的な数値表現がしばしば存在します。その結果、問題領域の複雑さは、プログラムロジックや制御フローの複雑さではなく、数値の複雑さとして反映される傾向があります。
オブジェクト指向のパラダイムは非常に異なる感覚を持っています。これは、世界の構造的関係をモデリングするためのはるかに直接的なアプローチと組み合わせて頻繁に使用されます。多くの場合、OOプログラムはエンティティの直接モデルであり、プログラムロジックはモデル化されているシステムの属性とプロパティを直接的または間接的にミラー化します。この結果、= OOプログラムロジックは、テスト対象のシステムの複雑さをより直接的に反映しているため、構造的な「深さ」(および場合によっては複雑さ)を持つ傾向があります。
とはいえ、オブジェクトモデリングパラダイムが特定の問題を理解し説明する方法と非常によく一致している状況は数多くあります。これは特に、より多様な範囲の属性と動作を持つ個別のエンティティをモデル化しようとしている場合に当てはまります。たとえば、各エンティティを個別に検討することは、各プロパティを個別に検討するよりも、エンティティを母集団として検討するよりも有益です。
OOPを使用すると、個々のエンティティとそのプロパティについて考えることに時間を費やします。集合的な動作は、視覚化して観察することが困難です。構造と関係は、コードで明示的に表現される傾向があります。
ベクトル化されたMATLABでは、エンティティの母集団について考えることに時間を費やします。集団行動は観察しやすくなります。構造と関係は、コードで暗黙的に表現される傾向があります。
ほとんどのプログラマーは、オブジェクト指向プログラミングの1つの主要な側面である構造に精通しています。オブジェクトは構造体のようなものですが、構造体内のデータを処理するための独自の関数呼び出しがあると説明します。次に、継承、関数の引き渡しなどの詳細をゆっくりと追加します。
彼らはすべてMatlabをよく知っています
それからそれは非常に簡単です:彼らにsimulinkを試させてください。 SimulinkモデルはOOP精神にあります。Simulinkモデルの作成方法を理解していて、Simulinkがどのように機能するかを知っている場合、OOは約。
Matlabは単なる言語です。 OOPがコンセプトです。
例の少ない説明を使用して概念を説明してください。エンジニアは確かに異なる領域と単位を理解しているため(たとえば、距離に温度を加えるのは奇妙です)、Matlabで具体的な例を必要とせずに、カプセル化と多型を直感的に理解する必要があります。抽象化を十分に簡単に説明できるはずです。継承と構成は、例がないと説明が難しくなりますが、概念を明確に説明し、理解する必要があります。
ジェネリックスと型の特異性は、数学の背景からの例を通して動機づけられるべきです。関数型プログラミング、関数の渡し、ラムダはOOP=それ自体ではありません。エンジニアに通常提示されるより抽象的な数学の背景なしでは説明するのが困難です(エンジニアリング、ソフトウェア、数学の両方を研究していて、私は彼らの異なる専門分野への洞察を持っています)。
Matlabを直接使用して例を提供することはできないかもしれませんが、構造を含む例を使用して抽象化とカプセル化を確実に説明することができます。関数(メソッド)をデータでカプセル化できない言語でも、特定の関数が特定のドメインに対してのみ定義されている方法を説明できます。
多くの開発者が継承よりも構成を重視していることを考えると、継承、構成、および2つの相対的なメリットを説明できます。
整数、有理数、実数、複素数の違いを確認することで、多態性を自然な形で動機づけることができます。次に、「通常の」算術演算子が関数(メソッド)であることを説明しますが、演算子(ex '+')見た目は同じですが、異なるドメインで使用すると機能が異なります。
幸運を!