by shigemk2

当面は技術的なことしか書かない

達人プログラマー 8

41 常に並列性を意識した設計を行うこと

並列的な考えかたを用いてアーキテクチャの設計が行えるようになれば、それを
広域分散可能な多くの並列サービスに対しても応用可能になるはず。

並列性のないアプリケーションに後づけで並列性を付加するのは難しいので、
始めから並列的な設計をしておく。

42 モデルをビューから分離すること
Publish/Subscribe(イベント生成側とイベント受け取り側)
すべてのイベントを1つのルーチンで受けとるのは正しくない。
巨大なif文を使うくらいなら、まず設計を見直すことを考える。
オブジェクトには必要な情報のみが入っているべきであり、
それ以外の不必要なイベントを受けとるのは好ましくない。

データを弄らず見た目だけを弄るファイルが必要となる。
例:
特定のデータを違う方法で表示させるとき、モデルからデータを
コピーするよりそれぞれのビューファイルを作成したほうが効率がよい。

この考えかたを応用したのがRoRなどのMVCのコンセプトである。

また、MVCを使うにあたり、GUI開発だけに拘る必要はない。

43 ワークフローを協調させるにはホワイトボードを使用すること
ワークフローを使えば、考えられる組み合わせと状況をすべて処理することが
出来る。

ホワイトボードを使えば必要な情報を的確に抽出することができるし、
関係者たちを協調させるのにも役立つ。

偶発的プログラミング
44 偶発的プログラミングを行わないこと

もし何らかのルーチンを呼び出す場合は、ドキュメント化されている振舞いのみを
前提とするようにする。

慎重なプログラミングを行うためには、

  • 常に何をやっているのかを意識する
  • 自分の仮定をドキュメント化する
  • 目隠しでコーディングをしない(理解していない手法でコーディングはしない)
  • 信頼のおけるものだけを前提とする。偶然や仮定に依存してはいけない。
  • コードをテストするだけではなく、仮定をテストする
  • 作業に優先順位をつける
  • 過去のしがらみにとらわれない。既存のコードによって未来のコードが影響されないようにする

45 アルゴリズムのオーダーを見積ること
O()記法とは、n件のソートを行うソートルーチンがあり、それがO(n^2)時間かかるばあい、
ソートは最悪の場合n^2だけ時間がかかる、ということ。

O(1) 定数
O(lg(n)) 対数(バイナリサーチ)
O(n) 線形(順次検索)
O(n lg(n)) 線形よりも悪いがさほどわるくない(クイックソードなど)
O(n^2) 2乗(選択ソートや挿入ソート)
O(n^3) 3乗(2つのn行n烈行列の積)
O(Cn) 指数 (巡回セールスマン問題)

ちなみに巡回セールスマン問題については、
wikipediaなんかを参考のこと。