委任:複雑さを紐解く

デジタル化を知りたい
先生、『Delegate(デリゲート)』ってプログラミングでよく聞くんですけど、どういう意味ですか?

デジタル化研究家
そうだね。『Delegate(デリゲート)』は、ある特定の処理を他の誰かに『委任する』という意味だよ。例えば、アプリでボタンが押された時の処理を、別のクラスに任せる、といった具合だね。

デジタル化を知りたい
他のクラスに任せる?具体的にどういうことでしょうか?

デジタル化研究家
例えば、ボタンが押されたことを検知する処理はボタンのクラスが持っているけど、押された後にどんな処理をするかは別のクラスが決める、というように役割分担をするんだ。そうすることで、ボタンのクラスはボタンの見た目や動作だけに集中できて、コードが整理されて分かりやすくなるんだよ。
Delegateとは。
『委譲』という用語について説明します。これは、iPhoneなどのアップル社の携帯端末向けアプリをSwiftというプログラミング言語で開発する際によく用いられる、作業を分担させるための手法の一つです。
委任とは

委任とは、ある対象(委任元)が、特定の作業や出来事への対応を別の対象(委任先)に任せる仕組みのことです。ちょうど、担当者が上司に業務を任されるようなイメージです。
例えば、書類作成という作業を任された担当者は、上司の指示に従って書類を作成し、完成した書類を上司に提出します。この時、担当者は書類作成という具体的な作業内容に集中できます。上司は、担当者から提出された書類を確認し、必要に応じて修正を加えたり、承認を与えたりします。このように、作業を任せることで、担当者と上司の役割分担が明確になります。
同じように、計算機の画面に表示されるボタンを例に考えてみましょう。利用者がボタンを押した際に、画面の表示内容を更新する必要があるとします。この時、ボタン自身が表示内容の更新まで行うと、ボタンの役割が複雑になり、処理内容の変更が難しくなります。そこで、ボタンは「ボタンが押された」という出来事を別の対象に知らせ、画面の表示内容の更新はその別の対象に任せます。
このように、委任を用いることで、それぞれの対象の役割を明確にし、作業内容を柔軟に変更できるようになります。また、特定の作業を別の対象に任せることで、同じ処理を複数の場所で簡単に再利用できるようになります。これは、整理された分かりやすい仕組みを作る上で、なくてはならない手法と言えるでしょう。
| 項目 | 説明 | メリット |
|---|---|---|
| 委任とは | ある対象(委任元)が、特定の作業や出来事への対応を別の対象(委任先)に任せる仕組み | 役割分担の明確化、作業内容の柔軟な変更、処理の再利用、整理された分かりやすい仕組み |
| 例1:上司と担当者 | 上司が担当者に書類作成を任せる。担当者は作成に集中し、上司は確認・修正・承認を行う。 | 担当者と上司の役割分担が明確になる。 |
| 例2:ボタンと画面表示 | ボタンは「押された」という出来事を別の対象に知らせ、画面表示の更新は別の対象が行う。 | ボタンの役割が単純になり、処理内容の変更が容易になる。同じ処理(画面更新)を複数のボタンで再利用できる。 |
委任の仕組み

『委任』とは、ある物事の処理を他者に任せる仕組みのことです。これは、プログラムの世界でもよく使われる重要な考え方です。
プログラムにおける委任を実現するには、『約束事』を定めた設計図が必要です。この設計図は『プロトコル』と呼ばれ、委任先にどのような処理を用意するべきかを具体的に示します。委任元は、この約束事に従った処理を持つものを委任先として選び、必要な時に委任先の処理を呼び出します。
委任元と委任先は、この約束事を介してやり取りを行い、連携して作業を進めます。まるで、依頼主と請負業者が契約書に基づいて仕事を進めるようなものです。依頼主は請負業者に作業を依頼し、請負業者は契約内容に従って作業を行い、結果を依頼主に報告します。
この約束事は、処理内容だけでなく、情報のやり取りについても定めます。例えば、依頼主が請負業者に必要な資料を渡したり、請負業者が作業の進捗状況を依頼主に報告したりする際に、どのような形式で情報を受け渡すかを明確に定義します。これにより、委任元と委任先の間で円滑な情報の受け渡しが可能になります。
委任は、様々な場面で活用できる柔軟な仕組みです。例えば、ある動作が発生したことを知らせる通知処理や、必要な情報を取得する処理など、様々な状況で利用できます。これにより、プログラムの構造を整理し、役割分担を明確にすることで、プログラムの保守性や拡張性を高めることができます。まるで、組織の中で各担当者がそれぞれの役割を担うことで、組織全体の効率を高めるように、プログラムも委任によって効率的に動作させることができるのです。

