同じことをするにもいろんな方法があるものです。トンカツの添え物キャベツは千切りがよい人,角切りがよい人,手でちぎったのがよい人......。結局口に入って,消化され栄養を吸収された後は,繊維質が残って排出されます。どの方法でも結果は同じです。「⁠トンカツとともにキャベツを食べる」という目的のための「キャベツの切断方法⁠」⁠,それは好みと少々の意味合いによって,人それぞれに選択をします。今回は目的に応じたアルゴリズムの選択・切り替えを,柔軟に行えるコードを書くためのデザインパターンであるStrategyパターンを紹介します。GoF本(P.vii)でも初学者向けの題材であると勧められています。展開Strategy(ストラテジ)プログラムは何らかの目的があって作られます。目的を果たすためにアルゴリズムをコードに落とします。そのアルゴリズムは1つとは限りません。アルゴリズムによって処理速度の違いや効率の善し悪しがあります。あるデータに対して高速だったアルゴリズムが,別のデータに対して低速であることは珍しくありません。データに応じてアルゴリズムを切り替えれば,実行速度の低下を防ぐことができるでしょう。Strategyパターンの目的Strategyという単語は,アルゴリズム(algorithm)という単語よりも広いニュアンスを持ちます。ここではアルゴリズムという単語の意味を「コンピュータに仕事を行わせる手順」とします。Strategyはコンピュータに限らず問題解決のための「戦略,戦術,方策」という意味があります。少々軍事的なニュアンスがありますが,アルゴリズムと改まって表現する程でもない手順や約束事も,広くとらえればStrategyです。目的のために使用できるアルゴリズムが複数あるとします。場合に応じてアルゴリズムを切り替えて使用できれば便利です。アルゴリズムを部品化して,柔軟に切り替えて使用できる仕組みをまとめたのがStrategyパターンです。アルゴリズムを表現するコードAを,それ利用する側のコードBから分離した場合,BからAのコードの細部は見える必要がない場合がほとんどです。必要なのは,Aが目的の出力をしてくれることです。AとBが一体となり,コードの細部があらわになっていると,コードが読みづらくなります。BからAのフィールドに対して不用意な操作を受けるかもしれません。これらを回避するためにも,Strategyパターンを適用してアルゴリズムをカプセル化する利点があります。[Strategyパターン]主となるコードからアルゴリズムを表現するコードを切り離し,部品化する。コードの実行時にアルゴリズムの切り替えを可能にする。上図のStrategyパターンでは,Clientが計算結果を必要とし,Contextクラスに対して使用するアルゴリズム(ConcreteStrategy)を指定します。ClientクラスはContextクラスのcontextMethodを呼んで必要な結果を得ます。アルゴリズムを実装したConcreteStrategyクラスは複数あります。ConcreteStrategyクラスはStrategyインタフェイスを実装しています。ContextクラスはStrategyインタフェイスを通してConcreteStrategyクラスのメソッドstrategyMethodを使用します。Contextクラスのコードでは,ConcreteStrategyクラスの実装がどのようなものかを知る必要がありません。Strategyインタフェイスを通じてメソッドstrategyMethodを呼べれば良いのです。今後,異なるアルゴリズムを実装した新しいConcreteStrategyクラスを使い始めたならば,Clientが新しいクラスを使用することをContextクラスに対して指定するだけで,その他のコードについて変更が必要ない仕組みになっています。柔軟でシンプルな構造です。Strategyパターンを使わないと同じ目的のために作られた,異なるアルゴリズムを切り替えて使う場合,Strategyパターンを使わなければ,次のコードのように条件判断文で使用するメソッドを切り替えることになるでしょう。これは1からnまでの数の合計を取るコードです。異なるアルゴリズムを実装した2つのメソッドを交互に切り替えています。val;}アルゴリズムをクラスでカプセル化するアルゴリズムを実装したメソッドを,クラスでカプセル化すると次のように書けます。このように書くメリットは,アルゴリズムをカプセル化したクラスを,部品として再利用できることです。アルゴリズムをカプセル化したSlowSumとFastSumクラスのコードは紙面の都合上省略しますので,リンク先のファイルで確認してください。プログラミングと日本の端っこ踏破旅行。結城浩氏のような仕事をしたいと妄想している。2019」を開催しました。DAY1・DAY2の様子を注目セッションとともにお伝えします。LINEのエンジニア3名がイベントに先駆けて見どころを紹介します。コードの安全性・安定性を高める開発サイクル~テスト管理の効率を上げ,脆弱性診断を自動で行う~本連載では,連載「業務を改善する情報共有の仕掛け」を受けつつ,安全性・安定性を加えた開発サイクルについて考えていきます。若者世代から圧倒的な人気を誇るライブ配信&動画投稿コミュニティアプリ「MixChannel」(ミクチャ)の裏側(レコメンドシステムやサーバサイド開発など)について解説していきます。その他の連載CSS3アニメーションでつくるインターフェイス表現CSS3によるアニメーション表現を紹介していきます。その中でも,幅広い読者に応用してもらえるだろうインターフェイスを主なお題とします。MySQL道普請便り本連載では,MySQLを使ったアプリ開発・運用に関するノウハウをご紹介していきます。RecipeUbuntuの強力なデスクトップ機能を活用するための,いろいろなレシピをお届けします。JavaScriptセキュリティの基礎知識JavaScriptに関するセキュリティ上の問題はどこで発生し,どうすれば防ぐことができるのか?について解説していきます。〜システムをきちんと運用するための基礎知識システムは「作って終わり」ではなく,運用の中でさまざまな問題が発生します。問題の発生に備えて事前にどのような対応をしておくべきなのか,問題発生時に何をしなければならないのか,ポイントを解説していきます。きたみりゅうじの聞かせて珍プレーソフトウェア開発の現場で体験したトホホな失敗,思わずうなる珍プレーをきたみりゅうじ氏が四コママンガで紹介。Linuxのメンテナンスの傍ら,Linuxやオープンソースソフトと日々を過ごす著者が,その魅力とつきあい方を,エッセイ風味でお届けします。PRESS特別編集部員,さわやか笑顔のスーパーハカーはまちちゃんとネット大好き14歳わかばちゃんが,毎号,読者の皆さんから寄せられたおたよりを紹介します。皆さんの日頃の悩みにも答えちゃいますよ。]メールでのお知らせメールで次の案内をお送りしております。メールの配信を希望する方は,利用したい項目をチェックしてメールアドレスを入力し,[登録]ボタンをクリックしてください。UPDATES[ほぼ週間に1回]新刊メールマガジン[ほぼ週間に1回]電脳会議の各号案内[ほぼ1ヵ月半に1回]※変更する場合や停止する場合は,登録情報変更ページをご覧ください。※登録いただいたメールアドレスには,そのお知らせ以外,配信いたしません。Ltd.ページ内容の全部あるいは一部を無断で利用することを禁止します。個別にライセンスが設定されている記事等はそのライセンスに従います。