OOPをMATLABプログラマーに説明する方法は?[閉まっている]


8

私には、電気工学、物理工学、機械工学のバックグラウンドを持ち、「OOP」とは何なのかについて知りたい友達がたくさんいます。彼らはすべてMatlabをよく知っているので、基本的なプログラミングの背景があります。しかし、OOPが導入する概念の恩恵を受けることができる複雑な型システムを把握するのは非常に困難です。

誰かが私にそれを説明しようと試みることができる方法を提案できますか?私自身はMatlabに慣れていないので、類似点を見つけるのに苦労しています。形や動物のような単純な例を使用するのは、それらのエンジニアにとって少し抽象的すぎると思います。これまでに、Matrixインターフェイスと配列ベースの/スパース/あらゆる実装を使用してみましたが、それはうまく機能しませんでした。おそらく、Matlabでさまざまなマトリックスタイプがすでに十分にサポートされているためです。


1
あなたの利益のために、より多様なライブラリ、より簡単なドキュメント、およびわずかに異なる構文があることを除いて、matlabはCのようなものであると想定できます。
PearsonArtPhoto

3
彼らが好奇心が強い場合、何が原因で少しグーグルして簡単な紹介を読むことができないのですか?優れたエンジニアが本当に何かに興味があり、その興味を追求していないとは思えません。

2
@Pear問題は言語自体だけではなく、言語の使い方にもあると思います。たとえば、私が理解しているように、彼らは実際には新しい型を定義していません。それでも、それは良い短い要約です:)
オーク

4
逃げろ!逃げる!
ジョブ

3
それらを台無しにしないでください。彼らは役に立たないOOPなしではるかに良くなるでしょう。
SKロジック

回答:


14

2008年以降、Matlabはオブジェクト指向プログラミングをサポートしています。したがって、彼らが慣れ親しんだ方法でOOPについて知りたい場合は、OOPに関するMatlabのドキュメント、特に例を確認することをお勧めします。

少し前に、私はMatlabを使用している同僚の何人かをOOPに紹介していました。ここに私が使用したいくつかの例があります。

重要なのは、OOPで行うすべてのことですが、それ以外の場合でも行うことができます。OOPを使用すると、(1)より優れた構造を作成し、(2)コードをバンドルし、(3)コードのモジュール化と高速プログラミングを容易にすることができます。

  1. 自動的に更新されるフィールドを持つ構造。たとえば、座標をピクセル単位で保存します(画像で測定するため)が、距離の計算では、ミクロン単位にする必要があります。構造体に両方を格納することは問題があります。1つを変更した場合、もう1つを変更することを忘れないでください(そうすることをお勧めします)。したがって、すべての座標をミクロン単位で保存することを選択します。つまり、ピクセル単位で座標を必要とするたびに、変換する必要があり、煩わしく、エラーが発生しやすくなります。
     
    オブジェクトを使用して、「ピクセル単位の座標」を依存プロパティにすると、変換が自動的に行われ、2つの座標を同時に更新することを心配する必要がありません。もちろん、もっと多くのことができます。たとえば、構造に「編集」メソッドを含めると、GUIがポップアップ表示され、値を簡単に編集できます。または、構造体の値が変更されるたびに呼び出されるsaveメソッドを持つこともできます。

  2. 関数をデータ構造にバンドルできます。たとえば、呼び出すデータに対してカスタマイズしたプロット関数を使用できますplot(myDataStructure)。同様に、dispメソッドをカスタマイズしたり、データ処理メソッドをデータにアタッチしたりすることもできます。


2008年から、MatlabのOOPが非常に遅いことを覚えています。
quant_dev '19

@quant_dev:状況は改善されました(2008年に初めて機能が提供されました。それ以来、最適化が行われています)。ただし、ユーザー定義オブジェクトのメソッドを呼び出すときは、関数を呼び出すときよりもオーバーヘッドが大きくなります。C ++の場合のようにOOPを全面的に実行するのではなく、オブジェクトがユーザーと実際の作業を実行する関数の間のインターフェイスとして機能するOOPと通常の関数を混在させる場合、システムは非常にうまく機能します。
ジョナス

私はあなたの例が好きですが、主要な再利用(OOPが得意とするもの)を探しているのでない限り、実際にはそれほど有益ではありません。ピクセルからミクロンへの変換を頻繁に行い、OOPを使用していない場合、関数呼び出しミクロン= convert_to_microns(pixels)を使用することは、クラス呼び出しに関するいくつかの主要なOOP構造を構築するのと同じくらい簡単で馴染みがあるように見えます。抽象化を使用することは素晴らしいですが、より手続き的な設定でOOPを学習することで、彼らの思考プロセスが変化する理由について強い推進力が必要になります。
Jeff Langemeier、2014

深刻な質問があります。MatlabのおもちゃがOOPと呼ばれているのに、CではOOPではないのはなぜですか?structメソッドを含むC言語は、Matlabの言語よりもはるかに魅力的です。
ar2015

@ ar2015:Matlabのすべての機能がMatlabが真面目なプログラミング言語であるかのように扱われる理由を尋ねていますか?またはstruct、CにはMatlabクラスにはない基本的なOOP機能があると思いますか?
ジョナス

4

ブリッジの例を見つけようとしないでください。OOPは、「MATLABスタイルのコード」とはまったく異なる領域に適しています(逆も同様です)。手続き型プログラミングについては少し知っているが、構造体や同様のデータ構造体を扱ったことがない人にも、同じような説明をします。


2