具体的な例

一覧表に情報を表示する場面を考えてみましょう。この時、一覧表は情報を表示する役割を担いますが、表示する情報の具体的な内容は別の担当者に委ねます。この担当者を「情報提供者」と呼ぶことにします。一覧表は、情報提供者に対して「必要な情報の個数」と「情報の内容」を問い合わせます。情報提供者は、一覧表からの問い合わせに応じて、必要な情報を提供する役割を担います。
具体的に見ていきましょう。例えば、商品の一覧表を表示したいとします。この場合、一覧表は情報提供者に対して、「商品の個数は何個ですか?」「一つ目の商品の名前は何ですか?価格はいくらですか?」といった質問を投げかけます。情報提供者は、あらかじめ用意されている商品データに基づいて、これらの質問に答えます。例えば、「商品の個数は10個です」「一つ目の商品の名前はりんごです。価格は100円です」といった具合です。
一覧表は、情報提供者から受け取った情報に基づいて、画面に商品の一覧を表示します。このように、情報の表示と情報の管理を分けることで、表示内容を柔軟に変更することができます。例えば、商品の価格を変更したい場合、情報提供者が持つ商品データだけを更新すれば、一覧表の表示内容も自動的に更新されます。一覧表の表示方法自体を変更する必要はありません。
このように役割分担をすることで、プログラムの変更を最小限に抑えることができます。もし、情報提供者の役割がなかった場合、商品の価格を変更する度に、一覧表の表示方法も変更する必要が出てきます。これは、プログラムの修正範囲が大きくなり、ミスが発生する可能性も高くなることを意味します。役割分担によって、プログラムの保守性を高め、変更に強い仕組みを作ることができるのです。
委任とデータソース

表示の仕組みをうまく作る上で、委任というやり方はデータの出どころを扱う場面でよく使われます。委任とは、ある仕事を他の誰かに任せることです。例えば、お店の店員さんがお客さんの注文を料理人に伝えるように、表示する部品もデータの出どころに情報を聞きに行くのです。
テーブルビューやコレクションビューといった、一覧表示をする部品は、この委任というやり方をうまく使っています。これらの部品は、データの出どころであるデータソースに「データは何個ありますか?」とか「3番目のデータは何ですか?」といった質問をします。データソースは、これらの質問に答えることで、表示する部品にデータを提供する役割を担っています。
データソースを使う大きな利点は、表示の部品とデータの管理を分けることができる点です。料理人と注文を受ける店員さんの役割が違うように、表示の部品は表示の仕方、データソースはデータの管理に集中できます。そうすることで、全体の仕組みが分かりやすくなり、修正や機能追加もしやすくなります。例えば、あるテーブルビューに商品のリストを表示していたとして、設定を変えるだけで顧客のリストを表示するように簡単に変更できます。
データソースは、アプリを様々なデータに対応できるようにする上で重要な役割を担います。もしデータソースを使わずに表示の部品が直接データを読み込んでいたら、データの種類が変わるたびに表示の部品も修正する必要があり、大変な手間がかかります。しかし、データソースを使うことで、表示の部品はそのままで、データソースだけを取り替えることで様々なデータに対応できる柔軟な仕組みを作ることができます。これは、アプリの将来的な改良や変更に対応する上で、非常に役に立ちます。
| 概念 | 説明 | 利点 |
|---|---|---|
| 委任 | ある仕事を他の誰かに任せること。例:お店の店員さんがお客さんの注文を料理人に伝える。表示部品がデータソースにデータを取りに行く。 | 表示の部品とデータの管理を分けることができる。 |
| データソース | データの出どころ。テーブルビューやコレクションビューといった表示部品からの問い合わせに答え、データを提供する。 |
|
| テーブルビュー/コレクションビュー | 一覧表示をする部品。データソースに問い合わせを行いデータを表示する。 | データソースを利用することで、表示とデータ管理を分離し、柔軟な表示を実現。 |
委任の利点

