20. スクリプトの究極は一読可能!
for i=1:10
for j=1:20 runs = 1:10;
if data{i,j}~=NaN channels = 1:20;
if D.label{j} ~= P.Num{i}
fprintf(‘num ne label’); % Check Values
: if ~checkArgs(runs, channels, D, P)
else if D.roi{j} == NaN error(‘format error.’);
error(‘roi not found’); end
end
end
end ロジック解読が必要 ロジック解読が不要
end
12年11月26日月曜日 20
24. 先頭の情報は最も大事
convertMat2Nsn_BATCH.m convertMat2Nsn_BATCH.m
%function [w w_matrix] = % Convert Mat to Nsn file.
convertMat2Nsn( % 1 : check Mat file existing
data_matrix, num_cell, N_0) % 2 : check Mat format.
% 3 : convert.
if exist(‘abc.mat’)
: スクリプト?関数?
end
引数に必要なもの?
続きの内容を容易に追える
clearが無かったら?
12年11月26日月曜日 24
25. 混ぜるな危険!スクラッチブルに
num=5
for kk=1:20
kkMax=20
data=load([‘svsv/fmri/data/’ kk]);
resA{kk}=calcA(data);
for kk=1:kkMax
end
data=load([‘sv/fmri/data/’ kk]);
resA{kk}=calcA(data);
num = 5;
end
calcB(resA,num);
calcB(resA,num);
処理とパラメータが混在 処理とパラメータが別
12年11月26日月曜日 25
26. 終わったのか? done出力
num=5 num=5
kkMax=20 kkMax=20
for kk=1:kkMax for kk=1:kkMax
data=load([‘sv/fmri/data/’ kk]); data=load([‘sv/fmri/data/’ kk]);
resA{kk}=calcA(data); resA{kk}=calcA(data);
end end
calcB(resA,num); calcB(resA,num);
fprintf(‘%s Donen’, mfilename);
終わったのか不明 Doneと出力されたら終了
mfilenameも有効
12年11月26日月曜日 26
27. 更新は誰が?いつ?日付とauthor
% Do abc
% Do abc % 1 : check inputs.
% 1 : check inputs. % 2 : execute abc.
% 2 : execute abc. % Modified By: K*** Harada
kharada at ****.co.jp 12/09/26
if ~checkArgs(abc)
error(‘’); if ~checkArgs(abc)
end error(‘’);
exec(abc); end
exec(abc);
いざという時誰に聞けば? 最も良く知る人が把握可能
12年11月26日月曜日 27
30. 名前だけでバグを防ぐ
for row = 1:10
for ii = 1:10 for col = row:20
for jj = ii:20 if matrix{row, col} ~=NaN
if matrix{ii,jj} ~=NaN oneData = 6*data{row, col};
calcB(6*data{ii,jj}, label{ii,ii}); oneLabel = label{row, row};
end calcB(oneData,oneLabel);
end end
end end
意味のある変数名は
end
バグに気付きやすい
意味のない変数名は
単数名or複数名の使い分けも良い
バグに気付きにくい
12年11月26日月曜日 30
31. スコープの意識
for rowCounter = 1:10 for rowCounter = 1:10
for colCounter = rowCounter:20 for colCounter = rowCounter:20
if ~exist(temp) if ~exist(temp)
temp = data{rowC,colC}; temp = data{rowC,colC};
end end
end end
end end
別の処理部分に影響させない
clear temp;
別の処理部分に影響する可能性
for temp=1:20 for temp=1:20
showNanika; showNanika;
end end
12年11月26日月曜日 31
36. 鉄は熱いうちに、コメントは覚えているうちに
% Parameters
% Parameters A = [1 2 3];
A = [1 2 3];
% do X
% do X resultX = execX(A);
resultX = execX(A); % Test from
resultX = execY(A); resultX = execY(A);
% Test to
% do B インラインでもOK
execB(resultX); % do B
食事後すぐ元通りにできるか? execB(resultX);
12年11月26日月曜日 36
37. 重要なことを足す
% Parameters
% Define Parameter A
A = [1 2 3];
A = [1 2 3];
% do X
resultX = execX(A);
resultX = execX(A);
% execB
% do B
execB(resultX);
execB(resultX);
見て分かることを書いてしまう コメントだけで
必要なことが抜けている コードが読める
12年11月26日月曜日 37
38. 疑問、質問、こうなったらバグだ!も書く
% Parameters
% Parameters A = [1 2 3];
A = [1 2 3];
% do X
% do X resultX = execX(A);
resultX = execX(A); % execX失敗時は?
% A未定義時はエラー発生
% do B
execB(resultX);
% do B
execX失敗時は? execB(resultX);
気付きを記載
12年11月26日月曜日 38
39. パラメータだけコメント化が許される
% Parameters % Parameters
A = [1 2 3]; A = [1 2 3];
A = {[1 2 3]; [2]; [3]}; % A = {[1 2 3]; [2]; [3]}; %multiple
case
% do X
resultX = execX(A); % do X
%resultX = execY(A); % Cell resultX = execX(A);
死んでいるパラメータ 設定可能なパラメータを示す
処理内容にコメント 処理内容はパラメータにだけ依存させる
12年11月26日月曜日 39
40. %% は部分処理と現在地確認に用いる
% Parameters %% Parameters
A = [1 2 3]; A = [1 2 3];
% A = {[1 2 3]; [2]; [3]}; % A = {[1 2 3]; [2]; [3]};
% do X %% do X
resultX = execX(A); resultX = execX(A);
パラメータの設定確認など パラメータの設定確認他
部分処理ができない 部分処理が可能
今どの部分の処理を実行中? 「現在地」を把握可能
12年11月26日月曜日 40