ベクトル化されたMATLABコードは、それに対して強い機能的で宣言的な感じがします。行列は、ある空間でサンプルとして頻繁に見られ、それらの行列に対する演算はその空間の変換として行われます。現象、プロセス、またはエンティティが(ベクトル化された)MATLABを使用してモデル化される場合、プログラムロジックとモデル化されるエンティティの概念要素の間の媒介として機能する明示的な数値表現が存在することがよくあります。その結果、問題領域の複雑さは、プログラムロジックや制御フローの複雑さではなく、数値の複雑さとして反映される傾向があります。

オブジェクト指向のパラダイムは、まったく異なる感覚を持っています。これは、世界の構造的関係をモデル化するためのはるかに直接的なアプローチと組み合わせて頻繁に使用されます。多くの場合、OOプログラムはエンティティの直接モデルであり、プログラムロジックは、モデル化されるシステムの属性とプロパティを直接的または間接的にミラー化します。この結果として、OOプログラムロジックは、テスト対象のシステムの複雑さをより直接的に反映するため、構造的な「深さ」(および場合によっては複雑さ)を持つ傾向があります。

そうは言っても、オブジェクトモデリングのパラダイムが特定の問題を理解し、説明する方法と非常によく一致している状況はたくさんあります。これは特に、より多様な範囲の属性と動作を持つ個別のエンティティをモデル化しようとしている場合に当てはまります。そのため、各エンティティを個別に検討することは、各プロパティを個別に検討するよりも、エンティティを母集団として検討するよりも有益です。

OOPでは、個々のエンティティとそのプロパティについて考えることに時間を費やします。集団行動は、視覚化と観察が困難です。構造と関係は、コードで明示的に表現される傾向があります。

ベクトル化されたMATLABでは、エンティティの母集団について考えることに時間を費やします。集団行動は観察しやすくなります。構造と関係は、コードで暗黙的に表現される傾向があります。


1

ほとんどのプログラマーは、オブジェクト指向プログラミングの1つの主要な側面である構造に精通しています。オブジェクトは構造のようなものですが、構造内のデータを処理するための独自の関数呼び出しがあると説明します。次に、継承、関数の引き渡しなどの詳細をゆっくりと追加します。


「独自の機能を持つ構造体」アプローチを試してみましたが、構造体の実装によっては、それらの関数の動作が変化する可能性があることを説明しました。それは私に非常に強い「何が良いのか」のルックスを与えました...
オーク

数学者の場合は、「構造」ではなく「タプル」という単語を使用します。
Ingo

1
Matlabはタプルを扱いませんが...
PearsonArtPhoto

1

彼らはすべてMatlabをよく知っています

それからそれは非常に簡単です:彼らにsimulinkを試させてください。SimulinkモデルはOOP精神に基づいています。彼らがSimulinkモデルの作成方法を理解し、Simulinkがどのように機能するかを知っていれば、OOの内容はすでにわかっています。


0

Matlabは単なる言語です。OOPがコンセプトです。

より少ない例に基づいた説明を使用して、概念を説明してみてください。エンジニアは確かに異なる領域と単位を理解しているため(たとえば、距離に温度を加えるのは奇妙です)、Matlabで具体的な例を必要とせずに、カプセル化と多型を直感的に理解する必要があります。抽象化を十分に簡単に説明できるはずです。継承と構成は例なしでは説明するのが難しくなりますが、概念を明確に説明し、理解する必要があります。

ジェネリックスと型の特異性は、数学の背景からの例を通して動機づけられるべきです。関数型プログラミング、関数の受け渡し、ラムダ自体はOOPではないため、通常エンジニアに提示されるより抽象的な数学の背景なしでは説明するのが困難です(工学、ソフトウェア、数学の両方を研究してきたため、さまざまな専門分野にある程度の洞察があります)。

Matlabを直接使用して例を提供することはできないかもしれませんが、構造を含む例を使用して抽象化とカプセル化を確実に説明できます。関数(メソッド)をデータでカプセル化できない言語でも、特定の関数が特定のドメインに対してのみ定義されている方法を説明できます。

多くの開発者が継承よりも構成を重視することを考えると、継承、構成、および2つの相対的なメリットを説明できます。

整数、有理数、実数、複素数の違いを確認することで、自然な方法で多態性を動機付け、「通常の」算術演算子が関数(メソッド)であることを説明できますが、演算子(ex '+')見た目は同じですが、異なるドメインで使用すると機能が異なります。

幸運を!


-1

私は電気技師ですが、EEプログラマーよりもCSプログラマーに共通しています。具体的には、成功せずに、オブジェクト指向のコードはもちろんのこと、少なくとも途中で構造化されたモジュール式のコードを書くように仲間の学生を説得しようとしました。

MATLABのOO機能を使用しようとすると、すぐに非常に迷惑な問題に遭遇しました。クラス内のメソッドは、そのクラスのオブジェクトを最初の引数として取り、オブジェクトを変更している場合はオブジェクトを返します。それは次のようなコードになります

methods
     function obj_new = modi_object(obj,some_other_data)
     ...
     end
...
end

と使用法

new_obj = objec.modi_object(some_piece_of_data);

私はほとんどあきらめました。まあまあのOOサポートがMATLABに入るまでは、そのままにしておくことをお勧めします。代わりに、MATLABをあきらめてPythonなどを使用するよう依頼してください。私はそれを試みています(そして失敗しています)。

少なくとも、MATLAB OOはOOを学ぶための優れたゲートウェイではありません。あなたはただそれらを一生延期するかもしれません。


なぜ反対票?
Milind R

私はこれが古いことを理解していますが、その価値のために、あなたが最初に言及するのは機能であり、動的ディスパッチと関係があります。2番目は必要ありません。再割り当てではなく既存のオブジェクトを変更する場合は、ハンドルスーパークラスから継承するだけです。Pythonについては、クラスの実装がmatlabよりもはるかに悪く/醜く見えるので、なぜそう言うのかわかりません。
Tasos Papastylianou 2016
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.