仕事のやり方を他の人に任せることは、多くの良い点があります。これは、物を作る手順をコンピューターに教える時も同じです。
まず、同じ作業を何度も書く必要がなくなります。例えば、書類を印刷する手順を一度作っておけば、それを色んな場所で使うことができます。これは、紙を印刷する部分の作り方を変える時にも役立ちます。もし、印刷のやり方が変わっても、手順を書いた場所を一つだけ直せば、全ての場所で正しく印刷されるようになります。
次に、仕事の役割分担がはっきりします。例えば、ある人は書類を作るのが得意で、別の人は書類を印刷するのが得意だとします。それぞれが得意なことを分担すれば、全体として仕事が早く終わります。コンピューターへの指示も同じで、それぞれの部品が自分の仕事に集中することで、全体としてプログラムが見やすくなり、間違いを減らすことができます。
三つ目に、仕事のやり方を簡単に変えることができます。例えば、いつもは近くの印刷機を使っていたけれど、今日は別の階の印刷機を使いたいとします。仕事のやり方を他の人に任せていれば、「今日は別の印刷機を使ってください」と言うだけで済みます。印刷機の使い方そのものを変える必要はありません。コンピューターへの指示も同じで、部品の役割を変えるだけで、プログラム全体の動きを変えることができます。
最後に、それぞれの部品の関係がシンプルになります。例えば、書類を作る人は、印刷機が具体的にどのように動いているかを知る必要はありません。ただ、「印刷してください」と頼めば良いのです。コンピューターへの指示も同じで、それぞれの部品が他の部品の中身を知らなくても良いようにすることで、一部分を変えた時に他の部分に影響が出にくくなります。これは、大きなプログラムを作る時に特に大切です。小さな変更が全体に影響してしまうと、修正に時間がかかってしまいます。仕事のやり方を他の人に任せることで、このような問題を防ぎ、より早く、より良いプログラムを作ることができます。
| メリット | 人間での例 | コンピュータでの例 |
|---|---|---|
| 作業の効率化 | 書類印刷の手順を一度作れば、色んな場所で使える。印刷方法が変わっても、一箇所修正するだけで済む。 | 同じ作業を何度も書く必要がない。 |
| 役割分担の明確化 | 書類作成と印刷をそれぞれ得意な人が担当することで、全体として仕事が早く終わる。 | それぞれの部品が自分の仕事に集中することで、プログラムが見やすく、間違いが減る。 |
| 変更の容易性 | 別の階の印刷機を使う場合でも、「今日は別の印刷機を使って」と言うだけで済む。 | 部品の役割を変えるだけで、プログラム全体の動きを変えられる。 |
| 関係のシンプル化 | 書類を作る人は印刷機の仕組みを知らなくても「印刷して」と頼むだけで良い。 | それぞれの部品が他の部品の中身を知らないため、一部分の変更が他の部分に影響しにくい。 |
まとめ

委任は、部品化されたプログラム同士を繋ぐ重要な仕組みであり、iPhoneなどの携帯端末向け応用ソフト作りにおいて、なくてはならない設計手法の一つです。これは、ある部品が特定の仕事を他の部品に任せるという考え方で、部品同士の結びつきを緩くすることで、プログラムの再利用性と維持管理のしやすさを高める効果があります。
例えるなら、料理の注文を考えてみましょう。お客である部品Aは、料理人である部品Bに直接注文するのではなく、ウェイターである委任部品を通して注文します。ウェイターは注文内容を料理人に伝え、料理が出来上がるとお客に届けます。この時、お客は料理人が誰であるか、どのように料理を作るのかを知る必要はありません。ウェイターが間に入ることで、お客と料理人は互いに独立して仕事ができます。
委任を実現する手段として、『約束事』を意味する『プロトコル』という仕組みが用いられます。これは、部品同士がどのような情報をやり取りするかを定めた約束事です。お客とウェイター、ウェイターと料理人の間で、それぞれ注文内容や料理の提供方法といった約束事が決まっているからこそ、スムーズな連携が可能になります。
委任は、複雑な処理を整理し、分かりやすいプログラムを書く上で不可欠な手法です。初心者にとっては理解が難しい概念かもしれませんが、携帯端末向け応用ソフト開発では至る所で活用されています。委任をしっかりと理解することで、より高度な応用ソフト作りが可能になります。ぜひ、委任という設計手法を積極的に活用し、質の高いiPhone応用ソフト開発を目指してください。
