SlideShare a Scribd company logo
1 of 59
勉強会(第18回)
プログラムの処方箋
 ~健康なコードと病んだコード




        2011/6/24 さがわ
もくじ
はじめに
病んだコードとは?
プログラミングで大切なこと
リファクタリングって何?
病んだコードの症状と処方箋
まとめ
はじめに
自分で書いた数ヶ月前のソースコードを久しぶりに
見たり、既存のシステムのソースコードを見て、
 「何だこれ!?何がしたいのかわからない…。」
と感じたことはないですか?         ありマウス。




そういうソースコードは「病んでいる」かもしれません。
今回の勉強会を通して、病んだ状態のソースコードが
どういうものかを十分認識して、
健康なソースコードが書けるようになりましょう。
はじめに
今回の勉強会で扱うプログラムの例は「Java」を
採用しています。
しかし、話題としては、どのプログラミング言語にも
共通することを取り上げています。

また、若干記述が変わりますが、「C#」等、
他のプログラミング言語でも書けるサンプルです。
病んだコードとは?
プログラミングをするときに、

  とりあえず動くことしか考えない
  設計の機能を満たすことしか考えない

そんなふうにプログラミングされたソースコードは、
いつの間にかソースコードが病気にかかっている
かもしれません。
                    おまえが一番
       あたしゎ大丈夫だょ!   アヤシイ。。。
病んだコードとは?
「でも、動くこと、設計を満たすことは
 あたりまえなんじゃないの?」    ちがうの?




それらは当たり前のことですが、
「保守」のことをよく考えて
プログラミングをしていないのが、
病気になってしまう原因です。
病んだコードとは?
「病んだソースコード」とは…
内容がわかりづらく、変更のしにくい、


  保守のしづらいソースコード

のことです。
プログラミングで大切なこと

プログラミングで大切なことは?
 機能要件を満たしていること
 正しく動くこと(バグがないこと)
 「保守」のことをよく考えること


「保守」のことって、どんなこと?
プログラミングで大切なこと

運用が開始され、「保守」のフェーズで
必ず起こることが2つあります。

       何かわかりますか?

それは…           残業と徹夜!
プログラミングで大切なこと

それは…
   「障害」と「機能改善」
                                  です。
この2つは、
「それが起こるのが早いか、遅いか。」
というだけで、必ず起こります。
         Accidents will happen.
プログラミングで大切なこと

保守のことを考える。~1つ目
「障害」に対して、
 障害を発見しやすくする
 だいたいどの辺りかすぐわかるように!
 修正をしやすくする
 あちこちを直す必要がないように!
プログラミングで大切なこと

保守のことを考える。~2つ目
「機能改善」に対して、
 機能改善、拡張をしやすくする
 まだ必要のない機能をあらかじめ入れる必
 要はないけど、予測をたてておく!
 既存のコードをできるだけ変更しなくても
 良いように!
プログラミングで大切なこと

「保守」フェーズを考えることは、
システム開発のどのフェーズにおいても、
とても重要です。
常に頭に入れておきましょう。

一歩進んだ技術者になるために…
 「保守」のことを常に頭に入れよう!
リファクタリングって何?
ここで「リファクタリング」という言葉
に少し触れておきます。

リファクタリングとは、端的に言ってしまうと、
「病んだコード=保守しづらいプログラム」を
機能はそのままに、
「健全なコード=保守しやすいプログラム」に
書き直すことです。
リファクタリングって何?
適切な「リファクタリング」が
プログラムに対して適用されると、
プログラムがすっきりと分かりやすく、
保守のしやすいものになります。

ただし、リファクタリングには
気をつけなければいけない点があります。
リファクタリングって何?
リファクタリングは保守しづらいとはいえ、
いちおう動いているコードに対して行います。
ということは…
  動いていたものが動かなくなる可能性がある。
  再テストの必要がある。

…というリスクがあるので、
慎重に作業する必要があります。
                     キミのバグを直すほうが
        めんどくさそうだな。   よっぽどメンドクサイの!
リファクタリングって何?
リファクタリングにはコストがかかります。

しかし、適切なリファクタリングにより洗練
されたコードは、そうではないコードに比べて、
保守で発生する「障害対応」「機能改善」の
時間を大幅に削減できるので、
結果的にコスト安になるでしょう。
リファクタリングって何?
リファクタリングを避けなければいけない
場合もあります。
それは…
 「変更よりも最初から書き直したほうが早い」
場合です。

あまりにもバグが多いコードは、
そのほうが工数削減になります。
リファクタリングって何?
まず、リファクタリングをする為には、
「病んだコード」と「健康なコード」が
どんなものであるかを知っている必要が
あります。

