17

MATLAB には、クラスを編成する 2 つの方法があります。

@-ディレクトリ:

@クラス名\
    ClassName.m
    Method1.m
    Method2.m

単一ファイル:

ClassName.m:
classdef ClassName
    メソッド
        % ここに含まれるすべてのメソッド
    終わり
終わり

最初のスタイルは新しいclassdef構文の前に存在していましたが、より構造化された方法のようです。2 番目のスタイル (単一のファイル内のすべて) は新しいものです。

どの方法を使用しますか。また、その理由は何ですか?

4

4 に答える 4

18

新しい単一ファイル スタイルには、いくつかの利点があります。これにより、多くの小さなメソッドを作成することが可能になり、奨励されます。これにより、コードの因数分解が改善されると思います。新しいファイルを作成し、それを保存し、ソース管理に追加する (私たち皆、ソース管理を使用していますよね?) 手間はかかりませんが、数十個の小さなメソッドを追加するだけで十分であり、通常は因数分解を思いとどまらせます。よりきめ細かい機能に分類します。また、クラス全体を編集することは、ブラウズ、検索、置換に便利であり、さまざまなクラスのソース コードを整理するために使用できる多数の個別のエディター タブを開く必要がありません。

大規模なコードベースの場合、単一ファイル スタイルの方がパフォーマンス上の利点がある場合があります。ソース ツリーを反復処理するソース管理および展開システムには、stat 操作や diff 操作などのファイルごとのコストがかかります。大規模なコードベース、たとえば数千のメソッドの場合、特にネットワーク ドライブ上では重要です。Matlab コンパイラで展開されたアプリのパフォーマンスにも影響があると思います。デプロイされたコードベースのサイズに応じて、起動時間が長くなります。このコストには、ファイル操作からのファイルごとの部分があり、ファイル (私が思うに) は個別に暗号化されているためです。実験的にはテストしていませんが、単一のファイル クラス定義を使用すると、コンパイル済みの Matlab アプリの起動コストが削減されるのではないかと思います。

ただし、ほとんどのコードで古いマルチファイル編成を使用しています。新しいスタイルが一般的に利用可能になる数年前にコードベースが開始されたことが一因です。しかし、部分的にはパフォーマンスのためです。新しい単一ファイル構成は、新しいスタイルの MCOS Matlab クラスでのみ機能し、メソッド ディスパッチのオーバーヘッドが高いため、古いスタイルの Matlab クラスよりも遅くなります。たとえば、何もしない nop() メソッドの実行時間を示すベンチマーク スニペットを次に示します。

各関数/メソッドを 100000 回呼び出す
nop() 関数: 呼び出しごとに 0.02715 秒 0.27 秒
nop(obj) メソッド: 呼び出しごとに 0.24629 秒 2.46 usec
classdef nop(obj): 呼び出しごとに 0.98572 秒 9.86 usec
classdef obj.nop(): 呼び出しごとに 1.81307 秒 18.13 usec

多くのメソッド呼び出しを行うコードベースでは、これはパフォーマンスに大きな影響を与える可能性があります。(「MATLAB OOP が遅いか、何か間違っているか? 」も参照してください。 )

もう 1 つの問題は、Matlab の自動インデンターがクラス定義のすべてのセクションとすべてのメソッドをインデントするため、すべての実行可能コードのベースラインは 2 つのタブ ストップであり、8 列の画面領域を浪費します。

結局のところ、オブジェクト指向のパフォーマンスを考慮する必要がなければ、おそらく単一のファイルを使用することになり、パフォーマンス クリティカルではない新しいクラスをそのように作成しています。

更新: また、便利なドキュメント ジェネレーターである contentsrpt() は、classdef ファイル内で定義された関数では機能しないようです。個別の関数ファイルにあるもののみ。

于 2010-03-29T15:04:18.753 に答える
6

私は、@-directoriesが忘れられた方がよいおかしな (たとえば、公開/非公開、それは何ですか?) であることを発見しました。最新のバージョン (2007b 以降だと思います) では、クラスを編成する最良の方法はパッケージを使用することです。これにより、よりクリーンな名前空間が得られます。クラス全体を 1 つのファイルで操作すると、クラスが何をしているかを把握しやすくなり、リファクタリングの煩わしさが 1000% 軽減されると思います (変数名を変更した後に 8 つのファイルを変更することを想像してみてください)。

于 2010-03-27T05:04:31.073 に答える
5

私はシングルファイル方式を採用しています。コードが 1 つのファイルで構成されていると、コードを整理するのがいくらか容易になると思います。また、セル タイトルを使用すると、メソッド間を簡単に移動できます。また、新しい @ クラスを作成した場合、それを使用する前にパスを再作成する必要があるかもしれませんが、そのための忍耐力がありません。

とはいえ、単一ファイル スタイルが複数ファイル スタイルよりもはるかに優れているとは思いません。小さくて見やすいファイルがたくさんあることも非常に便利です。

于 2010-03-27T04:10:38.400 に答える
1

@ClassName ディレクトリを使用する利点は、classdef ファイルに変更を加えた場合、matlab によって強制的にクラスをクリアして再ロードすることです。関数の実装を別の m ファイルに入れ、メソッド シグネチャだけを classdef ファイルに入れると、クラスをクリアしなくても実装をいじることができます。

于 2010-04-02T02:30:52.330 に答える