僕,そういうのってちゃんと勉強したことないんですよね......デザインパターンとか難しく考える必要はないさ。たしかにデザインパターンみたいな有名な設計技法はいろいろあるけど,もっと基本的な方針から身につけることが大事だよ。それのことだよ大きな実装は適切な粒度に分割しよう放っておくと実装は肥大化するプログラムを開発していると,関数やクラスなどの実装がどんどん肥大化していくことがあります。Interface)(⁠注1)を非表示にしたあと,すべての受信サーバへの認証を試行して,認証に成功した場合だけUIを再表示する(1つでも認証に失敗したサーバがあればThunderbirdを終了する⁠)⁠」⁠,というアドオンtb-force-auth-at-startupの実装例です。ここでは実装の詳細は気にせずに,それぞれの個所が何をしているのかを示したコメントだけを追ってください。}};リスト1の実装は,1モジュール・1メソッドだけで完結しています。単純に行数や文字数だけを見て,これを「コンパクトな実装」と思う人もいるかもしれません。,「⁠UIの操作」「⁠受信サーバの認証処理」といった複数の領域に渡る処理がほぼそのまま1ヵ所に詰め込まれていて,機能追加や修正のための変更が非常にしにくい状態になっており,実際は,肥大化した複雑な実装と言えます。複雑な実装ではプログラム全体が密に絡み合っていて,要件が少し変わっただけで全体を丸ごと作りなおさないといけないこともあります。バグの温床になりやすく,障害が発生したときの原因究明も難しいです。複雑な実装は,中・長期的に見るとメリットよりもデメリットのほうが大きいのです。思いつくまま作業を進めた場合や,手探りで実装していった場合には,このようなことになってしまいがちです。細部にわたって事前に完璧な設計を行っておくのはまず不可能ですから,このような実装が突発的に生まれてしまうことは珍しくありません。このような肥大化した実装をより良い設計に改める方法としては,問題の切り分けと,クラスやモジュール,メソッドといった各レベルでの実装の切り分けが有効です。段階を踏んで見ていきましょう。注1)ここでは,ツールバーやボタン,メール一覧など,ユーザの目に見える部分を指します。解決しようとしている問題を切り分けようプログラムの中での実装の単位の大きさは,粒度という言葉で表されます。リスト1のような複雑な実装は「粒度が大きい」と言われ,1メソッドが数行程度であるような単純な実装は「粒度が小さい」と言われます(注2⁠)⁠。プログラム全体としては大規模でも,個々のモジュールなどの粒度が適切な実装は,機能追加や変更がしやすく,障害があったときにも修正しやすいです。単純にコードを一定の行数でバラバラに分けたりまとめたりすればよいというものでもありません。実装の大きさは,解決しようとしている問題の大きさと強く結びついています。実装を適切な粒度にするためには,解決したい問題をよく分析して,小さな問題の集合としてとらえなおす必要があります。このような作業を問題の切り分けと言います。初級者と中・上級者の最大の違いは,ここにあります。初級者は目の前にある問題をその形のまま解決しようとしがちですが,1人の人間が解決できる問題の大きさには限りがあります。そのため個人の許容量を超える大きさの問題が降ってくるとお手上げになってしまいます。問題の切り分けができる中・上級者は,そのような大きく複雑な問題を咀嚼(そしゃく)して,自分の理解できる単位にまで小さく切り分けます。することで,複雑な問題でも解決の道筋を見つけることができるのです(図1⁠)⁠。一見すると複雑な問題も,切り分けると単純な問題になる問題を切り分ける基準としてわかりやすいのは,特に目立つキーワードです。先の例で挙げたThunderbirdアドオンが解決しようとしている問題であれば,「⁠起動時」「⁠UI」「⁠認証」などがキーワードでしょう。これらを軸にすると次のように問題を切り分けられます。Thunderbirdの起動時に全体の処理を開始するUIの状態を変える(表示・非表示の切り替え,終了など)受信サーバで認証する(認証を試行して,成功したか失敗したか判断する)注2)絶対的な指標ではなく,相対的な大小を言い表す言葉です。エンジニア著者プロフィール結城洋志(ゆうきひろし)株式会社クリアコード所属。Firefox黎明期からアドオン開発を手がけ,業務上もMozilla製品の技術サポートを担当。代表作は「ツリー型タブ」「テキストリンクなど。日経Linux誌にて「シス管系女子」を連載中。2019」を開催しました。DAY1・DAY2の様子を注目セッションとともにお伝えします。LINEのエンジニア3名がイベントに先駆けて見どころを紹介します。コードの安全性・安定性を高める開発サイクル~テスト管理の効率を上げ,脆弱性診断を自動で行う~本連載では,連載「業務を改善する情報共有の仕掛け」を受けつつ,安全性・安定性を加えた開発サイクルについて考えていきます。若者世代から圧倒的な人気を誇るライブ配信&動画投稿コミュニティアプリ「MixChannel」(ミクチャ)の裏側(レコメンドシステムやサーバサイド開発など)について解説していきます。その他の連載CSS3アニメーションでつくるインターフェイス表現CSS3によるアニメーション表現を紹介していきます。その中でも,幅広い読者に応用してもらえるだろうインターフェイスを主なお題とします。MySQL道普請便り本連載では,MySQLを使ったアプリ開発・運用に関するノウハウをご紹介していきます。RecipeUbuntuの強力なデスクトップ機能を活用するための,いろいろなレシピをお届けします。JavaScriptセキュリティの基礎知識JavaScriptに関するセキュリティ上の問題はどこで発生し,どうすれば防ぐことができるのか?について解説していきます。〜システムをきちんと運用するための基礎知識システムは「作って終わり」ではなく,運用の中でさまざまな問題が発生します。問題の発生に備えて事前にどのような対応をしておくべきなのか,問題発生時に何をしなければならないのか,ポイントを解説していきます。きたみりゅうじの聞かせて珍プレーソフトウェア開発の現場で体験したトホホな失敗,思わずうなる珍プレーをきたみりゅうじ氏が四コママンガで紹介。Linuxのメンテナンスの傍ら,Linuxやオープンソースソフトと日々を過ごす著者が,その魅力とつきあい方を,エッセイ風味でお届けします。PRESS特別編集部員,さわやか笑顔のスーパーハカーはまちちゃんとネット大好き14歳わかばちゃんが,毎号,読者の皆さんから寄せられたおたよりを紹介します。皆さんの日頃の悩みにも答えちゃいますよ。]メールでのお知らせメールで次の案内をお送りしております。メールの配信を希望する方は,利用したい項目をチェックしてメールアドレスを入力し,[登録]ボタンをクリックしてください。UPDATES[ほぼ週間に1回]新刊メールマガジン[ほぼ週間に1回]電脳会議の各号案内[ほぼ1ヵ月半に1回]※変更する場合や停止する場合は,登録情報変更ページをご覧ください。※登録いただいたメールアドレスには,そのお知らせ以外,配信いたしません。Ltd.ページ内容の全部あるいは一部を無断で利用することを禁止します。個別にライセンスが設定されている記事等はそのライセンスに従います。