私は数千行のMatlabコードを所有するようになりました。その中には、900を超える行関数と、function_name.m
ファイルでいっぱいのいくつかのディレクトリがあります。すべてが何をしているのか(または関連しているのか)を理解したり、依存関係を理解したりするのは困難です。どの関数がどの関数からどの順序で呼び出されるかなど、関数の構造を視覚化するために何を提案しますか?
NumPyへのポート。
(冗談で。)
通常、Matlabには、関数として記述されたファイルとスクリプトとして記述されたファイルがあります。スクリプトは、処理するデータをロードし、それを関数にフィードしてグラフ化するなどの処理を実行します。
物事を整理するために、トップレベルのスクリプトから始めて、ロード、グラフ化、処理などを行う関数を見つけます。スクリプトをトップレベルのディレクトリに保持し、目的に応じて関数をサブディレクトリに分割してみます。関数。関数の依存関係を同じサブディレクトリに配置します。ディレクトリ内のコードが親ディレクトリ(またはいとこディレクトリ)内の何かに依存しないようにするようにしてください。
関数が何をするのか、そしてその引数が何であるのかを理解するときはいつでも、ドキュメントコメントを書いてください。
これは、コードを書いた人が合理的であると想定しています。そうでない場合、Matlabを使用すると、すべてを1つのディレクトリに簡単にまとめて、コードの厄介なタワー内の他のすべてに依存させることができるため、多くのリファクタリングを行うことになります。
あなたのコードにはまともなヘルプテキストが付いていますか?その場合、 m2html は、リンクされたhtmlヘルプを作成して簡単に閲覧できるため、非常に役立ちます。
さらに、依存関係グラフを作成できるため、コードをどのように編成するかをもう少し理解するのに役立ちます。
私はTheMathWorksでのさまざまな役割で、この問題に何度も対処しなければなりませんでした。これは、MATLABコードの大きな部分に対して私が行うことです。
すべて選択し、Ctrl-Jでコメントを折り返します
紙ベースだと感じている場合-すべてのファイルを印刷し、蛍光ペンのセットを入手します-手動でフォローし、長期変数と重要な関数呼び出しを強調表示します。
~~~ AND/OR ~~~
5運が良ければ、デバッガーでコードの実行を開始し、一度に1行ずつステップ実行します(ユーザーが作成したサブ関数にステップインします)。
この時点で、制御構造を通過する一般的なフローをたどることができます。私はすべてが何をしているのかよくわからないかもしれませんが、何が起こっているのかについてはまともな考えがあります。
通常、私の目標はバグを見つけて解決し、先に進むことです。あなたの目標は完全に異なるかもしれません。これは、私が何年にもわたって送信してきたさまざまなMATLABコードの断片をすばやく理解するために使用した方法です。
matlabのコーディング規約に関するいくつかの提案:
addpathを使用して、ファイルの乱雑さを回避し、関数の分類を支援します
機能スクリプト用にsection_を分割するか、条件付き実行用に設定します。これは、モジュールのプラグイン/アウト、および再利用やコード参照にも役立ちます。
設定ファイルを使用してオプションをオンまたはオフにします
区別するために、コード変更用の新しいノードを設定することを検討してください。バージョンを区別するためにツリーを設定します。
入力/出力、画像、中間結果などには別のフォルダを使用してください。
タイムスタンプを使用してバージョンをトレースする
コードを他の人と共有します。他の人が保守、使用、変更が難しい場合は、ビルドを改良する方法を再考してください。
MATLABプログラミングスタイルガイドライン リチャードジョンソンによる優れたリソースです。
すべてをバックアップするのは正しいです。元のソースツリーの元のtarballを作成し、それをすべてソース管理にスローして、変更を追跡およびロールバックできるようにします。
静的な依存関係を検出するMatlabのdepfun()とdepdir()を見てください。 Matlab関数間の依存関係を確認するのに役立ちます。すべてのファイルに「depfun-toponly」を使用し、文字列を少し変更することで、即時の依存関係のリストを作成し、それをGraphVizファイルにスローして、コードベースの呼び出し接続の大きな有向グラフを作成できます。グラフ内のクラスターは、コードを分割するのに適した場所です。 (編集:Jonasのソリューションを参照してください。m2htmlがこれを行うように見えます。)
コードを書き直す余裕がある場合は、関連する関数を一緒にパッケージ化し、カプセル化する方法として、クラスメソッドとプライベート関数を備えたステートレスユーティリティクラスを使用して、コードの一部をオブジェクトとして書き直すことを検討してください。私はこのように編成された大きなMatlabコードベースを使用してきましたが、問題なく動作します。従来のMatlabでは、クラスはある種のパッケージを実行する唯一の方法です。 Matlabの新しいOOシステムにも名前空間がサポートされていると思います。
コードをOOに変換したくない場合は、関連する関数をサブディレクトリに整理できます。これは、少なくともソースコードの閲覧用に整理するのに役立ちます。
すべての関数には、H1行を含む、Matlabの標準ヘルプテキスト形式のドコが必要です。そうでない場合は、そこで学んだことについてコメントを付けてください。次に、「contentsrpt」ツールを使用して、クラスまたはディレクトリの目次ファイルを自動的に生成します。
幸運を。
Matlabが最新のソフトウェアソースコードの構造化をひどくサポートしていないというコメントのほとんどに同意しますが、少しの規律で独自の構造を課すことはそれほど難しいことではないと思います。
別のプログラミング言語で記述されたプログラムのソースファイルと同様に、ソースファイルをディレクトリの階層に編成します。階層に固執する必要はありません。必要に応じて独自の構造を選択してください。 setpathコマンド(またはそれが呼び出されるもの)を使用して、作業中にmファイルを探す場所をMatlabに指示します。
スパゲッティコードの解読に役立つコールグラフ(ひどくグラフィカルではなく、gprofのコールグラフのようなもの)を提供できるMatlabプロファイラーツールをよく理解してください。
もちろん、すべてのmファイルはリポジトリにあり、そこから提供します。ネットワークドライブの1つにプライベートツールボックスを保持し、すべてのユーザーがそのツールボックスの「リリース済み」コードを直接呼び出すことができます。