ゆるかわPHPの会#2 参加しました
2013/07/06 に行われた ゆるかわPHPの会#2 に参加しました。
場所は恵比寿にある 株式会社 Engine Yard さん。
発表されたテーマは環境構築、テストから同時実行制御まで幅広い感じ。
言語などに捕われず、ゆるさを許容してくれるゆるかわ PHP。
ロックについては改めて考えるいい機会になりました。
当日発表されたスライドは主催の @polidog さんのブログにまとめられています。
ゆるかわPHP#2を開催しました | polidog lab++
自分の発表は前回に引き続き PHP とは直接関係ないものでした。
主旨がぶれてしまったのが心のこり。
発表の後はワールドカフェっぽい感じの雑談タイムに。
短い時間でしたがいろいろな立場や経験を持った人、自分と異なる視点や考えの人とお話できて楽しかったです。
初めてカフェオーナーっぽいことをやったけど話題振ったりまとめたりするの難しい。こみゅにけーしょんりょくぶそくをつうかんしてつらい。
でも機会があればまたやってみたいです。
最後に参加者の皆さん、主催の @polidog さん、会場を提供してくださった Engine Yard さんありがとうございました!
次回開催を楽しみにしています。
アジャイル設計と5つの原則
アジャイルソフトウェア開発の奥義 第2部「アジャイル設計」の自分用まとめ。
アジャイル設計
アジャイルな設計
「原則」「パターン」「プラクティス」を継続的に適用することで、読みやすく変更に強い状態を保つことができる設計。
悪い設計
第2部の中で「貧弱な設計の兆候」「腐敗するソフトウェアの兆候」として、以下の7つが挙げられている。
- 硬さ (設計変更が難しい)
- 脆さ (設計が壊れやすい)
- 移植性のなさ (再利用が難しい)
- 扱いにくさ(正しい設計をするのが困難なソフトウェア、面倒な開発環境)
- 不必要な複雑さ("後で必要になるかもしれない"と考えて先行実装したコード)
- 不必要な繰り返し (コピペ)
- 不透明さ (目的や意図がわかりにくい)
原則
システムに悪い設計の兆候が見られるとき、その原因がオブジェクト指向設計の原則に反していることだったりする。
ただし無条件で原則に従うと「不必要な複雑さ」を招くこともあるので注意。
- 単一責任の原則 (SRP : Single Responsibility Principle)
- オープン・クローズドの原則 (OCP : Open-Closed Principle)
- リスコフの置換原則 (LSP : Liskov Substitution Principle)
- 依存性逆転の原則 (DIP : Dependency Inversion Principle)
- インタフェース分離の原則 (ISP : Interface Segregation Principle)
デザインパターン - Strategy
「オブジェクト指向のこころ」読書記録。
GoF のデザインパターンにある Strategy パターンについて。
Strategy?
Strategy(すとらてじ)を辞書で調べると以下のように書かれている。
strategy
http://ejje.weblio.jp/content/strategy
1. 【不可算名詞】 戦略
2. 【不可算名詞】 [具体的には 【可算名詞】] (目的達成のための)計略,策略; 計画,方策,方法,手順
ざっくり
Strategy パターンは状況に応じて使用するアルゴリズムを切り替える。
選択されるアルゴリズムは同じインタフェースで異なる実装を持つ。
イメージ
どの方法を選択するのか
たとえば子どもにお買い物を頼むとする。
お買い物を頼める子どもは複数いる。
子どもたちはみんな「お買い物行ってきて」と頼んでメモを渡せば、ちゃんと指定した品物を買ってくることができる。
ただお店までどう行くかは子どもによって違うらしく、ある子はお店まで徒歩で、ある子はお店まで自転車に乗って行く。
親としてはどの子に頼んでも同じ結果を得られる。
どの子に頼むかは、状況に応じて決定すればよい。
アルゴリズムのファミリ
これらを Strategy パターンに置き換えると、子どもたちは共通の概念を持つクラス群(ファミリ)と定義できる。親は子どもを集約している。
まとめ
- Strategy パターンはアルゴリズムのファミリを定義する
- これらのアルゴリズムは概念的にすべて同じことを行う
- インタフェースは同じ
- 実装は異なる
- これらのアルゴリズムは概念的にすべて同じことを行う
- Strategy パターンのメリット
- 依存関係逆転の原則(DIP)に準拠する
- 繰り返し現れる switch や if などの条件分岐をなくす
- ユニットテストを作成しやすくなる
- Strategy パターンのデメリット
- 多少複雑になりがち(その分コストも増える)