読みやすいMATLABのコード

およそ他人のコードを読むほど辛いものはありません。

個人的にはMATLABは読みづらくなる傾向はあると思います。

その理由として書き手でやりがちなのは次のようなものかなと思います:

  • ひとつのスクリプト・ファイルで全部やろうとしがち
  • スペース・インデントを入れない
  • 変数名・関数名が短い

ファイルを分割する・関数化をする

MATLABでは、スクリプトが長くなる傾向が強いと感じます。 多分これは、書き捨てのようなスクリプトが多いのも原因かなと思います。

ファイルの分割については、メインスクリプトファイルと個別の処理をファイルを分けるだけでも分かりやすくなります。 その場合、個別の処理が長い場合はフォルダで分けてさらに分割するのも有用です。各フォルダのパスはプロジェクトを利用して設定しておきます。

関数化は難しくてもスクリプトの分割は手軽にできて、さらに書き手の思考の処理内容の整理もできます。

計算に関する処理は可能なかぎり処理を関数化する検討をするのが良いです。 関数化の検討の場合は、変数の受け渡しなどで悩みどころが出てくると思います。 そのバランスで関数化を検討すれば良いと思います。 無理に関数化してメンテ性や可読性が下がる場合もあります。 特に視覚化などは、関数化を諦めても仕方ない部分はあります。

データの処理など、抽象化が可能であればクラスを定義するのも良いと思います。これも場合に応じて検討すれば良いでしょう。

適切にスペース・インデントを入れる、endを省略しない

視覚的な情報はリテラルな情報と同じくらい大事だと思います。 たとえば、シミュレーションのパラメーター変数に代入する文のイコール、数字の位置が揃っていないと読みやすさが下がります。

FORTRAN77の時代ならいざ知らず、イマドキの言語ではスペース・インネントを入れて読み易くするのは一般的です。 スペースやインデントを入れない人は、他の言語をあまり知らないということなのかと思います。 MathWorksのヘルプドキュメントの例でもスペースやインデントは入っているので、意識しない人が多いのかも知れません。

特に多いのが、関数のなかのインデントが省略されているケースですね。 if-elseなどのイテレータ系処理はインデントで視覚的に分かりやすくするのが好みです。

あと関数のendを省略されている場合も割とあって、これは読みづらい。 endなどは省略しないほうが、読む側で悩むことが少なくなります。

分かりやすい変数名・関数名

変数名や関数名は短かすぎると、目にするたびに意味を確認する負荷が大きくなります。 一方で変数名や関数名は長ければ良いわけでもなく、分かりやすい長さにするべきです。

関数や変数の命名については、ある程度ルールを把握するのが良いです。 よくまとまっているページがありましたので紹介します。Pythonで例を挙げていますが、他の言語に対しても超おすすめです。

識別子(変数名や関数名など)の命名ガイドライン

少し引用すると

  • 「プログラムを英語として読めるか」を意識する
  • 変数名は名詞が基本
  • 真理値型はis~やcan~の形
  • 関数名は動詞で始めて、目的語(場合によっては主語・前置詞)を適切に選ぶ

など。

MATLABは基本的にキャメルケースかスネークケースです。 キャメルケースが多いと思いますが、書く人の好みで選べば良いと思います。 これらで特に読みやすさに影響されません。

おまけ

個人的に言語側の弱いところだと感じるところ:

  • テキスト処理が苦手
  • 関数にすると関数内の処理を把握しづらい
  • 関数の引数に関数を呼べない

Rubyなどに慣れた者から見ると、テキスト処理が苦手なのはストレスが大きいです。

また関数の引数に関数を呼べない場合が多々あるので、一時変数を使わざるを得ません。 これがコードが汚なくなる原因の一つだと思います。 回避法はあると思いますが、言語の欠点への対処なのでその言語にだけ用いる普遍性のないノウハウ(いわゆるバッド・ノウハウ?)でしょう。

MATLABの言語そのものが割と古いため、新しめの言語と比較して洗練されていない部分はありますね。

オブジェクト指向が後付けなので、オブジェクトとそうでない変数が混在します。 ここもPythonとかRubyなどに慣れていると違和感を感じやすそうです。