そもそも、最初から「健康なコード」が
書かれていれば、リファクタリングの
必要はありませんよね?
リファクタリングって何?
今回の勉強会では、
リファクタリング「最初の一歩」として、
「病気の状態=保守のしづらいコード」
を知ることからはじめ、
最初からリファクタリングの必要ない、
健康なコードが書けるようになる
ことを目指します。
病んだコードの症状と処方箋
  ~こういうコードは要注意!

さて、ここからは「病んだコード」を
診断していきます。

あなたの病気レベルは?
                  私はもう死んでいる。。。




「風邪?肺炎?」
「インフルエンザ!?」
はたまた・・・。
病んだコードの症状と処方箋
 ~こういうコードは要注意!

インデントがグチャグチャ


   へ? インデント!?
   何スかそれ?
病んだコードの症状と処方箋
      ~こういうコードは要注意!

 インデントがグチャグチャ
  ...
  // 最大数まで処理したらループを抜ける。
  int MAX_COUNT = 10;
  int count = 0;
  while(count < MAX_COUNT) {
      if (flg==true) {
          ...
      } else {
          ...
      }
      for (int i=0; i<list.size(); i++)
          ...
      }
      count++; // カウントを1増やす。
  }


「あれ?なんか無限ループしちゃうんだけど、何で?」
病んだコードの症状と処方箋
  ~こういうコードは要注意!

インデントがグチャグチャ
...
// 最大数まで処理したらループを抜ける。
int MAX_COUNT = 10;
int count = 0;
while(count < MAX_COUNT) {
    if (flg==true) {
        ...
    } else {
        ...
    }
    for (int i=0; i<list.size(); i++)
        ...
    } ←このカッコ、for分に対応するようで、実は「while」のカッコ。
    count++; // カウントを1増やす。
} ←このカッコがWhileに対応するようだけど、実は違うカッコらしい
病んだコードの症状と処方箋
       ~こういうコードは要注意!

インデントがグチャグチャ
    ...
    // 最大数まで処理したらループを抜ける。
    int MAX_COUNT = 10;
    int count = 0;
    while(count < MAX_COUNT) {
        if (flg==true) {
            ...
        } else {
            ...
        }
        for (int i=0; i<list.size(); i++) {
            ... ←処理が1行で終わる場合でも、カッコを付けるスタイルが
                   一般的には好まれる。
        }
    } ←whileの開始に揃えてインデントを記述する。
    count++; // カウントを1増やす。 ←この行は「whileの外」なのがわかります。
}
病んだコードの症状と処方箋
   ~こういうコードは要注意!

 インデントがグチャグチャ
「インデント」が揃っていないだけで、
プログラムの可読性が著しく低下します。
                       グチャグチャ
                       ぜったいダメ!


プログラムは必ずきちんとインデントする!

インデントを「タブ」または「スペース」とするか、
インデントの幅をいくつにするかは、
開発プロジェクト内で統一しておきましょう。
病んだコードの症状と処方箋
 ~こういうコードは要注意!

重複したコード


  何?ショートカット・キー?
  「Ctrl + c」「Ctrl + v」とか超好き。
病んだコードの症状と処方箋
         ~こういうコードは要注意!

  重複したコード
  // 正社員を出力
  ArrayList empList = getEmpList();
  Iterator it = empList.iterator();
  while (it.hasNext()) {
       String empName = (String) it.next();
       System.out.println(empName);
  }
  // 協力会社を出力 ※バグあり
  ArrayList empList2 = getEmpList2();
  Iterator it2 = empList2.iterator();
  while (it.hasNext()) {
       String empName = (String) it.next();
       System.out.println(empName);
  }

