MATLAB ユーザーコミュニティー

MATLAB & Simulink ユーザーコミュニティー向け日本語ブログ

入力引数の検証~隠された便利機能

Posted by Jiro Doke,

こんにちは、道家です。

前回 に続き、 Function Argument Validation について書きたいと思います。

ご存知の方もいるかと思いますが、コマンドウィンドウ、もしくはエディターの中でプログラムを 書いている時、入力パラメーターの 候補を表示したり補完したりする機能 があります。

実はこの機能というのは MathWorks 製品の関数にしかない機能ではなく、皆さんが作成された 関数にも使えます。それには functionSignatures.json というファイルを作成する必要があります。例を見てみましょう。

まず、以下のような関数を作ったとしましょう。

% myFunc  サンプル関数
% この関数には以下のような呼び出し構文があります。
%
%   myFunc(in1, in2) 2つの入力が必須です
%   myFunc(in1, in2, in3) オプションで3つ目の入力があります
%   myFunc(___, NAME, VALUE) さらにオプションで Name-Value ペアを受け付けます
%           * 'NAME1' : 論理値(logical)
%           * 'NAME2' : 'Default', 'Choice1', または 'Choice2'
function [reqA,reqB,posA,NV1,NV2] = myFunc(reqA,reqB,varargin)
    % 既定値で初期化
    NV1 = true;
    NV2 = "Default";
    posA = [];
    if nargin > 3
        if rem(nargin,2)
            posA = varargin{1};
            V = varargin(2:end);
        else
            V = varargin;
        end
        for n = 1:2:size(V,2)
            switch V{n}
                case 'Name1'
                    NV1 = V{n+1};
                case 'Name2'
                    NV2 = V{n+1};
                otherwise
                    error('エラー')
            end
        end
    end
end

この関数に対して候補と補完機能を追加するには、この関数が存在するフォルダーに この関数の呼び出し構文を記述する functionSignatures.json を作成します。

{
  "_schemaVersion": "1.0.0",
  "myFunc":
  {
     "inputs":
     [
        {"name":"in1", "kind":"required", "type":["numeric"], "purpose":"ID of item"},
        {"name":"in2", "kind":"required", "type":["numeric"], "purpose":"# Items"},
        {"name":"in3", "kind":"ordered", "type":["numeric"], "purpose":"Input Value"},
        {"name":"Name1", "kind":"namevalue", "type":["logical","scalar"],"purpose":"Option"},
        {"name":"Name2", "kind":"namevalue", "type":["char", "choices={'Default','Choice1','Choice2'}"]}
     ]
  }
}

すると myFunc を記述する際に以下のような候補が表示されるようになります。

R2019b の Function Argument Validation を活用すると、なんとこの機能がついてくるのです。 まったく同じ用途の myFunc2 を Function Argument Validation を使って書くと

function [reqA,reqB,posA,NV1,NV2] = myFunc2(reqA,reqB,posA,opts)

arguments reqA (1,1) double reqB (1,1) double posA double = [] opts.Name1 (1,1) logical = true opts.Name2 char {mustBeMember(opts.Name2,["Default","Choice1","Choice2"])} = "Default" end NV1 = opts.Name1; NV2 = opts.Name2;

end

すると functionSignatures.json ファイルを作成する必要なく候補と補完機能が 備えついてきます。

改めて Function Argument Validation 機能についてまとめてみますと

  • 関数の入力引数に制約を加えることによってロバスト性が向上する
  • 入力引数のチェックを分かり易く簡潔に表現することが出来る
  • 関数の活用者を手助けになる入力引数の候補や補完をしてくれる

つまり、開発者・活用者の両者からして管理しやすい、使いやすいプログラムになるということです。

是非、活用してみてください。また、新しい機能ではあるので、ご意見や改善要望などが ございましたら コメント お願いします。

89 views (last 30 days)  | |

Comments

To leave a comment, please click here to sign in to your MathWorks Account or create a new one.