本連載が書籍化されました。978-4-7741-4596-9はじめに「良いコード」をテーマにお送りしてきた本連載も,いよいよ最終回です。今回のテーマは「配列/コレクションを利用した抽象化」です。内容としては初歩的で当たり前過ぎるものですが,初心者の人はあまり意識的でなかったり,理解が足りていないことが多い部分でもあります。今回は連載に彩りを与えてくれたあの3人に,ペアプログラミングならぬトリオプログラミングで楽しく進行してもらいます。それではさっそく始めましょう。配列/コレクションって何?配列とコレクションはどちらもオブジェクトの集合(リスト)を格納・管理できる入れ物(コンテナとも呼ばれます)です。どちらもfor文などを使い,要素を繰り返し操作していくことができます。配列とコレクションは似ていますが,Javaでは別物です(注1⁠)⁠。配列はコレクションと比べると「大きさを簡単に変更できない」「⁠集合を操作するAPIが貧弱」など制限が大きいのですが,コレクションより高速という特徴があります。配列を使った代表的なコードは次のようになります。1.2から追加されたコレクションAPIのことを意味します(注2⁠)⁠。配列と比べると統一的な操作用のAPIがそろっていてたいへん扱いやすいです。コレクションAPIの代表的なインタフェースとしては,Map,List,Setなどがあります。コレクションを使った代表的なコードは次のようになります。System.out.println(name);}使い分けとしては,集合の大きさが最初から決まっていてあとから変わらないのであれば配列を使うのが良いでしょう。それ以外では,目的に応じてコレクションAPIのいずれかのインタフェースを実装したクラスを利用します。注1)RubyやJavaScriptなどの配列はコレクションとしての特性を持っていて,特に区別されません。1.2のコレクションAPIを理解する」(⁠オブジェクト倶楽部)も参照してください。配列/コレクションを利用した抽象化とは?似たような処理を何度も実行する必要があるときに,ベタに書くと次のような疑似コードになることが多いのではないでしょうか。:似た処理を100件実行したい場合は,このようなコードが100回分続きます。ふぅ,考えただけで大変そうですね。コード量もかなりのものになりますし,メンテナンス性も悪く,バグを生みやすくなります。ベタに書いた場合,処理1と処理2は「必要なデータの違い」「⁠部分的な処理の違い」など些細な部分が異なるだけで,基本的な処理の構造や内容はほとんど同じになることが多いでしょう。それらの違いの部分だけをうまいこと「配列/コレクション」として抜き出しておき,共通部分の処理をループで回しながら実行することで,簡潔に処理を書くことができるようになります。ループ構造に書き換えた場合,次のような疑似コードができあがります。処理B}これは,「⁠違いの部分を配列/コレクションとして抽出した」と言うこともできますし,「⁠共通処理を抽象化して括り出した」と言うこともできます。視点が異なるだけでどちらも同じことを指しています。配列/コレクション化してループで一気に処理を実行することで,次のメリットが生まれます。重複する処理が減りバグが生まれにくい重複するコードは共通部分としてまとめられるので,些細なコピー&ペーストミスなどが起きにくい全体に影響する機能追加や修正を簡単に行える共通の処理はループ内にまとめてあるので,全体に影響する機能追加はここで一括して行える。個別に違う部分への対応は,ループ内でif文などを使用してアドホック(その場限り)に対応するか,それぞれの処理オブジェクトが処理の違いを保持して実現するなどの方法で対応する(注3)処理対象が増えてもコードはほとんど増えない10件でも1,000件でもコード量はほとんど変わらないデメリットとしては,想定している抽象化のポイントを間違えると痛い目にあうという点があります。こちらに関してはまたあとで詳しく考察します。Excelを使ったDSLを作ろう」では,ストラテジパターンを使って処理の違いを実現しています。合わせて参照してください。抽象化はお好き?それでは,毎回好例になりました,代表者の人に「配列/コレクションを使った抽象化」についてのご意見をいただきましょう。初級~中級のプログラマ達人プログラマ連載最終回にしてはじめて中級プログラマが謙虚さを見せていますね。いろいろな失敗を通して成長したんでしょう,すばらしいことです。普通のプログラマが言っている「連番付き変数」に似た例はこのあとのお題でも取り上げています。それでは,いよいよお題と実際のリファクタリングの過程を見ていきましょう。著者プロフィール縣俊貴(あがたとしたか)学生時代にMSXで制限された環境でのプログラミングの楽しさを学ぶ。以来,オープンソースのWiki実装「MobWiki」の開発や受託開発などを経て,現在はプロジェクト管理ツール「Backlog」,ドローツール「Cacoo」など,コラボレーション型のWebサービスの企画と製品開発を行う。2019」を開催しました。DAY1・DAY2の様子を注目セッションとともにお伝えします。LINEのエンジニア3名がイベントに先駆けて見どころを紹介します。コードの安全性・安定性を高める開発サイクル~テスト管理の効率を上げ,脆弱性診断を自動で行う~本連載では,連載「業務を改善する情報共有の仕掛け」を受けつつ,安全性・安定性を加えた開発サイクルについて考えていきます。若者世代から圧倒的な人気を誇るライブ配信&動画投稿コミュニティアプリ「MixChannel」(ミクチャ)の裏側(レコメンドシステムやサーバサイド開発など)について解説していきます。その他の連載CSS3アニメーションでつくるインターフェイス表現CSS3によるアニメーション表現を紹介していきます。その中でも,幅広い読者に応用してもらえるだろうインターフェイスを主なお題とします。MySQL道普請便り本連載では,MySQLを使ったアプリ開発・運用に関するノウハウをご紹介していきます。RecipeUbuntuの強力なデスクトップ機能を活用するための,いろいろなレシピをお届けします。JavaScriptセキュリティの基礎知識JavaScriptに関するセキュリティ上の問題はどこで発生し,どうすれば防ぐことができるのか?について解説していきます。〜システムをきちんと運用するための基礎知識システムは「作って終わり」ではなく,運用の中でさまざまな問題が発生します。問題の発生に備えて事前にどのような対応をしておくべきなのか,問題発生時に何をしなければならないのか,ポイントを解説していきます。きたみりゅうじの聞かせて珍プレーソフトウェア開発の現場で体験したトホホな失敗,思わずうなる珍プレーをきたみりゅうじ氏が四コママンガで紹介。Linuxのメンテナンスの傍ら,Linuxやオープンソースソフトと日々を過ごす著者が,その魅力とつきあい方を,エッセイ風味でお届けします。PRESS特別編集部員,さわやか笑顔のスーパーハカーはまちちゃんとネット大好き14歳わかばちゃんが,毎号,読者の皆さんから寄せられたおたよりを紹介します。皆さんの日頃の悩みにも答えちゃいますよ。]メールでのお知らせメールで次の案内をお送りしております。メールの配信を希望する方は,利用したい項目をチェックしてメールアドレスを入力し,[登録]ボタンをクリックしてください。UPDATES[ほぼ週間に1回]新刊メールマガジン[ほぼ週間に1回]電脳会議の各号案内[ほぼ1ヵ月半に1回]※変更する場合や停止する場合は,登録情報変更ページをご覧ください。※登録いただいたメールアドレスには,そのお知らせ以外,配信いたしません。Ltd.ページ内容の全部あるいは一部を無断で利用することを禁止します。個別にライセンスが設定されている記事等はそのライセンスに従います。