「”社員名(empName)”にフリガナを付けて出力したいんだけど…。
 もしかして、出力箇所を全部修正?(涙」
「似たような名前のメソッドがあるけど、なんかやな予感…。
 やっぱり…両方直すのか…。欝だ。」
病んだコードの症状と処方箋
     ~こういうコードは要注意!

重複したコード
// 正社員を出力
ArrayList empList = getEmpList();
Iterator it = empList.iterator();
while (it.hasNext()) {
    String empName = (String) it.next();   同じような処理が存在。
    System.out.println(empName);
}                                          同じような処理が2箇所以上

// 協力会社を出力
                                           あった場合、共通化を考える。
ArrayList empList2 = getEmpList2();
Iterator it2 = empList2.iterator();
while (it.hasNext()) { ←上の処理で利用した変 数を利用している。(バグ)
    String empName = (String) it.next();
                                         バグ発見!
    System.out.println(empName);
}
病んだコードの症状と処方箋
    ~こういうコードは要注意!

重複したコード
// 正社員を出力
outputEmployeeNameList(permanentEmpList);
// 協力会社を出力                                  共通化することで、
outputEmployeeNameList(partnerEmpList);
                                            多岐に渡る修正等が発生しに

※共通可したメソッド                                  くくなる。
public void outputEmployeeNameList(List<String> list) {
    for (String s : list) {
        System.out.println(s);
    }
       ※余談ですが・・・
}
      Iteratorを利用する場合、while文はバグの温床になりやすいので、
      for文、可能であれば拡張forループ(JDK 1.5以降)を利用したほうが良いです。
病んだコードの症状と処方箋
   ~こういうコードは要注意!

 重複したコード
「重複したコード」は、プログラムの
「コピー&ペースト」で発生しやすいです。

プログラムの「コピペ」をする前に、
そのプログラムの意味をよく理解して、
できるだけ「共通化」を考えましょう。
病んだコードの症状と処方箋
 ~こういうコードは要注意!

分かりづらい命名


  それにしても、FBは最高だな!!!
  あ、そういえばHK、ほんとANだよな。
病んだコードの症状と処方箋
      ~こういうコードは要注意!

 分かりづらい命名
  int akb = 48;
  String h = c + ":" + n;

  private void getENM(int akb) {
      …
  }

「”akb”って、なんやねん!!!」
「hには何が代入されてるんだろう・・・。」
「getENM…なるほど・・・わからん!」
「get?何が返ってくるのだろう…。え?戻り値なしかよ!w」
病んだコードの症状と処方箋
    ~こういうコードは要注意!

分かりづらい命名
int akb = 48; ←書いた自分にしか分からないことは書かない。
String h = c + ":" + n; ←変数名が短すぎてわからない

private void getENM(int akb) { ←メソッドの役割と異なる名前
    …                           ※getXXXなのに値を返さない。
}
病んだコードの症状と処方箋
     ~こういうコードは要注意!

分かりづらい命名
int departmentNo = 48;
String headerName
    = String.format("%s:%d", departmentName, departmentNo);

private void outputEmployeeNameList(int departmentNo) {
    …
}


変数名は多少長くても、分かりやすく書く。
メソッド名やクラス名は役割にそぐった名前を付ける。
病んだコードの症状と処方箋
     ~こういうコードは要注意!

分かりづらい命名
例外①…慣用句
 for (int i=0; i<list.size()-1; i++) {
     for (int j=0; j<list.size()-1; j++) {
         for (int k=0; k<list.size()-1; k++) {
         }
     }
 }

慣用的に使われるfor文の「ループ変数」等は、
「i, j, k」のほうがわかりやすいかもしれません。
病んだコードの症状と処方箋
     ~こういうコードは要注意!

分かりづらい命名
例外②…スコープの短い変数
 while (employeesRecordSet.next()) {
     emp.setName(employeesRecordSet.getString("employee_name"));
 }



 while (rs.next()) {
     emp.setName(rs.getString("employee_name"));
 }

パッと見で処理が見渡せるようなケースで「スコープが短い変数」を
利用する場合、変数名が長いと逆に冗長かもしれません。
病んだコードの症状と処方箋
   ~こういうコードは要注意!

 分かりづらい命名
変数の命名方法にはいくつか「記法」が存在します。
  Pascal(パスカル)形式
  各単語の頭文字を大文字で記述する。
  例)EmpName
  Camel(キャメル)形式
  各単語の頭文字を小文字で記述する。
  例)empName
  Hungarian(ハンガリアン)記法
   型の情報だけで補えない情報を補う。
   例)yenPay, dolPay
   型の接頭辞を付与する。(iはint, sはString等)
   例)iEmpCode, sEmpName
病んだコードの症状と処方箋
    ~こういうコードは要注意!

 分かりづらい命名
これは私の主観になってしまいますが、
通常の変数であれば、Camel形式に加えて「ドメイン」を
よく考えておいて変数名を付けると便利です。

「ドメイン」とは…型の集合のこと、DBの論理設計で利用されます。
下記の例のように、グループと型をあらかじめ決めておきます。
Name(名)…文字(32) Date(日)…日時
Type(種別)…文字(2) Amt(金額)…数値(BigDecimal)
ID(番号)…数値(int)
No(番号)…数値(int)
Flag(フラグ)…ブール(true/false)
病んだコードの症状と処方箋
       ~こういうコードは要注意!

  分かりづらい命名
「xxxNameはこの型」とドメインを決めておくと、プログラムを
読みながら、そこから変数の型をかんたんに推測できます。
※DBの論理設計とあわせて考慮すると、とてもコーディングがしやすくなる。

