LoginSignup
1
0

More than 5 years have passed since last update.

C++-LIKE Object Oriented Matlab!

Posted at

Summary

C++、Objective-CみたいにObjectiveに書く方法がMatlabで実装されていて、
まとめてみます。

ずばり、ファイル分割できることが管理の面での強み(?)といえます。

※setter, getterはクラスファイル内でしか定義できないとのこと。

本題

実装

引用すると下記の通り。

複数のファイルへのクラス定義の分配

複数のファイルを使用してクラスを定義する場合は、すべてのクラス定義ファイル (classdef とすべてのクラス メソッド ファイルを含むファイル) を単一の @
ClassName フォルダーに配置します。
distributing_ja_JP.png
この @ フォルダーは、MATLAB パス上のフォルダー内になければなりません。@ フォルダーには、クラスを 1 つだけ定義できます。
パス フォルダーには、@ フォルダーで定義されているクラスと、@ フォルダーを使用せずに単独ファイル内で定義されているクラスの両方を含めることができます。
via クラス ファイル - MATLAB & Simulink - MathWorks 日本

実装のうえでのルール

別ファイル内のメソッド

留意点としては、

  • getter/setterはクラスファイル内、

  • 外部ファイルに書く関数はクラスファイルでは中身を定義しない

といったことが挙げられます。
以下、ドキュメント見て行きましょう。

クラス @ フォルダー内の別のファイルにクラス メソッドを定義できます。
この場合は、関数と同じ名前を付けた別のファイル (functionname.m) に関数を作成します。
そのメソッドの属性の値を指定する場合は、classdef ブロックのメソッド ブロック内でメソッドのシグネチャを宣言しなければなりません。次に、例を示します。

myClass.m
classdef myClass
   methods (AttributeName = value,...)
      tdata = testdata(obj,arg1,arg2) % ここではまだ実装しない。C++の.hファイルみたい。
 ...
   end % methods
 ...
end % classdef

別のファイルのメソッド ブロックは使用しないでください。メソッドを関数として定義します。
上記の例を使用すると、ファイル testdata.m は、関数 testdata の定義を含まなければなりません。
シグネチャはすべて同じであることに注意してください。

testdata.m
function tdata = testdata(myClass_object,argument2,argument3)
   ...
end

別々のファイルに定義したメソッドには、以下の制限が適用されます。
別のファイルに定義されたメソッドの属性を指定する場合、
このメソッドを classdef ブロックの属性値を指定するメソッド ブロックで宣言する必要があります。
メソッドブロックで宣言される構文は使用される場合、メソッドの function 行に一致する必要があります。
別のファイルは、クラスの @ フォルダーになければなりません。
コンストラクター メソッドは、classdef ブロックで定義する必要があり、別のファイルには存在できません。
このメソッドの詳細は、「クラス コンストラクター メソッド」を参照してください。
プロパティ set と get access メソッドは、classdef ブロックに定義しなければならないので、別々のファイルには存在できません。これらのメソッドの詳細は、「プロパティ アクセス メソッド」を参照してください。
via 通常のメソッド - MATLAB & Simulink - MathWorks 日本

使用シーンへの考察

C++のように、Headerと実装ファイルを分けて書くことに慣れている方、
関数が多くなりすぎて、関数一覧だけまとめて見たい人などがこのようにすると
良いと思います。

上記例にて最初ClassNameA.mだけ作成していたものを、
関数が増えたから
@ClassNameA---ClassNameA.mへと移動するのは全く労力ではないので、
意外にクラスファイルが長くなったら整理にために切り分ける、といったところだと思います。

現実的なメリットが見えづらいですが、おそらくこんなところでしょう。

結言

Matlab正直書きやすいのかどうかいまだに謎ですが、
パッケージ制がとられていたりで、一応Object Orientedに書くことはできます。
頑張りましょう。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0