Good Coding For Research       -MATLAB ‘GOOD’ Script-       K. Harada(@sousoumt)自己紹介略12年11月26日月曜日                       1
読者前提               MATLABを使用している               コードの書き方について学んだ経験がない                       原田注:資料内では「研究のために」とありますが、         ...
良いコードを書こう12年11月26日月曜日       3
充実した研究のために       良いコードを書こう12年11月26日月曜日        4
無駄はないか?12年11月26日月曜日     5
無駄なコーディングしていませんか?               無駄なチュートリアルしていませんか?12年11月26日月曜日                        6
チュートリアルにおける理想       •教える側           •コード見てね!とだけ伝えたい。    コードの読みやすさが重要!                               「動けば良い」は全然ダメ       •教わ...
コードの可読性を高める12年11月26日月曜日         8
良いコード≒可読性が高い12年11月26日月曜日          9
やっつけで可読性の低いコードを書く                  コード内に情報が不足                  バグ発見時修正が困難                 コード改良に時間を要する                  研究...
整理された可読性の高いコードを書く                  コード内に情報が足る                  バグ発見時修正が容易                 コード改良が短時間で済む                  研究...
可読性の高いコードを書き       研究に時間を使おう12年11月26日月曜日          12
Good Coding For Research       -MATLAB ‘GOOD’ Script-       K. Harada12年11月26日月曜日                      13
スクリプトと関数を切り分ける               登場順を意識する               名前に情報を詰め込む               コメントを大事に使う               ゴミを残さない12年11月26日月曜日 ...
スクリプトと関数を切り分ける               登場順を意識する               名前に情報を詰め込む               コメントを大事に使う               ゴミを残さない12年11月26日月曜日 ...
スクリプトと関数を切り分ける               実行可能?ファイル名で区別する               大枠から書く               関数にはin-outの記述を               スクリプトの究極は一読可能...
実行可能?ファイル名で区別する                convertNsn2Mat2.m      convertNsn2Mat_BATCH.m                 convertNsn2Mat.m          con...
大枠から書く               処理1               % 処理1                                 % 処理2 % 処理1                     処理1         %...
関数にはin-outの記述を   som_train_with_scale_parameter.m     function [w w_matrix] =                                        som_t...
スクリプトの究極は一読可能!           for i=1:10             for j=1:20                       runs = 1:10;               if data{i,j}~=...
さらに切り分ける               convertNsn2Mat_BATCH.m   convertNsn2Mat_BATCH.m          calc***                       calc***     ...
スクリプトと関数を切り分ける               登場順を意識する               名前に情報を詰め込む               コメントを大事に使う               ゴミを残さない12年11月26日月曜日 ...
登場順を意識する               先頭の情報は最も大事               混ぜるな危険!スクラッチブルに               終わったのか?done出力               更新は誰が?いつ?日付とauth...
先頭の情報は最も大事          convertMat2Nsn_BATCH.m         convertMat2Nsn_BATCH.m         %function [w w_matrix] =        %   Conv...
混ぜるな危険!スクラッチブルに                                              num=5         for kk=1:20                                    ...
終わったのか? done出力        num=5                                num=5        kkMax=20                             kkMax=20     ...
更新は誰が?いつ?日付とauthor                                    % Do abc        % Do abc                    % 1 : check inputs.     ...
スクリプトと関数を切り分ける               登場順を意識する               名前に情報を詰め込む               コメントを大事に使う               ゴミを残さない12年11月26日月曜日 ...
名前に情報を詰め込む               名前だけでバグを防ぐ               スコープの意識               難しく考えないで命名規則               tempは誰も喜ばない12年11月26日月曜日...
名前だけでバグを防ぐ                                                    for row = 1:10        for ii = 1:10                         ...
スコープの意識       for rowCounter = 1:10            for rowCounter = 1:10         for colCounter = rowCounter:20 for colCounter...
難しく考えないで命名規則           similaritymatrix           SIMILARITYMATRIX    similarityMatrix : 変数           SimilarityMatrix    ...
tempは誰も喜ばない                             calcB(calcA());                             or           temp = calcA();          ...
スクリプトと関数を切り分ける               登場順を意識する               名前に情報を詰め込む               コメントを大事に使う               ゴミを残さない12年11月26日月曜日 ...
コメントを大事に使う               鉄は熱いうちに、コメントは覚えているうちに               重要なことを足す               疑問、質問、こうなったらバグだ!も書く               パラメー...
鉄は熱いうちに、コメントは覚えているうちに                               % Parameters          % Parameters         A = [1 2 3];          A = [...
重要なことを足す                                     % Parameters               % Define Parameter A                               ...
疑問、質問、こうなったらバグだ!も書く                                % Parameters          % Parameters          A = [1 2 3];          A = [...
パラメータだけコメント化が許される          % Parameters                  % Parameters          A = [1 2 3];                  A = [1 2 3]; ...
%% は部分処理と現在地確認に用いる            % Parameters                 %% Parameters            A = [1 2 3];                 A = [1 2 ...
スクリプトと関数を切り分ける               登場順を意識する               名前に情報を詰め込む               コメントを大事に使う               ゴミを残さない12年11月26日月曜日 ...
ゴミを残さない               変数一覧には重要性の表記がない               一時的変数は即消し               スクリプトが出力の責任を持つ               未使用コードはVCSで積極的に消す...
変数一覧には重要性の表記がない               実行後のWorkspace               ii double 8         実行後のWorkspace               jj double 55    ...
一時的変数は即消し                                    [temp data] = calcA();           [temp data] = calcA();                      ...
スクリプトが出力の責任を持つ           %% Parameters               close all;           A = [1 2 3];                clear;           exe...
未使用コードはVCSで積極的に消す            % Parameters            A = [1 2 3];                 % Parameters            % A = {[1 2 3]; ...
まとめ               スクリプトと関数を切り分ける               登場順を意識する               名前に情報を詰め込む               コメントを大事に使う               ゴミ...
Upcoming SlideShare
Loading in...5
×

Good coding for research

154

Published on

MATLABにおけるscriptの書き方についてのセミナー資料。Readable Codeの考え方に基づいています。我ながらニッチだなーw

Published in: Education
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
154
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
3
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Good coding for research

  1. 1. Good Coding For Research -MATLAB ‘GOOD’ Script- K. Harada(@sousoumt)自己紹介略12年11月26日月曜日 1
  2. 2. 読者前提 MATLABを使用している コードの書き方について学んだ経験がない 原田注:資料内では「研究のために」とありますが、 研究者以外でも役に立つよう汎用的な資料にしているつもりです。 それぞれ「∼のために」を読み替えてください。12年11月26日月曜日 2
  3. 3. 良いコードを書こう12年11月26日月曜日 3
  4. 4. 充実した研究のために 良いコードを書こう12年11月26日月曜日 4
  5. 5. 無駄はないか?12年11月26日月曜日 5
  6. 6. 無駄なコーディングしていませんか? 無駄なチュートリアルしていませんか?12年11月26日月曜日 6
  7. 7. チュートリアルにおける理想 •教える側 •コード見てね!とだけ伝えたい。 コードの読みやすさが重要! 「動けば良い」は全然ダメ •教わる側 •より短時間でより正確に知りたい。12年11月26日月曜日 7
  8. 8. コードの可読性を高める12年11月26日月曜日 8
  9. 9. 良いコード≒可読性が高い12年11月26日月曜日 9
  10. 10. やっつけで可読性の低いコードを書く コード内に情報が不足 バグ発見時修正が困難 コード改良に時間を要する 研究に割く時間が減る 研究の質が低下する12年11月26日月曜日 10
  11. 11. 整理された可読性の高いコードを書く コード内に情報が足る バグ発見時修正が容易 コード改良が短時間で済む 研究に割く時間が増える 研究の質が向上する12年11月26日月曜日 11
  12. 12. 可読性の高いコードを書き 研究に時間を使おう12年11月26日月曜日 12
  13. 13. Good Coding For Research -MATLAB ‘GOOD’ Script- K. Harada12年11月26日月曜日 13
  14. 14. スクリプトと関数を切り分ける 登場順を意識する 名前に情報を詰め込む コメントを大事に使う ゴミを残さない12年11月26日月曜日 14
  15. 15. スクリプトと関数を切り分ける 登場順を意識する 名前に情報を詰め込む コメントを大事に使う ゴミを残さない12年11月26日月曜日 15
  16. 16. スクリプトと関数を切り分ける 実行可能?ファイル名で区別する 大枠から書く 関数にはin-outの記述を スクリプトの究極は一読可能! さらに切り分ける 原田注:以降の資料では、左が悪い例、右が良い例として記載しています。12年11月26日月曜日 16
  17. 17. 実行可能?ファイル名で区別する convertNsn2Mat2.m convertNsn2Mat_BATCH.m convertNsn2Mat.m convertNsn2Mat.m convertNsn2Mat_func.m convert.m12年11月26日月曜日 17
  18. 18. 大枠から書く 処理1 % 処理1 % 処理2 % 処理1 処理1 % 処理3 処理1 % 処理1 処理2 % 処理2 処理1 処理1 % 処理3 % 処理2 処理2 処理2 処理3 % 処理312年11月26日月曜日 18
  19. 19. 関数にはin-outの記述を som_train_with_scale_parameter.m function [w w_matrix] = som_train_with_scale_parameter( function [w w_matrix] = data_matrix, num_cell, N_0) som_train_with_scale_parameter( % Train with scale parameters. data_matrix, num_cell, N_0) % Input: % data_matrix - **** % num_cell - **** % N_0 - **** コメント何もなし % Output: % w - **** % w_matrix - ****12年11月26日月曜日 19
  20. 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 ロジック解読が必要 ロジック解読が不要 end12年11月26日月曜日 20
  21. 21. さらに切り分ける convertNsn2Mat_BATCH.m convertNsn2Mat_BATCH.m calc*** calc*** : : gca showGraph; xlabel(***); _BATCHには本質が残る ylabel($$$); showGraph.m gca _BATCHに読み飛ばせる部分がある xlabel(***); ylabel($$$);12年11月26日月曜日 21
  22. 22. スクリプトと関数を切り分ける 登場順を意識する 名前に情報を詰め込む コメントを大事に使う ゴミを残さない12年11月26日月曜日 22
  23. 23. 登場順を意識する 先頭の情報は最も大事 混ぜるな危険!スクラッチブルに 終わったのか?done出力 更新は誰が?いつ?日付とauthor12年11月26日月曜日 23
  24. 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. 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. 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. 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
  28. 28. スクリプトと関数を切り分ける 登場順を意識する 名前に情報を詰め込む コメントを大事に使う ゴミを残さない12年11月26日月曜日 28
  29. 29. 名前に情報を詰め込む 名前だけでバグを防ぐ スコープの意識 難しく考えないで命名規則 tempは誰も喜ばない12年11月26日月曜日 29
  30. 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. 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 end12年11月26日月曜日 31
  32. 32. 難しく考えないで命名規則 similaritymatrix SIMILARITYMATRIX similarityMatrix : 変数 SimilarityMatrix SIMILARITY_MATRIX : 定数 similarity_matrix SimilarityMatrix : クラス sm これ以外であっても、 ソース内で統一されていれば可 変数名の長さ∝変数のスコープ12年11月26日月曜日 32
  33. 33. tempは誰も喜ばない calcB(calcA()); or temp = calcA(); calcB(temp); resultCalcA = calcA(); 何が入っているのか? calcB(resultCalcA); 再利用されるのか? clear resultCalcA; 要追跡 追跡不要12年11月26日月曜日 33
  34. 34. スクリプトと関数を切り分ける 登場順を意識する 名前に情報を詰め込む コメントを大事に使う ゴミを残さない12年11月26日月曜日 34
  35. 35. コメントを大事に使う 鉄は熱いうちに、コメントは覚えているうちに 重要なことを足す 疑問、質問、こうなったらバグだ!も書く パラメータだけコメント化が許される %%は部分処理と現在地確認に用いる12年11月26日月曜日 35
  36. 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. 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. 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. 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. 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
  41. 41. スクリプトと関数を切り分ける 登場順を意識する 名前に情報を詰め込む コメントを大事に使う ゴミを残さない12年11月26日月曜日 41
  42. 42. ゴミを残さない 変数一覧には重要性の表記がない 一時的変数は即消し スクリプトが出力の責任を持つ 未使用コードはVCSで積極的に消す12年11月26日月曜日 42
  43. 43. 変数一覧には重要性の表記がない 実行後のWorkspace ii double 8 実行後のWorkspace jj double 55 matrix cell matrix cell resultX double 1 a logical true 必要な結果のみを残す 必要な結果は何? saveで全変数の保存も有効12年11月26日月曜日 43
  44. 44. 一時的変数は即消し [temp data] = calcA(); [temp data] = calcA(); calcB(data); calcB(data); clear temp; tempは残る tempは残らない12年11月26日月曜日 44
  45. 45. スクリプトが出力の責任を持つ %% Parameters close all; A = [1 2 3]; clear; execX(A) %% Parameters A = [1 2 3]; [temp data] = calcA(); : ww = fopen(‘test.txt’); calcB(data); close all; fclose(ww); clear; calcBでエラー&中止時は? 初期化操作close all;clear;で 出力に責任を持つ12年11月26日月曜日 45
  46. 46. 未使用コードはVCSで積極的に消す % Parameters A = [1 2 3]; % Parameters % A = {[1 2 3]; [2]; [3]}; A = [1 2 3]; % A = {[1 2 3]; [2]; [3]}; % do X resultX = execX(A); % do X %resultX = execY(A); resultX = execX(A); %resultX = execZ(A); コメントインすると 必要な処理のみ残す すぐ使えてしまう VCSを使えばすぐ確認可能12年11月26日月曜日 46
  47. 47. まとめ スクリプトと関数を切り分ける 登場順を意識する 名前に情報を詰め込む コメントを大事に使う ゴミを残さない12年11月26日月曜日 47
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×