Name(名)…文字(32) …empName(社員名),userName(ユーザ名)
Code(コード)…文字(8) …categoryCode(カテゴリコード)
Type(種別)…文字(2) …categoryType(カテゴリ種別)
ID(番号)…数値(int) …empID(社員ID),userID(ユーザID),customerID(顧客ID)
No(番号)…数値(int) …salesNo(売上番号), lotNo(ロット番号)
Seq(通番)…数値(int) …orderSeq(注文通番), receiptSeq(領収書通番)
Flag(フラグ)…ブール(true/false) …deleteFlag(削除フラグ)
Date(日)…日時 …startDate(開始日), issueDate(発行日)
Amount(金額)…数値(BigDecimal)…salesAmount(売上金額)
病んだコードの症状と処方箋
   ~こういうコードは要注意!

 分かりづらい命名
変数名やメソッド名について記法をいくつか紹介しました。
ここではそれぞれを詳しく説明しませんが、
どれも一長一短あるので、
どれがすぐれていると一言では言い難いです。

しかし、どの記法を用いるにしても、
大事なことは、プロジェクトで記法を統一し、
わかりやすい名前を付けることです。
病んだコードの症状と処方箋
 ~こういうコードは要注意!

長~いメソッド


  ん?メソッドを分割!?
  男はだまって翌月一括払いダゼ!
病んだコードの症状と処方箋
                ~こういうコードは要注意!

  長~いメソッド
   private void DataGrid1_ItemCommand(object source, System.Web.UI.WebControls.DataGridCommandEventArgs e) |
       DataView dv = new DataView(dt);
       ViewState["Sort"] = dv.Sort = sort;
       DataGrid1.DataSource = dv;

      DataGrid1.PageSize = viewnum;
      if (dt.Rows.Count < (DataGrid1.PageSize * DataGrid1.CurrentPageIndex))
          DataGrid1.CurrentPageIndex = (int) (dt.Rows.Count / DataGrid1.PageSize);
      if ((dt.Rows.Count == (DataGrid1.PageSize * DataGrid1.CurrentPageIndex)) && (dt.Rows.Count != 0))
          DataGrid1.CurrentPageIndex = DataGrid1.CurrentPageIndex - 1;

       DataGrid1.Visible = true;

       if (dt.Rows.Count != 0) {
           StringBuilder sb = new StringBuilder();
           sb.Append(dt.Rows.Count.ToString()).Append("件");
           FindRecordsLabel.Text = sb.ToString();
       } else {
           FindRecordsLabel.Text = AllegroMessage.S10002;
       }

       if (searchCondition.HasErrors) {
           setMessageLabel(searchCondition.ErrorMessage);
       }




「300行…508…1,078…。ま、まだ続いている!
      い・・・いったい、どこまで続くというんだ!?」
病んだコードの症状と処方箋
             ~こういうコードは要注意!

長~いメソッド
private void DataGrid1_ItemCommand(object source, System.Web.UI.WebControls.DataGridCommandEventArgs e) |
    DataView dv = new DataView(dt);
    ViewState["Sort"] = dv.Sort = sort;
    DataGrid1.DataSource = dv;

   DataGrid1.PageSize = viewnum;
   if (dt.Rows.Count < (DataGrid1.PageSize * DataGrid1.CurrentPageIndex))
       DataGrid1.CurrentPageIndex = (int) (dt.Rows.Count / DataGrid1.PageSize);
   if ((dt.Rows.Count == (DataGrid1.PageSize * DataGrid1.CurrentPageIndex)) && (dt.Rows.Count != 0))
       DataGrid1.CurrentPageIndex = DataGrid1.CurrentPageIndex - 1;

    DataGrid1.Visible = true;

    if (dt.Rows.Count != 0) {
        StringBuilder sb = new StringBuilder();


                                                     メソッドが長すぎると、
        sb.Append(dt.Rows.Count.ToString()).Append("件");
        FindRecordsLabel.Text = sb.ToString();
    } else {
        FindRecordsLabel.Text = AllegroMessage.S10002;


                                                     処理内容の把握がとても難しくなります。
    }

    if (searchCondition.HasErrors) {
        setMessageLabel(searchCondition.ErrorMessage);
    }

                                                     また、改修の影響範囲なども見えにくく
                                                     なってしまいます。
病んだコードの症状と処方箋
     ~こういうコードは要注意!

長~いメソッド
// 検索条件を設定する
Condition condition = new Condition();
condition.empID = 10;
// 取得した社員一覧を出力する                           コメントを書いた処理があった場合、
List<Employee> list = search(condition);
                                           そのコメントを「メソッド名」とした
for (Employee employee : list) {
    ...                                    メソッドにしてしまえば、
}
                                           コメントもいらなくなる。

setSearchCondition();
outputEmployeesList(condition);
病んだコードの症状と処方箋
   ~こういうコードは要注意!

 長~いメソッド
メソッドを短くするときは、
「コードを短くする」とは考えず、
「メソッド名とその実装の距離を縮める」
と考えるのがポイントです。

また、メソッドの分割を考えたとき、
「メソッドの命名に困ってしまう」ということは、
「そのメソッドにはまだ分割の余地がある」
ということです。
病んだコードの症状と処方箋
 ~こういうコードは要注意!

多すぎる引数


  だって、貯金と引数は多ければ
  多いほど良いってばぁちゃんが・・・
病んだコードの症状と処方箋
     ~こういうコードは要注意!

 多すぎる引数
  /**
    * xxxを出力します。
    * 出力内容は引数の社員種別とxxxフラグによって制御し、どうたらこうたら…
    */
  private void printEmpInfo (
      int empID,

                  ずらずらと引数が多すぎる。
      string empName,
      int empType,
      ...,
      ...
  ) {
      ...



「ど、どうやって使うんだこのメソッド・・・。」
「引数がたくさん・・・、わかりづらいなぁ。」
病んだコードの症状と処方箋
      ~こういうコードは要注意!

多すぎる引数
/**
  * xxxを出力します。
  */
private void printEmpInfo (Employee employee) {
    System.out.println(employee.getEmpID);
    ...


                             関連のある情報はクラスにする。
                             オブジェクトを引数に渡す。
病んだコードの症状と処方箋
   ~こういうコードは要注意!

 多すぎる引数
メソッドに引数が多すぎる場合、
「引数にオブジェクトを利用する」と
きれいにまとまります。
渡す値が増えた場合でも、メソッドの
呼び出し元の修正が不要です。

反面、メソッドが「引数クラスに依存」してしまうという
デメリットもあることも意識しておきましょう。
病んだコードの症状と処方箋
 ~こういうコードは要注意!

不適切なコメント


 ◎x☆=ё!!!
 Ж▽£Ф@¥Ё!!




                 通報しますた。
病んだコードの症状と処方箋
      ~こういうコードは要注意!

 不適切なコメント
  /**
    * xxxを出力します。
    * 出力内容はフラグによって制御し、どうたらこうたら…
    * ○○の場合、xxxxx。△の場合、xxxxx。
    * このケースの場合、xxxxxで、xxxxする。
    * それ以外の場合、xxxxxx。
    */
  private void koreHaMuzukashiiSyoriDesuYo(…) {
      // 最初にxxxxします。
       ...
      // 下記の処理では、xxxをxxxして、その後xxxx。
       ...
      // この変数にはxxxxが格納されているので、xxxxxの後にxxxxします。
       ...




「ちゃんとコメント書いてあるけど・・・んんっ!?」
病んだコードの症状と処方箋
    ~こういうコードは要注意!

不適切なコメント
/**
  * xxxを出力します。
  * 出力内容はフラグによって制御し、どうたらこうたら…
  * ○○の場合、xxxxx。△の場合、xxxxx。
  * このケースの場合、xxxxxで、xxxxする。     コメントを書くこと自体、
  * それ以外の場合、xxxxxx。
  */                            まったく悪いことではないですが、
private void koreHaMuzukashiiSyoriDesuYo(…) {
    // 最初にxxxxします。
     ...
                                きをつけなければならないことが
    // 下記の処理では、xxxをxxxして、その後xxxx。
     ...                        あります。
    // この変数にはxxxxが格納されているので、xxxxxの後にxxxxします。
     ...
病んだコードの症状と処方箋
    ~こういうコードは要注意!

 不適切なコメント
コメントはコードでは表せない説明の為に書きます。
「コメントがたくさん書いてある」ということは、
「それが分かりづらい処理である」ということです。

コメントを解りづらい処理の「消臭剤」の為に使ってはダメ。
そういった処理はそもそも、ロジックを見直しを検討が必要。
自分で「たくさんコメントを書いているな。」と思ったら、
いったん手を止めて、設計やロジックを見直しましょう。
病んだコードの症状と処方箋
     ~こういうコードは要注意!

 不適切なコメント
コメントには、プログラムが処理を進めていく
具体的な方法を書くべきではありません。
処理内容の説明ではなく、
     なぜそのように書かれているのか?
という理由や、
       最終的に何が達成されるのか?
を説明する。
× // UserRegistryのデータでRegistryオブジェクトを更新する。
○ //登録情報を後で参照できるようにキャッシュする。
病んだコードの症状と処方箋
   ~こういうコードは要注意!

 コメント
その他、コメントについては、

過去の勉強会
 「第4回 良い?悪い?コードコメントの書き方」

で詳しく取り上げています。
興味のあるかたは、そちらもご覧くださいな。
まとめ
常に保守のことを考えよう
 障害対応、機能追加のことをよく意識しよう。
 他人のため、数ヵ月後(数日後?)の自分のために、
 読み安いプログラムを書くことを心がけよう。


リファクタリングの第一歩
 まずはコードの健康状態(病んだコード、健康なコード)
 を知ることからはじめよう。
 できそうなところから、意識してコードを改善してみよう。
 書きっぱなしではなく、何度もコードを見直して、
 より良い状態に改善をしよう!(定期的な健康診断を!)
おしまい
参考文献
Martin Fowler『リファクタリング プログラミングの体質改善テクニック』、ピアソン・
エデュケーション 、2000年。
Joshua Bloch『Effective Java(第2版)』、ピアソン・エデュケーション 、2008年。
Pete Goodliffe『Code Craft~エクセレントなコードを書くための実践的技法~』、 毎日
コミュニケーションズ 、2007年。
                                 どれも良書ですよ!

More Related Content

What's hot

Iocコンテナについて
IocコンテナについてIocコンテナについて
IocコンテナについてAkio Terayama
 
メタプログラミングって何だろう
メタプログラミングって何だろうメタプログラミングって何だろう
メタプログラミングって何だろうKota Mizushima
 
関数型プログラミングのデザインパターンひとめぐり
関数型プログラミングのデザインパターンひとめぐり関数型プログラミングのデザインパターンひとめぐり
関数型プログラミングのデザインパターンひとめぐりKazuyuki TAKASE
 
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭するCEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭するYoshifumi Kawai
 
ドメイン駆動設計に15年取り組んでわかったこと
ドメイン駆動設計に15年取り組んでわかったことドメイン駆動設計に15年取り組んでわかったこと
ドメイン駆動設計に15年取り組んでわかったこと増田 亨
 
やはりお前らのMVCは間違っている
やはりお前らのMVCは間違っているやはりお前らのMVCは間違っている
やはりお前らのMVCは間違っているKoichi Tanaka
 
デキるプログラマだけが知っているコードレビュー7つの秘訣
デキるプログラマだけが知っているコードレビュー7つの秘訣デキるプログラマだけが知っているコードレビュー7つの秘訣
デキるプログラマだけが知っているコードレビュー7つの秘訣Masahiro Nishimi
 
Pythonによる黒魔術入門
Pythonによる黒魔術入門Pythonによる黒魔術入門
Pythonによる黒魔術入門大樹 小倉
 
モジュールの凝集度・結合度・インタフェース
モジュールの凝集度・結合度・インタフェースモジュールの凝集度・結合度・インタフェース
モジュールの凝集度・結合度・インタフェースHajime Yanagawa
 
F#入門 ~関数プログラミングとは何か~
F#入門 ~関数プログラミングとは何か~F#入門 ~関数プログラミングとは何か~
F#入門 ~関数プログラミングとは何か~Nobuhisa Koizumi
 
実践的な設計って、なんだろう?
実践的な設計って、なんだろう?実践的な設計って、なんだろう?
実践的な設計って、なんだろう?増田 亨
 
クロージャデザインパターン
クロージャデザインパターンクロージャデザインパターン
クロージャデザインパターンMoriharu Ohzu
 
リーンなコードを書こう:実践的なオブジェクト指向設計
リーンなコードを書こう:実践的なオブジェクト指向設計リーンなコードを書こう:実践的なオブジェクト指向設計
リーンなコードを書こう:実践的なオブジェクト指向設計増田 亨
 
名は体を表していますか
名は体を表していますか名は体を表していますか
名は体を表していますかinfinite_loop
 
ドメイン駆動設計 基本を理解する
ドメイン駆動設計 基本を理解するドメイン駆動設計 基本を理解する
ドメイン駆動設計 基本を理解する増田 亨
 

What's hot (20)

Iocコンテナについて
IocコンテナについてIocコンテナについて
Iocコンテナについて
 
メタプログラミングって何だろう
メタプログラミングって何だろうメタプログラミングって何だろう
メタプログラミングって何だろう
 
関数型プログラミングのデザインパターンひとめぐり
関数型プログラミングのデザインパターンひとめぐり関数型プログラミングのデザインパターンひとめぐり
関数型プログラミングのデザインパターンひとめぐり
 
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭するCEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
 
プログラムを高速化する話
プログラムを高速化する話プログラムを高速化する話
プログラムを高速化する話
 
ドメイン駆動設計に15年取り組んでわかったこと
ドメイン駆動設計に15年取り組んでわかったことドメイン駆動設計に15年取り組んでわかったこと
ドメイン駆動設計に15年取り組んでわかったこと
 
良いコードとは
良いコードとは良いコードとは
良いコードとは
 
やはりお前らのMVCは間違っている
やはりお前らのMVCは間違っているやはりお前らのMVCは間違っている
やはりお前らのMVCは間違っている
 
デキるプログラマだけが知っているコードレビュー7つの秘訣
デキるプログラマだけが知っているコードレビュー7つの秘訣デキるプログラマだけが知っているコードレビュー7つの秘訣
デキるプログラマだけが知っているコードレビュー7つの秘訣
 
llvm入門
llvm入門llvm入門
llvm入門
 
Marp入門
Marp入門Marp入門
Marp入門
 
Pythonによる黒魔術入門
Pythonによる黒魔術入門Pythonによる黒魔術入門
Pythonによる黒魔術入門
 
モジュールの凝集度・結合度・インタフェース
モジュールの凝集度・結合度・インタフェースモジュールの凝集度・結合度・インタフェース
モジュールの凝集度・結合度・インタフェース
 
F#入門 ~関数プログラミングとは何か~
F#入門 ~関数プログラミングとは何か~F#入門 ~関数プログラミングとは何か~
F#入門 ~関数プログラミングとは何か~
 
明日使えないすごいビット演算
明日使えないすごいビット演算明日使えないすごいビット演算
明日使えないすごいビット演算
 
実践的な設計って、なんだろう?
実践的な設計って、なんだろう?実践的な設計って、なんだろう?
実践的な設計って、なんだろう?
 
クロージャデザインパターン
クロージャデザインパターンクロージャデザインパターン
クロージャデザインパターン
 
リーンなコードを書こう:実践的なオブジェクト指向設計
リーンなコードを書こう:実践的なオブジェクト指向設計リーンなコードを書こう:実践的なオブジェクト指向設計
リーンなコードを書こう:実践的なオブジェクト指向設計
 
名は体を表していますか
名は体を表していますか名は体を表していますか
名は体を表していますか
 
ドメイン駆動設計 基本を理解する
ドメイン駆動設計 基本を理解するドメイン駆動設計 基本を理解する
ドメイン駆動設計 基本を理解する
 

Similar to プログラムの処方箋~健康なコードと病んだコード

初心者講習会資料(Osaka.R#7)
初心者講習会資料(Osaka.R#7)初心者講習会資料(Osaka.R#7)
初心者講習会資料(Osaka.R#7)Masahiro Hayashi
 
JSX / Haxe / TypeScript
JSX / Haxe / TypeScriptJSX / Haxe / TypeScript
JSX / Haxe / TypeScriptbleis tift
 
Lisp Tutorial for Pythonista : Day 3
Lisp Tutorial for Pythonista : Day 3Lisp Tutorial for Pythonista : Day 3
Lisp Tutorial for Pythonista : Day 3Ransui Iso
 
関数型都市忘年会『はじめての函数型プログラミング』
関数型都市忘年会『はじめての函数型プログラミング』関数型都市忘年会『はじめての函数型プログラミング』
関数型都市忘年会『はじめての函数型プログラミング』Kenta USAMI
 
初心者講習会資料(Osaka.r#6)
初心者講習会資料(Osaka.r#6)初心者講習会資料(Osaka.r#6)
初心者講習会資料(Osaka.r#6)Masahiro Hayashi
 
初心者講習会資料(Osaka.R#5)
初心者講習会資料(Osaka.R#5)初心者講習会資料(Osaka.R#5)
初心者講習会資料(Osaka.R#5)Masahiro Hayashi
 
言語処理系入門€7
言語処理系入門€7言語処理系入門€7
言語処理系入門€7Kenta Hattori
 
Unity2015_No10_~UGUI&Audio~
Unity2015_No10_~UGUI&Audio~Unity2015_No10_~UGUI&Audio~
Unity2015_No10_~UGUI&Audio~CHY72
 
第一回Data mining勉強会 -第二章 - 原案
第一回Data mining勉強会 -第二章 - 原案第一回Data mining勉強会 -第二章 - 原案
第一回Data mining勉強会 -第二章 - 原案yushin_hirano
 
関数型言語&形式的手法セミナー(3)
関数型言語&形式的手法セミナー(3)関数型言語&形式的手法セミナー(3)
関数型言語&形式的手法セミナー(3)啓 小笠原
 
from old Java to modern Java
from old Java to modern Javafrom old Java to modern Java
from old Java to modern Java心 谷本
 
魂のコーディング
魂のコーディング魂のコーディング
魂のコーディングDaisuke Tasaki
 
APASEC 2013 - ROP/JIT を使わずに DEP/ASLR を回避する手法を見てみた。
APASEC 2013 - ROP/JIT を使わずに DEP/ASLR を回避する手法を見てみた。APASEC 2013 - ROP/JIT を使わずに DEP/ASLR を回避する手法を見てみた。
APASEC 2013 - ROP/JIT を使わずに DEP/ASLR を回避する手法を見てみた。Satoshi Mimura
 
第一回Data mining勉強会 -第二章
第一回Data mining勉強会 -第二章第一回Data mining勉強会 -第二章
第一回Data mining勉強会 -第二章Tomonobu_Hirano
 
15分でざっくり分かるScala入門
15分でざっくり分かるScala入門15分でざっくり分かるScala入門
15分でざっくり分かるScala入門SatoYu1ro
 
Java Puzzlers JJUG CCC 2016
Java Puzzlers JJUG CCC 2016Java Puzzlers JJUG CCC 2016
Java Puzzlers JJUG CCC 2016Yoshio Terada
 

Similar to プログラムの処方箋~健康なコードと病んだコード (20)

初心者講習会資料(Osaka.R#7)
初心者講習会資料(Osaka.R#7)初心者講習会資料(Osaka.R#7)
初心者講習会資料(Osaka.R#7)
 
JSX / Haxe / TypeScript
JSX / Haxe / TypeScriptJSX / Haxe / TypeScript
JSX / Haxe / TypeScript
 
Introduction of Python
Introduction of PythonIntroduction of Python
Introduction of Python
 
Lisp Tutorial for Pythonista : Day 3
Lisp Tutorial for Pythonista : Day 3Lisp Tutorial for Pythonista : Day 3
Lisp Tutorial for Pythonista : Day 3
 
関数型都市忘年会『はじめての函数型プログラミング』
関数型都市忘年会『はじめての函数型プログラミング』関数型都市忘年会『はじめての函数型プログラミング』
関数型都市忘年会『はじめての函数型プログラミング』
 
たのしい関数型
たのしい関数型たのしい関数型
たのしい関数型
 
初心者講習会資料(Osaka.r#6)
初心者講習会資料(Osaka.r#6)初心者講習会資料(Osaka.r#6)
初心者講習会資料(Osaka.r#6)
 
初心者講習会資料(Osaka.R#5)
初心者講習会資料(Osaka.R#5)初心者講習会資料(Osaka.R#5)
初心者講習会資料(Osaka.R#5)
 
講座C入門
講座C入門講座C入門
講座C入門
 
言語処理系入門€7
言語処理系入門€7言語処理系入門€7
言語処理系入門€7
 
Unity2015_No10_~UGUI&Audio~
Unity2015_No10_~UGUI&Audio~Unity2015_No10_~UGUI&Audio~
Unity2015_No10_~UGUI&Audio~
 
第一回Data mining勉強会 -第二章 - 原案
第一回Data mining勉強会 -第二章 - 原案第一回Data mining勉強会 -第二章 - 原案
第一回Data mining勉強会 -第二章 - 原案
 
関数型言語&形式的手法セミナー(3)
関数型言語&形式的手法セミナー(3)関数型言語&形式的手法セミナー(3)
関数型言語&形式的手法セミナー(3)
 
from old Java to modern Java
from old Java to modern Javafrom old Java to modern Java
from old Java to modern Java
 
魂のコーディング
魂のコーディング魂のコーディング
魂のコーディング
 
APASEC 2013 - ROP/JIT を使わずに DEP/ASLR を回避する手法を見てみた。
APASEC 2013 - ROP/JIT を使わずに DEP/ASLR を回避する手法を見てみた。APASEC 2013 - ROP/JIT を使わずに DEP/ASLR を回避する手法を見てみた。
APASEC 2013 - ROP/JIT を使わずに DEP/ASLR を回避する手法を見てみた。
 
第一回Data mining勉強会 -第二章
第一回Data mining勉強会 -第二章第一回Data mining勉強会 -第二章
第一回Data mining勉強会 -第二章
 
15分でざっくり分かるScala入門
15分でざっくり分かるScala入門15分でざっくり分かるScala入門
15分でざっくり分かるScala入門
 
はじめての「R」
はじめての「R」はじめての「R」
はじめての「R」
 
Java Puzzlers JJUG CCC 2016
Java Puzzlers JJUG CCC 2016Java Puzzlers JJUG CCC 2016
Java Puzzlers JJUG CCC 2016
 

Recently uploaded

論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A surveyToru Tamaki
 
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...Toru Tamaki
 
SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する       2024/04/19 の勉強会で発表されたものですSOPを理解する       2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものですiPride Co., Ltd.
 
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Yuma Ohgami
 
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案sugiuralab
 
TSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdfTSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdftaisei2219
 
論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNetToru Tamaki
 
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)Hiroki Ichikura
 

Recently uploaded (8)

論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey
 
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
 
SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する       2024/04/19 の勉強会で発表されたものですSOPを理解する       2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものです
 
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
 
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
 
TSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdfTSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdf
 
論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet
 
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
 

プログラムの処方箋~健康なコードと病んだコード