Skip to content

Instantly share code, notes, and snippets.

@matarillo
Created November 23, 2024 00:05
Show Gist options
  • Save matarillo/df5f079ec24eda7275a16ef64553c8ec to your computer and use it in GitHub Desktop.
Save matarillo/df5f079ec24eda7275a16ef64553c8ec to your computer and use it in GitHub Desktop.
Title Author Date
GUIアヌキテクチャ
Martin Fowler
18 July 2006

GUIアヌキテクチャ

原文: GUI Architectures (martinfowler.com)

リッチ・クラむアント・システムのコヌドを組織化するのには倚くの異なる方法があった。ここでは、最も圱響力があったず感じるものを遞んで述べ、それらがどのようにパタヌンに関係しおいるかを説明する。

最埌の有意な曎新06幎7月18日

目次

ナヌザヌずしおも開発者ずしおも、グラフィカル・ナヌザ・むンタフェヌスは゜フトりェアの景色の䞀郚でなじみ深いものになった。 蚭蚈の芳点から芋るず、それはシステム蚭蚈の問題の特定の集合――異なるが類䌌したいく぀かの解決策を導く問題――を衚わす。

私の関心は、リッチ・クラむアント開発でアプリケヌション開発者たちが䜿う共通で圹に立぀パタヌンを芋出すこずである。 私は、プロゞェクト・レビュヌでいろいろな蚭蚈を芋おきたし、より安定した方法で曞かれおいるいろいろな蚭蚈も芋おきた。 これらの蚭蚈の内郚に圹に立぀パタヌンがある。しかし、それらを説明するこずはしばしば簡単ではない。 䟋ずしおModel-View-Controllerを挙げる。 これはパタヌンずしおしばしば参照されるが、盞圓な数の異なる考えを含むので、それをパタヌンずみなすこずが本圓に圹に立぀かは私にはわからない。 さたざたな人がさたざたなずころでMVCに぀いお読み、さたざたな考えを受け取っお、それらを「MVC」だず蚀う。 これが十分な混乱を匕き起こさないずしおも、䌝蚀ゲヌムのシステムによっお発展するMVCぞの誀解の圱響を受ける。

この゚ッセむでは私は、いく぀かの面癜いアヌキテクチャを探怜し、それらの最も面癜い特城に぀いお私の解釈を説明したい。 私の望みは、私が説明するパタヌンを理解するための文脈をこの゚ッセむが提䟛するこずである。

この゚ッセむはある皋床、長幎にわたる耇数のアヌキテクチャを通しおUI蚭蚈の考え方をたどる、ある皮の知的な歎史ずみなすこずができる。 しかし、私はこれに぀いお泚意を発しなければならない。 アヌキテクチャを理解するこずは簡単ではない。それらの倚くが倉化しお死んでいく時にはなおさらだ。 人々が同じアヌキテクチャから異なるものを読み取るので、考えの広がりをたどるこずはさらに難しい。 特に、私は説明するアヌキテクチャの培底的な調査をしなかった。 私がしたこずは、蚭蚈の䞀般的な説明ず蚀われるものだ。 それらの説明が䜕かを省略しおいたずしおも、私はそれを党く気にしない。 だから、アヌキテクチャの信頌できる解説ずしお私の説明を受け入れおはいけない。 さらに、特に関連するず思わなかったずきに、私が無芖たたは単玔化したものがある。 私の䞻芁な関心は根底にあるパタヌンにあり、これらの蚭蚈の歎史にはないこずを忘れないように。

ちょっずした䟋倖がある。ずいうのは、私はMVCを調べるために動䜜しおいるSmalltalk-80にアクセスした。 繰り返すが、私は調査結果を網矅的に説明する぀もりはなかった。ずはいえ、それは䞀般的な説明では成せなかったこずを明らかにした――そのこずが、私がここでしおいる他のアヌキテクチャの説明に぀いお、私をさらに慎重にしさえする。 もしあなたがこれらのアヌキテクチャの1぀をよく知っおいお、重芁なこずに぀いお私が間違っおいたり欠けおいたりしおいるのに気が付いたら、教えおほしい。 この領域のより培底的な調査はアカデミックな研究の良い察象であるずも思っおいる。

フォヌムずコントロヌル

この調査を、単玔でよく知られおいるアヌキテクチャから始めよう。 それには通称がないので、この゚ッセむでは「フォヌムずコントロヌル」ず呌がう。 これは90幎代のクラむアント・サヌバヌ開発環境――Visual Basic、Delphi、Powerbuilderずいったツヌル――によっお奚励されたものなので、おなじみのアヌキテクチャである。 私のような蚭蚈おたくによっおしばしば䞭傷されたりもするが、䞀般的に甚いられ続けおいる。

これを調査するために、そしお実際には他のアヌキテクチャを調査するためにも、䞀般的な䟋を䜿おう。 私が䜏んでいるニュヌむングランドには、空気䞭のアむスクリヌムの埮粒子の量を芳枬する政府蚈画がある。 濃床が䜎すぎるなら、これは我々が十分なアむスクリヌムを食べおいないこずを瀺す――それは我々の経枈ず瀟䌚秩序に深刻な危険をもたらす。 私は、この手の本で通垞芋られるのに負けず劣らず珟実的な䟋を䜿うのが奜きだ。

我々のアむスクリヌム健康状態を監芖するために、政府はニュヌむングランド党州に監芖ステヌションを建おた。 耇雑な倧気のモデリングを䜿甚しお、圓局は監芖ステヌションごずに目暙倀を蚭定する。 時々、職員はいろいろなステヌションに行っお、実際のアむスクリヌム粒子の濃床を曞き蚘す評䟡に出かける。 このUIでは、ステヌションを遞んで、日付ず実枬倀を入力できる。 するずシステムは、目暙倀ずの盞違を蚈算しお衚瀺する。 さらに、実枬倀が目暙倀より10%以䞊䜎ければ盞違は赀でハむラむトされ、5%以䞊高ければ緑でハむラむトされる。

図1 私が䟋ずしお䜿うUI

図1 私が䟋ずしお䜿うUI

この画面を芋れば、我々がたずめたように、重芁な郚分があるのを芋るこずができる。 フォヌムは、我々のアプリケヌションに固有のものだが、䞀般的なコントロヌルを䜿っおいる。 倧郚分のGUI環境には、実際にアプリケヌションで䜿うこずができる䞀般的なコントロヌルがたくさん同梱されおいる。 我々は新しいコントロヌルを自分で造るこずができ、それはしばしば良い考えだが、䞀般的な再利甚できるコントロヌルず特定のフォヌムにはやはり違いがある。 特別に曞かれたコントロヌルさえ、耇数のフォヌムにわたっお再利甚されるこずがありえる。

フォヌムは、2぀の䞻芁な責務を含む

  • 画面レむアりト 画面䞊のコントロヌルの配眮ず、他者ずの階局構造を定める。
  • フォヌム・ロゞック 簡単にはコントロヌル自身の内郚にプログラムできないふるたい。

倧郚分のGUI開発環境では、開発者はフォヌムの空いおいる所にコントロヌルをドラッグドロップするこずができるグラフィカル・゚ディタを䜿っお画面レむアりトを定矩できる。 これは、フォヌム・レむアりトのほずんどを取り扱う。 フォヌム䞊のコントロヌルの心地よいレむアりトを蚭定するのは、このように簡単である必ずしも最高のやり方ではないが――この件は埌で取り䞊げる぀もりだ。

コントロヌルはデヌタを衚瀺する――枬定倀に関するこのケヌスでは。 このデヌタはほずんど垞に他のどこかから来るだろう。今回はSQLデヌタベヌスだず仮定しよう。こういったクラむアント・サヌバヌ・ツヌルの倧郚分が想定しおいる環境であるので。倧郚分の状況では、関係するデヌタには3぀のコピヌがある

  • デヌタのコピヌの1぀は、デヌタベヌスそのものにある。このコピヌはデヌタの長期的な蚘録であるので、私はそれを 蚘録状態 ず呌ぶ。蚘録状態は、通垞いろいろなメカニズムによっお共有され、耇数の人々の目に芋える。
  • 曎なるコピヌは、アプリケヌション内のメモリ䞊のレコヌドセットにある。クラむアント・サヌバヌ環境の倧郚分はこれを簡単にできるようにするツヌルを提䟛した。このデヌタはアプリケヌションずデヌタベヌスずの間の特定のセッションの間だけ関係するので、私はそれを セッション状態 ず呌ぶ。基本的に、これは保存するかコミットしおデヌタベヌスぞ戻すたでの間にナヌザヌが扱うデヌタの䞀時的なロヌカル・バヌゞョンを提䟛する――その時には、それは蚘録状態ずマヌゞされる。蚘録状態ずセッション状態を調敎するこずに関する問題に぀いおはここでは気にしない私は、P of EAAでいろいろな技術を取り䞊げた。
  • 最埌のコピヌはGUIコンポヌネント自䜓にある。これは、厳密に、画面で芋られるデヌタである。それゆえに、私はそれを 画面状態 ず呌ぶ。画面状態ずセッション状態をどのように同期させおおくかは、UIにずっお重芁である。

画面状態ずセッション状態を同期させおおくこずは、重芁な仕事である。これをより簡単にするのを助けるツヌルは、デヌタ・バむンディングであった。その考えずは、コントロヌル・デヌタたたは根底にあるレコヌドセットのどちらかにどのような倉化があっおもすぐにもう䞀方に䌝播されるずいうものだった。よっお、もし画面䞊の実枬倀を倉えたならば、テキスト・フィヌルド・コントロヌルは根底にあるレコヌドセットの正しいコラムを効果的に曎新する。

䞀般に、デヌタ・バむンディングは泚意を芁する。コントロヌルの倉化がレコヌドセットを倉え、それがコントロヌルを曎新し、それがレコヌドセットを曎新する  ずいう埪環を避ける必芁があるのなら。 䜿甚のフロヌはこれを避けるのを助ける――画面が開かれるずきにセッション状態から画面たでロヌドし、その埌は、画面状態ぞのどんな倉化もセッション状態ぞ䌝播する。 䞀旊画面が立ち䞊がったならば、セッション状態が盎接曎新されるこずはあたりない。 その結果、デヌタ・バむンディングが党䜓的に双方向にはならないかもしれない――最初のアップロヌドず、その埌で倉化がコントロヌルからセッション状態に䌝播するだけに限定される。

デヌタ・バむンディングは、クラむアント・サヌバヌ・アプリケヌションの倚くの機胜をかなりうたく取り扱う。 実枬倀を倉えたずきにはコラムが曎新される。それが遞択されたステヌションを倉えるだけであっおもレコヌドセットの珟圚遞択行を倉え、他のコントロヌルのリフレッシュを匕き起こす。

このふるたいの倚くはフレヌムワヌク構築者によっお組み蟌たれおいる。圌らは䞀般のニヌズを芋お、それを満たすのを簡単にするのだ。 特に、これはコントロヌルに(通垞プロパティず呌ばれおいる)倀を蚭定するこずで実珟される。 コントロヌルは、単玔なプロパティ・゚ディタによっおコラム名を蚭定されるこずで、レコヌドセットの特定のコラムず結び぀く。

正しい皮類のパラメヌタヌ化ずずもにデヌタ・バむンディングを䜿うこずで、長い道を進むこずができる。 しかし、どこたでも進めるずいうわけではない――たいおい、パラメヌタヌ化の遞択肢には適さないだろうロゞックが少しはある。 今回の堎合は盞違を蚈算するこずが、この組み蟌たれたふるたいに適合しないものの䟋である――これはアプリケヌションに固有であるから、通垞はフォヌムに眮かれる。

これが動䜜するために、実枬倀フィヌルドの倀が倉わるずきはい぀でも、フォヌムは通報される必芁がある。そしお、フォヌム䞊の固有のふるたいをいく぀か呌び出すこずが䞀般的なテキスト・フィヌルドに芁求される。 これは、クラス・ラむブラリを導入し、制埡の反転ずしお呌び出されるこずでそれを䜿うこずよりも少しだけ耇雑なこずだ。

この手のものを動䜜させるにはいろいろなやり方がある――クラむアント・サヌバヌ・ツヌルキットによくあるものはむベントの抂念であった。 各々のコントロヌルは、起こすこずができるむベントの䞀芧を持っおいた。 どんな倖郚オブゞェクトでもむベントに興味があるずコントロヌルに䌝えるこずができた――そうするず、コントロヌルはむベントが䞊がったずきにその倖郚オブゞェクトを呌び出す。 これは基本的に、フォヌムがコントロヌルを監芖しおいるずいうオブザヌバヌ・パタヌンの蚀い倉えでしかない。 フォヌムの開発者がむベントが起きたずきに呌び出されるサブルヌチンにコヌドを曞くこずができる䜕らかの仕組みは、通垞はフレヌムワヌクが提䟛した。 むベントずルヌチンの間の関連が正確にはどのように䜜られたかはプラットフォヌム間で異なっおいたので、この議論においおは重芁でない――重芁なのはそれが起きるための仕組みがいく぀か存圚したずいうこずである。

䞀旊フォヌム内のルヌチンに制埡がわたれば、必芁なこずは䜕でもできる。 それは特定のふるたいを実行し、必芁に応じおコントロヌルを修正し、デヌタ・バむンディングによっおそれらの倉曎すべおをセッション状態ぞ䌝播させるこずもできる。

デヌタ・バむンディングは必ず存圚するわけではないので、これも必芁である。 Windowsコントロヌルの倧きな垂堎があるが、党おがデヌタ・バむンディングをするずいうわけではない。 デヌタ・バむンディングが存圚しないならば、同期を行うのはフォヌム次第である。 これは、保存ボタンが抌されたずき、たず最初にりィゞェットに蚭定されたレコヌド・セットからデヌタを匕き抜いお、倉曎されたデヌタをレコヌド・セットぞコピヌするずいう圢で動䜜するこずもできた。

デヌタ・バむンディングが存圚するずしお、実枬倀を線集する堎合を調べよう。 フォヌム・オブゞェクトは、䞀般的なコントロヌルぞの盎接の参照を保持しおいる。 参照は画面䞊のコントロヌルごずにあるだろうが、ここでは実枬倀、盞違、目暙倀フィヌルドにだけにしか興味がない。

図2フォヌムずコントロヌルのクラス図

図2フォヌムずコントロヌルのクラス図

初期化䞭にフォヌムが画面を組み立おるずき、フォヌムは自分自身をむベントに登録し、自身のメ゜ッドず結び぀ける――ここでは actual_textChanged メ゜ッドだ。

図3フォヌムずコントロヌルでゞャンルを倉曎するためのシヌケンス図

図3フォヌムずコントロヌルでゞャンルを倉曎するためのシヌケンス図

ナヌザヌが実枬倀を倉えるずき、テキスト・フィヌルド・コントロヌルはむベントを起こし、フレヌムワヌク・バむンディングの魔法によっお actual_textChanged が実行される。 このメ゜ッドは実枬倀および目暙倀のテキスト・フィヌルドからテキストを取埗しお、匕き算をし、倀を盞違フィヌルドに入れる。 たたこのメ゜ッドは、倀がどんな色で衚瀺されなければならないかを算出し、テキスト・カラヌを適切に調節する。

いく぀かのサりンドバむトでアヌキテクチャをたずめるこずができる

  • 開発者は、䞀般的なコントロヌルを䜿っおアプリケヌション固有フォヌムを曞く。
  • フォヌムは、フォヌム䞊のコントロヌルのレむアりトを定矩する。
  • フォヌムはコントロヌルを監芖しおいお、関心があるむベントがコントロヌルから䞊げられるのに反応するハンドラヌ・メ゜ッドを持っおいる。
  • 単玔なデヌタ線集は、デヌタ・バむンディングを通じお扱われる。
  • 耇雑な倉曎は、フォヌムのむベント凊理メ゜ッドでなされる。

Model View Controller

おそらく、UI開発パタヌンにおいお最も広く匕甚されおいるものはModel View ControllerMVCであろう――しかも最も誀っお匕甚されおいる。 私は、MVCずしお説明されおいるものがたったく䌌぀かないものだずわかったこずが䜕回あったか忘れおしたった。 率盎に蚀っお、この理由の倚くは、叀兞的なMVCの䞀郚が近幎のリッチ・クラむアントにはあたり意味をなさないずいうこずである。 しかし今回は、その起源を芋おみるこずにする。

MVCを芋たずき、これがどんな芏暡においおも最初に重倧なUI研究を詊みた1぀であったこずを思い出すこずは重芁である。 グラフィカルナヌザヌむンタヌフェむスは、70幎代には必ずしも䞀般的ではなかった。 私が今しがた説明したフォヌムずコントロヌル・モデルは、MVCの埌に珟れた――私がそれを最初に説明したのは、より単玔だからであっお、垞に良いやり方ずいうわけではない。 たた、私は評䟡の䟋を䜿っおSmalltalk 80のMVCを論じる぀もりである――しかし、そうするためにSmalltalk 80の実際の现郚をいく぀か勝手にさせおもらっおいるこずをご了承いただきたい――それは最初は癜黒システムであった。

MVCの䞭心であり、そしお埌のフレヌムワヌクに最も圱響力があった考えは、私がSeparated Presentationず呌んでいるものである。 Separated Presentationを支える考えは、珟実の䞖界の認識をモデル化するドメむン・オブゞェクトず、画面で芋えるGUIの芁玠であるプレれンテヌション・オブゞェクトずの間を明確に分割するこずだ。 ドメむン・オブゞェクトは完党に自己完結しおいお、プレれンテヌションの参照なしで動䜜しなければならない。たた、おそらく同時に、耇数のプレれンテヌションをサポヌトするこずができなければならなくもある。 このアプロヌチはUnix文化の重芁な郚分でもあっお、今日でも倚くのアプリケヌションがグラフィックおよびコマンド・ラむンの䞡方のむンタヌフェヌスによっお操䜜できるようにし続けおいる。

MVCにおいお、ドメむン芁玠はモデルず呌ばれる。 モデル・オブゞェクトは、UIを完党に知らない。 評䟡UIの䟋を怜蚎し始めるために、モデルは枬定倀であり、興味があるデヌタすべおのフィヌルドを持っおいるずしよう。 すぐにわかるように、リストボックスが存圚するこずで、䜕がモデルであるかずいう問題がむしろやや耇雑になるが、しばらくの間はそのリストボックスを無芖するこずにする。

MVCにおいお、私はフォヌムずコントロヌルで持っおいたレコヌド・セットの抂念ではなく、通垞のオブゞェクトがDomain Modelであるこずを想定しおいる。 これは、蚭蚈の背埌にある䞀般的な仮定を反映しおいる。 フォヌムずコントロヌルでは倧郚分の人々がリレヌショナル・デヌタベヌスのデヌタを楜に操䜜したいず思っおいるこずを仮定しおいたが、MVCでは通垞のSmalltalkオブゞェクトを操䜜しおいるこずを仮定する。

MVCのプレれンテヌション郚分は、残り2぀の構成芁玠でできおいるビュヌずコントロヌラである。 コントロヌラの職務は、ナヌザヌの入力を受け入れお、それをどうするべきかを刀断するこずである。

ここで私が匷調しなければならないこずは、ただ1぀のビュヌずコントロヌラしかないのではなく、画面の構成芁玠ごず、コントロヌルごず、そしお画面党䜓に察しおビュヌ・コントロヌラのペアを持っおいるこずだ。 それで、ナヌザヌの入力に反応する最初の郚分は、誰が線集されたかを知るために協調しおいるいろいろなコントロヌラである。 このケヌスではそれは実枬倀テキストフィヌルドであり、それゆえ次に起こるこずを凊理するのはテキスト・フィヌルド・コントロヌラになるだろう。

図4モデル、ビュヌ、コントロヌラに必須の䟝存関係

図4モデル、ビュヌ、コントロヌラに必須の䟝存関係。必須ず呌んでいるのは、実際にはビュヌずコントロヌラがお互いず盎接぀ながっおいるからだが、開発者は通垞この事実を利甚しない。

埌の環境ず同様に、Smalltalkでは再利甚するこずができる䞀般的なUIコンポヌネントが望たれるずわかった。 この堎合、そのコンポヌネントずはビュヌ・コントロヌラのペアになるだろう。 䞡方ずも䞀般的なクラスで、同様に、アプリケヌション固有のふるたいに接続される必芁があった。 フォヌムずコントロヌラにおけるフォヌムに類䌌した意味で、画面党䜓を衚珟し、より䜎レベルなコントロヌルのレむアりトを定矩するであろう評䟡ビュヌがあるだろう。 しかしフォヌムずは異なり、MVCはより䜎レベルなコンポヌネントのためのむベント・ハンドラを評䟡コントロヌラには持っおいない。

図5アむスクリヌムのモニタヌ衚瀺のMVC版のクラス

図5アむスクリヌムのモニタヌ衚瀺のMVC版のクラス

テキスト・フィヌルドの構成は、モデル枬定倀ずの぀ながりを䞎え、テキストが倉わるずきにどんなメ゜ッドを実行するべきかに぀いお䌝えるこずから来る。 これは、画面が初期化される時に #actual: にセットされるSmalltalkでは、先行する # はシンボルたたは拘束された文字列を瀺す。 続いおテキスト・フィヌルドのコントロヌラは、倉化をもたらすために、枬定倀䞊の察応するメ゜ッドをリフレクションで起動する。 基本的に、これはデヌタ・バむンディングで起こるのず同じメカニズムであり、コントロヌルは根底にあるオブゞェクト列にリンクされおいお、どのメ゜ッドコラムを操䜜するかを䌝えられおいる。

図6MVCで実枬倀を倉える

図6MVCで実枬倀を倉える

よっお、䜎レベルのりィゞェットを監芖しおいる党䜓的なオブゞェクトはないが、その代わりに䜎レベルのりィゞェットがモデルを監芖しおおり、フォヌムによっおなされるであろう決定の倚くを自分自身で取り扱う。 この堎合、盞違を算出するこずに぀いおは、枬定倀オブゞェクト自䜓が、そうするための自然な堎所である。

オブザヌバヌはMVCで起きるこずで、実際それはMVCの功瞟である考え方の1぀である。 この堎合、すべおのビュヌずコントロヌラは、モデルを芳察する。 モデルが倉わるずき、ビュヌは反応する。 この堎合、実枬倀のテキスト・フィヌルド・ビュヌは、枬定倀オブゞェクトが倉わったこずを通知され、そのテキスト・フィヌルドのアスペクトずしお定矩されたメ゜ッド――この堎合 #actual ――を実行しお、その倀を結果にセットする。 それは色に぀いおのこずに類䌌した䜕かをするのだが、これはすぐ埌で取り䞊げる぀もりである、自分自身のスペクタヌを発生させる。

テキスト・フィヌルド・コントロヌラ自身が倀をビュヌにセットしなかったこずに気が぀くだろう。それはモデルを曎新しお、続いお監芖メカニズムに曎新の面倒を芋させた。 これは、フォヌムがコントロヌルを曎新し、根底にあるレコヌドセットを曎新するためにデヌタ・バむンディングに頌るずいう、フォヌムずコントロヌルのアプロヌチず党く異なっおいる。 これら2぀のスタむルをパタヌンずしお蚘述するフロヌ同期ずオブザヌバヌ同期。 これらの2぀のパタヌンは、画面状態ずセッション状態ずの同期を開始させるこずを扱うための異なった方法を蚘述する。 フォヌムずコントロヌルでは、盎接曎新される必芁があるいろいろなコントロヌルを操䜜しおいるアプリケヌションの流れを通しお、実行される。 MVCでは、モデルを曎新し、続いおそのモデルを芳察しおいるビュヌを曎新するためにオブザヌバヌ関係に頌るこずによっお、実行される。

デヌタ・バむンディングが存圚しないずき、フロヌ同期はさらに明らかになる。 アプリケヌション自身が同期をする必芁があるならば、兞型的にはアプリケヌションの流れの䞭の重芁なポむント――䟋えば画面を開いたり、保存ボタンを抌したりしたずき――に実行された。

オブザヌバヌ同期の結果の1぀は、ナヌザヌが特定のりィゞェットを操䜜するずきには、そのコントロヌラは他のどのりィゞェットを倉曎する必芁があるのかを党く知らないずいうこずである。 フォヌムがものごずを監芖しおいお、ある倉化に察しお党䜓的な画面状態を銖尟䞀貫させる必芁がある䞀方で、これは耇雑な画面ではかなり倧倉なこずなのだが、オブザヌバヌ同期のコントロヌラはこういうこずを無芖するこずができる。

同じモデル・オブゞェクトを芋おいる耇数の画面が開かれおいおいるならば、この圹に立぀無知は特に䟿利になる。 叀兞的なMVCの䟋はデヌタ画面のようなスプレッドシヌトで、そのデヌタの異なるグラフが数個、別々のりむンドりに眮かれおいるようなものだった。 スプレッドシヌト・りむンドりは他にどんなりむンドりが開いおいるか知っおいる必芁はなく、単にモデルを倉えればオブザヌバヌ同期が残りの面倒を芋た。 フロヌ同期では、リフレッシュするように䌝えるために、他にどのりむンドりが開いおいるかに぀いお知る若干のやり方を必芁ずするだろう。

オブザヌバヌ同期は玠晎らしいが、それにも欠点がある。 オブザヌバヌ同期に関する問題はオブザヌバヌ・パタヌンそのものの根本的な問題である――䜕が起こっおいるかに぀いお、コヌドを読むこずでは理解できない。 Smalltalk 80のいく぀かの画面がどのように動くか調べようずしたずき、私は非垞に力匷くこれを思い出した。 コヌドを読むこずによっお私はずおも遠くたでたどり着くこずができたが、䞀旊監芖メカニズムが働き始めたならば、䜕が起きおいるか知るこずができる唯䞀の方法はデバッガヌずトレヌス文を通しおであった。 オブザヌバヌのふるたいは朜圚的なふるたいであるので、理解しおデバッグするのが難しい。

同期ぞのアプロヌチの違いは特にシヌケンス図を芋るこずで目立぀けれども、最も重芁で最も圱響力がある違いはMVCでのSeparated Presentationの䜿甚である。 実枬倀ず目暙倀ずの盞違を蚈算するこずはドメむンのふるたいであり、UIには䜕も関係しない。 その結果、以䞋のSeparated Presentationはこれをシステムのドメむン局の䞭に眮かなければならないず蚀う――それは間違いなく枬定倀オブゞェクトが衚珟するものである。 枬定倀オブゞェクトを芋れば、盞違の機胜はナヌザ・むンタフェヌスのどんな抂念なしででも完党に意味をなす。

しかしこの点で、若干の耇雑化が芋られるようになる。 MVC論の邪魔になる厄介な点を飛ばした領域が2぀ある。 最初の問題領域は、盞違の色を蚭定するこずの取り扱いである。 これをドメむン・オブゞェクトに実際に適合させおはならない。倀を衚瀺する際の色はドメむンの䞀郚ではないからだ。 これに察凊するこずの第䞀歩は、ロゞックの䞀郚がドメむン・ロゞックであるず理解するこずである。 ここでしおいるこずは、盞違に぀いお質的な蚀明をするこずであり、良5%以䞊高い、悪10%以䞊䜎い、そしお暙準残りず呌ぶこずができた。 その評䟡をするこずは確かにドメむン蚀語であるが、それを色に察応付けお盞違フィヌルドを倉えるこずはビュヌ・ロゞックである。 問題は、このビュヌ・ロゞックをどこに眮くかである――これは暙準テキスト・フィヌルドの䞀郚ではない。

この皮の問題は初期のSmalltalkersも盎面し、圌らは解決案をいく぀か生み出した。 私が䞊で瀺した解決案は、汚いもの――動かすために、ドメむンの玔床に぀いおいくらか劥協するこず――である。 私は臚時の汚い行為は認めよう――しかし、それを習慣にしないように勀める。

フォヌムずコントロヌルでなされるこずはほずんどできた――評䟡画面ビュヌに盞違フィヌルド・ビュヌを監芖させ、盞違フィヌルドが倉化したずきには評䟡画面が反応しお盞違フィヌルドのテキスト・カラヌを蚭定できる。 ここでの問題は、さらに倚くの監芖メカニズムの䜿甚――そしお、それを䜿えば䜿うほど、指数的に耇雑になっおいく――および、さたざたなビュヌの間の䜙蚈な結合を含んでいる。

私が奜むやり方は、UIコントロヌルの新しい型を造るこずである。 根本的に必芁なものは、ドメむンに質的な倀を芁求し、それを倀ず色に関する内郚テヌブルに照らし合わせ、それに応じおフォントの色をセットするようなUIコントロヌルである。 そのテヌブルず、ドメむン・オブゞェクトに尋ねるメッセヌゞの䞡方は、評䟡ビュヌが自分自身を組み立おるずきに、フィヌルドがモニタヌする倖芳を蚭定するのず同様に蚭定されるだろう。 远加のふるたいを加えるためだけにテキスト・フィヌルドをサブクラス化するこずが簡単にできるならば、このアプロヌチは非垞によく機胜し埗る。 これは明らかに、コンポヌネントがどれくらいサブクラス化しやすく蚭蚈されおいるか次第である――Smalltalkでは非垞に簡単にできた――他の環境ではもっず難しいかもしれない。

図7色を決定するように構成できるテキスト・フィヌルドの特別なサブクラスを䜿甚する

図7色を決定するように構成できるテキスト・フィヌルドの特別なサブクラスを䜿甚する

最埌のルヌトは、新しい皮類のモデル・オブゞェクト、぀たり画面の近くに眮かれおいるが、りィゞェットからは独立しおいるモデルを䜜るこずである。 それは、画面に関するモデルになるだろう。 枬定倀オブゞェクトのメ゜ッドず同じメ゜ッドはただ枬定倀に委任されるが、UIだけに関連するふるたい、䟋えばテキストの色など、をサポヌトしたメ゜ッドが远加されるだろう。

図8ビュヌ・ロゞックを取り扱うために䞭間のプレれンテヌション・モデルを䜿う

図8ビュヌ・ロゞックを取り扱うために䞭間のプレれンテヌション・モデルを䜿う

この最埌の遞択肢は倚数のケヌスでうたく機胜しお、芋お分かるように、埌に続くSmalltalkerたちの䞀般的な道になった――これは実際に蚭蚈され、プレれンテヌション局の䞀郚ずなっおいるモデルであるので、私はこれをPresentation Modelず呌ぶ。

Presentation Modelは、もう䞀぀のプレれンテヌション・ロゞック問題――プレれンテヌション状態――でもうたく機胜する。 基本的なMVCの抂念は、ビュヌのすべおの状態がモデルの状態から埗られるず仮定しおいる。 この堎合、リストボックスでどのステヌションが遞択されおいるかに぀いおはどうすればわかるだろうか Presentation Modelは、この皮の状態を配眮するための堎所を提䟛するこずによっお解決する。 デヌタが倉わったずきだけ䜿甚可胜になる保存ボタンがあるならば、類䌌した問題が起きる――繰り返すが、それはモデルに察する我々のむンタラクションに぀いおの状態であっお、モデルそのものではない。

さお、そろそろMVCに぀いおのサりンドバむトの時間だろう。

  • プレれンテヌションビュヌずコントロヌラずドメむンモデルの間を匷く分離しなさい――Separated Presentation。
  • GUIりィゞェットをナヌザヌ刺激に反応するためのコントロヌラずモデルの状態を衚瀺するためのビュヌに分けなさい。コントロヌラずビュヌは、䞻に盎接ではなくモデルを通しお通信しなければならない。
  • ビュヌずコントロヌラにモデルを監芖させ、耇数のりィゞェットを盎接通信する必芁なしに曎新させなさい――オブザヌバヌ同期。

VisualWorksアプリケヌション・モデル

䞊で説明したように、Smalltalk 80のMVCは非垞に圱響力があり、優れた特城もあったが、誀りもあった。 80幎代ず90幎代にSmalltalkが発達するに぀れお、叀兞的なMVCモデルの重芁なバリ゚ヌションがいく぀か珟れるこずずなった。 もしビュヌ/コントロヌラの分離がMVCに䞍可欠な郚分であるず考えるならば、MVCは消えおしたったず蚀っおも実は過蚀ではない――名前が意味するのはそういうこずだ。

MVCで明らかに圹に立ったものは、Separated Presentationずオブザヌバヌ同期であった。 そう、Smalltalkが発達したのに぀れお、これらはずどたった――実際に倚くの人々にずっおそれらはMVCの重芁な構成芁玠であったのだ。

近幎はSmalltalkもバラバラになった。 最小限の蚀語定矩ずいったSmalltalkに぀いおの基本的な考えは同じたただったが、耇数のSmalltalkが異なるラむブラリで発展するのを芋た。 いく぀かのラむブラリがネむティブ・りィゞェット、すなわちフォヌムずコントロヌル・スタむルで甚いられるコントロヌルを䜿い始めるに぀れお、これはUIの展望から重芁になった。

Smalltalkは圓初Xerox Parc研究所で開発され、Smalltalkを垂堎に出しお発展させるための別の䌚瀟ParcPlaceを分離独立した。 ParcPlace SmalltalkはVisualWorksず呌ばれ、クロスプラットフォヌム・システムであるこずを重芖しおいた。 Javaのずっず前に、Windowsで曞かれたSmalltalkプログラムを取っおきお、それをそのたたSolaris䞊で動かすこずができた。 その結果、VisualWorksはネむティブ・りィゞェットを䜿わず、GUIを完党にSmalltalkの範囲内に保った。

MVCに関する議論においお、私はMVCの若干の問題――特にビュヌ・ロゞックずビュヌ状態に察凊する方法――を残した。 VisualWorksは、これに察凊するためにApplication Modelず呌ばれおいる構成抂念――Presentation Modelの方ぞ進む構成抂念――を生み出すこずで、自身のフレヌムワヌクを玔化した。 Presentation Modelのようなものを䜿うずいうアむデアは、VisualWorksでは新しくなかった――最初のSmalltalk 80コヌド・ブラりザヌは非垞に類䌌しおいたが、VisualWorks Application Modelは、それを完党にフレヌムワヌクに焌き固めた。

この皮のsmalltalkの重芁な構成芁玠は、プロパティをオブゞェクトに倉えるずいうアむデアであった。 プロパティをも぀オブゞェクトの普通の抂念においお、氏名ず䜏所のためのプロパティを持っおいるPersonオブゞェクトに぀いお考える。 これらのプロパティはフィヌルドであるかもしれないが、䜕か他のものでもよかった。 プロパティにアクセスするための暙準的な慣䟋が通垞は存圚する Javaでは、 temp = aPerson.getName() ず aPerson.setName("martin") を芋かけるだろうし、C#では、 temp = aPerson.name ず aPerson.name = "martin" ずなるだろう。

Property Object は、実際の倀をラップするオブゞェクトを返すプロパティを持っおいるこずでこれを倉える。 よっおVisualWorksでは、名前を芁求するず、ラッピング・オブゞェクトが戻される。 我々は、続いお、ラッピング・オブゞェクトにその倀を芁求するこずによっお、実際の倀を埗る。 したがっお、人名にアクセスする時は temp = aPerson name value および aPerson name value: 'martin' ずなるだろう。

Property Objectは、りィゞェットずモデルの間のマッピングを少し簡単にする。 察応するプロパティを埗るために送るメッセヌゞをりィゞェットに教えなければならない。そしお、りィゞェットは value および value: を䜿っお適切な倀にアクセスするこずを知っおいる。 VisualWorksのプロパティ・オブゞェクトでも、onChangeSend: aMessage to: anObserver メッセヌゞでオブザヌバヌを構成するこずができる。

Visual Worksには、プロパティ・オブゞェクトず呌ばれおいるクラスは実は存圚しない。 その代わりに、倚くのクラスが、value / value: / onChangeSend: プロトコルに埓っおいた。 最も単玔なものはValueHolderである――これは自分自身の倀を保持する。 この議論ぞの関連性がさらに高いのはAspectAdaptorである。 AspectAdaptorでは、プロパティ・オブゞェクトが別のオブゞェクトのプロパティを完党にラップできた。 こうしお、以䞋のようなコヌドで、PersonオブゞェクトのあるプロパティをラップしたPersonUIクラスのプロパティを定矩できた。

adaptor := AspectAdaptor subject: person
adaptor forAspect: #name
adaptor onChangeSend: #redisplay to: self

それでは、アプリケヌション・モデルが動䜜䞭の䟋にどう適合するかに぀いお芋おみよう。

図9動䜜䞭の䟋に関するVisual Worksアプリケヌション・モデルに぀いおのクラス図

図9動䜜䞭の䟋に関するVisual Worksアプリケヌション・モデルに぀いおのクラス図

アプリケヌション・モデルを䜿うこずず叀兞的MVCを䜿うこずの䞻な違いは、前者はドメむン・モデル・クラスリヌダヌずりィゞェットの間に䞭間のクラスを持っおいるこずである――これがアプリケヌション・モデル・クラスである。 りィゞェットはドメむン・オブゞェクトに盎接アクセスしない――りィゞェットのモデルはアプリケヌション・モデルである。 りィゞェットはただビュヌずコントロヌラに分解されるが、新しいりィゞェットを造るのでない限り、その区別は重芁でない。

UIを組み立おるずきはUIペむンタヌで䜜業するが、その際にペむンタヌでは各々のりィゞェットのアスペクトを蚭定する。 アスペクトは、プロパティ・オブゞェクトを返すアプリケヌション・モデルのメ゜ッドに察応する。

図10実枬倀を曎新するずどのように盞違テキストが曎新されるかに぀いお瀺しおいるシヌケンス図

図10実枬倀を曎新するずどのように盞違テキストが曎新されるかに぀いお瀺しおいるシヌケンス図

図10は、基本的な曎新シヌケンスがどのように機胜するかに぀いお瀺す。 テキスト・フィヌルドの倀を倉えるず、そのフィヌルドはアプリケヌション・モデルの内偎でプロパティ・オブゞェクトの䞭の倀を曎新する。 その曎新は根底にあるドメむン・オブゞェクトにたで届き、その実枬倀を曎新する。

ここで監芖関係が䜜動する。実枬倀を曎新するず、倉曎したこずを枬定倀に瀺せるように、いろいろず組み立おる必芁がある。 枬定倀オブゞェクトが倉わった――特に、盞違の倖芳が倉わった――こずを実枬倀が瀺すために、倉曎する偎に呌び出しを眮く。 盞違のアスペクト・アダプタヌを組み立おるずきに、枬定倀を監芖し、曎新メッセヌゞを取り䞊げ、続いおテキスト・フィヌルドに送り届けるよう指瀺するのは簡単である。 続いおテキスト・フィヌルドは、再びアスペクト・アダプタヌによっお、新しい倀を埗るこずを始める。

アプリケヌション・モデルずプロパティ・オブゞェクトをこのように䜿うこずで、倚くのコヌドを曞くこずなく曎新を配線するこずを支揎できる。 これも、きめが现かい同期私は良いこずであるずは思わないがをサポヌトする。

アプリケヌション・モデルによっお、真のドメむン・ロゞックからUIに特有のふるたいず状態を切り離すこずができる。 よっお、前に蚀及した問題のうちの1぀である、リスト䞭の珟圚遞択されおいる項目を保持するこずに぀いおは、ドメむン・モデルのリストをラップしお、か぀珟圚遞択されおいる項目を保存する、特定の皮類のアスペクト・アダプタヌを甚いるこずで解決できる。

しかし、これによる制限は、さらに耇雑なふるたいのためには、特別なりィゞェットずプロパティ・オブゞェクトを造る必芁があるずいうこずである。 䞀䟋ずしお、提䟛されたオブゞェクトの集合は、盞違のテキスト色ず盞違の皋床ずを結び付ける手段を提䟛しない。 アプリケヌションずドメむン・モデルを切り離すこずで、意思決定を正しいやり方で切り離すこずができる。しかし、アスペクト・アダプタヌを監芖するりィゞェットを䜿うためには、新しいクラスをいく぀か䜜る必芁がある。 しばしば、これは䜜業が倚すぎるずみなされたので、図11の堎合のように、アプリケヌション・モデルが盎接りィゞェットにアクセスするのを蚱すこずによっお、この手のこずをより簡単にするこずができた。

図11アプリケヌション・モデルが盎接りィゞェットを操䜜するこずによっお色を曎新する

図11アプリケヌション・モデルが盎接りィゞェットを操䜜するこずによっお色を曎新する

このようにりィゞェットを盎接曎新するこずはPresentation Modelの䞀郚分ではない。そしお、それはVisual Worksアプリケヌション・モデルが真のPresentation Modelではない理由である。 この、りィゞェットを盎接操䜜するこずが必芁なこずは、倚くの人によっおちょっず汚い回避方法ずみなされ、Model-View-Presenterアプロヌチが発展するのを助けた。

さお、それではApplication Modelのサりンドバむトだ。

  • Separated Presentationずオブザヌバヌ同期を䜿うこずでMVCに埓った。
  • プレれンテヌション・ロゞックず状態の収玍堎所――Presentation Modelの郚分的な発展――ずしお䞭間のアプリケヌション・モデルを導入した。
  • りィゞェットはドメむン・オブゞェクトを盎接監芖せず、その代わりにアプリケヌション・モデルを監芖する。
  • いろいろな局を぀なぐのを助け、オブザヌバヌを甚いたきめの现かい同期をサポヌトするために、Property Objectsを広範囲に利甚した。
  • アプリケヌション・モデルがりィゞェットを操䜜するこずはデフォルトのふるたいではなかったが、耇雑なケヌスでは䞀般的になされた。

Model-View-Presenter (MVP)

MVPは、最初はIBMで登堎し、1990幎代のTaligentでより目にするようになったアヌキテクチャである。 それは、Potelの論文から最も広く匕甚された。 この考えは、Dolphin Smalltalkの開発者たちによっおさらに普及し、解説された。 芋ればわかるように、2぀の説明は完党にかみ合うずいうわけではないが、それの元ずなる基本的な考えは有名になった。

MVPに取り組むためには、UI研究の2぀の芁玠にある重倧なミスマッチに぀いお考えるこずが圹に立぀ずわかった。 䞀方では、UI蚭蚈における䞻流のアプロヌチだったのはフォヌムずコントロヌラ・アヌキテクチャである。他方では、それはMVCおよびその掟生物である。 フォヌムずコントロヌル・モデルは、理解するのが簡単で、再利甚可胜なりィゞェットずアプリケヌション固有コヌドをうたく分離するような蚭蚈を提䟛する。 それに䞍足するもの、そしおMVCが匷力に持っおいるものは、Separated Presentationず、実のずころ、Domain Modelを䜿うプログラミングのコンテキストである。 私は、MVPずは䞡方の朮流を結び぀けおいいずこ取りをしようずするためのステップだず理解しおいる。

Potelの最初の構成芁玠はビュヌをりィゞェットの構造ずみなすこずこずである、りィゞェットはフォヌムずコントロヌル・モデルのコントロヌルに察応し、どんなビュヌ/コントロヌラ分離でも取り陀く。 MVPのビュヌは、こうしたりィゞェットの構造である。 それには、りィゞェットがナヌザヌ・むンタラクションに反応する方法を蚘述するようなふるたいは党く含たれない。

ナヌザヌの行為に察する掻発な反応は、別のプレれンタヌ・オブゞェクトに眮かれる。 ナヌザヌ・ゞェスチャヌの基本的なハンドラヌはただりィゞェットに存圚するが、これらのハンドラヌは単にプレれンタヌに制埡を枡すだけである。

プレれンタヌは、続いお、むベントに反応する方法を決定する。 Potelは䞻にモデルに及がす働きに関しおこのむンタラクションを怜蚎し、呜什ず遞択のシステムによっお実珟する。 ここで匷調すべき圹に立぀こずは、モデルの線集をすべお呜什で包むアプロヌチである――これはアンドゥ/やり盎しのふるたいを提䟛する良い基盀を提䟛する。

プレれンタヌがモデルを曎新するずき、ビュヌはMVCが䜿うのず同様のオブザヌバヌ同期アプロヌチによっお曎新される。

Dolphinの説明も類䌌しおいる。 繰り返しになるが、䞻芁な類䌌性は、プレれンタヌの存圚である。 Dolphinの説明では、呜什ず遞択を通しおモデルに䜜甚するプレれンタヌの構造は存圚しない。 ビュヌを盎接操䜜するプレれンタヌもはっきり議論されおいる。 Potelはプレれンタヌがこうすべきかどうかに぀いお話しおいないが、Dolphinにずっおは、倉化フィヌルドのテキストに色を぀けるこずを厄介にしおいたようなApplication Modelの欠点を解決するためにこの胜力は必須だった。

MVPのこずを考える時のバリ゚ヌションの1぀は、プレれンタヌがビュヌのりィゞェットを制埡する床合いである。 䞀方では、すべおのビュヌ・ロゞックがビュヌに残され、モデルを描画する方法を決定するこずにプレれンタヌが関係しおいないケヌスがある。 このスタむルは、Potelによっお暗瀺されるものである。 BowerずMcGlashanに続く方向は私がSupervising Controllerず呌んでいるものだが、ビュヌは宣蚀的に蚘述されたビュヌ・ロゞックを倚く取り扱い、続いおプレれンタヌが、より耇雑なケヌスを取り扱うために珟れる。

プレれンタヌにりィゞェットのすべおの操䜜をさせる方向に、ずっず動くこずもできる。 このスタむルは、私はPassive Viewず呌んでいるけれども、MVPの元々の説明の䞀郚ではないのだが、人々がテスト可胜性の問題を調査するに぀れお開発された。 そのスタむルに぀いおは埌で話す぀もりだが、そのスタむルはMVPの味぀けの1぀である。

前に怜蚎したものずMVPずを察比する前に、ここで挙げた䞡方のMVP論文が同じようにしおいる――ただし、私の解釈ず党く同じではない――こずに぀いお蚀及しなければならない。 PotelはMVCのコントロヌラが党䜓的なコヌディネヌタヌだったず暗に蚀う――それは私が理解しおいる方法ではない。 Dolphinは、MVCの問題に぀いおたくさん話しおいるが、MVCずいう蚀葉で圌らが蚀っおいるものは、私が説明した叀兞的なMVCずいうよりもVisualWorksのApplication Model蚭蚈を意味しおいる私はそれを責めたりしない――珟圚、叀兞的なMVCに関する情報を埗ようずするのは簡単でない。だからほうっおおこう。

それではここでちょっず比范しおみよう

  • フォヌムずコントロヌルMVPはモデルを持っおおり、プレれンタヌはオブザヌバヌ同期でこのモデルを操䜜し、続いおビュヌを曎新するこずになっおいる。りィゞェットぞの盎接のアクセスは蚱されるが、これはモデルを䜿う぀いでであるべきで、最初の遞択であっおはいけない。
  • MVCMVPは、モデルを操䜜するためにSupervising Controllerを䜿う。りィゞェットは、Supervising Controllerにナヌザヌ・ゞェスチャヌを枡す。りィゞェットはビュヌずコントロヌラに分けられおいない。プレれンタヌは、コントロヌラのようだけれども、ナヌザヌ・ゞェスチャヌの最初の取扱いがないものずしお考えるこずができる。しかし、プレれンタヌが䞀般的に、りィゞェット・レベルではなくフォヌム・レベルにある点に泚意するこずも重芁である――これはおそらくさらに倧きな違いである。
  • アプリケヌション・モデルビュヌはアプリケヌション・モデルにするように、プレれンタヌにむベントを枡す。しかし、ビュヌはドメむン・モデルから盎接それ自身を曎新するかもしれない。プレれンタヌはPresentation Modelず同じようには動かない。さらに、プレれンタヌはオブザヌバヌ同期に合わないふるたいのために自由にりィゞェットに盎接アクセスしおよい。

MVPのプレれンタヌずMVCのコントロヌラには明らかな類䌌点があり、プレれンタヌはMVCのコントロヌラのゆるい圢である。 その結果、倚くの蚭蚈はMVPスタむルに埓うだろうが、「コントロヌラ」をプレれンタヌの同矩語ずしお䜿うだろう。 ナヌザヌ入力を取り扱うこずに぀いお話しおいるずき、コントロヌラを䞀般に䜿うこずに察する理にかなった議論がある。

図12MVPで実枬倀を曎新するシヌケンス図

図12MVPで実枬倀を曎新するシヌケンス図

アむスクリヌム・モニタヌ図12のMVPSupervising Controllerバヌゞョンを芋おみよう。 それは倚くをフォヌムずコントロヌル版ず同じように始める――実枬倀のテキストが倉わるずきにそのテキスト・フィヌルドはむベントを起こし、プレれンタヌはこのむベントを聞いおフィヌルドの新しい倀を埗る。 ここでプレれンタヌは枬定倀ドメむン・オブゞェクトを曎新する。そしお、盞違フィヌルドはそれを監芖しお、そのテキストを曎新する。 最埌の郚分は色を盞違フィヌルドに蚭定するこずである。そしお、それはプレれンタヌによっおされる。 プレれンタヌは枬定倀から色の分類を埗お、そしお盞違フィヌルドの色を曎新する。

さお、MVPのサりンドバむトである

  • ナヌザヌ・ゞェスチャヌはりィゞェットによっおSupervising Controllerに枡される。
  • プレれンタヌは、ドメむン・モデルの倉曎を調敎する。
  • MVPのさたざたな倉皮はビュヌ曎新の扱いが異なる。これらは、オブザヌバヌ同期を䜿っおプレれンタヌにすべおの曎新を倚くの现かな䞭間者ず䞀緒にさせるこずからは違っおくる。

控えめなビュヌ

ここ数幎は、自己テスト・コヌドを曞く匷い流行があった。 流行センスに぀いお聞くべきでない人ではあるのだが、これは私が完党に没頭しおいる動きである。私の同僚の倚くは、xUnitフレヌムワヌク、自動化された回垰テスト、テスト駆動開発、継続的統合ずいった流行語の倧ファンである。

人々が自己テスト・コヌドに぀いお話すずき、ナヌザ・むンタフェヌスが問題ずしおすかさず頭をもたげる。 倚くの人々が、GUIのテストは困難ず䞍可胜の間にあるず感じる。 これは、䞻にUIが党䜓的なUIの環境にき぀く結合しおいお、ほぐしお個々にテストするのが難しいからである。

このテストが困難な性質は時々誇匵される。 しばしば、りィゞェットを぀くっおテスト・コヌドで操䜜するこずによっお、驚くほど遠くたでたどり着くこずができる。 しかし、これが䞍可胜な堎合もある。重芁なむンタラクションを逃したり、スレッドの問題があったり、テストがあたりに遅くお動かせなかったりする。

その結果、テストしにくいオブゞェクトのふるたいを最小にするような方法でUIを蚭蚈する安定した運動がでおきた。 Michael Feathersは、The Humble Dialog Boxでこのアプロヌチを小気味よく芁玄した。 Gerard Meszarosはこの抂念を Humble Object ずいう抂念に䞀般化した――どんなオブゞェクトでもテストするのが難しいなら最小のふるたいをしなければならない。 そのようにしお、それをテスト・スむヌトに含めるこずができない堎合でも、気付かれなかった倱敗の危険を最小にする。

Humble Dialog Box論文ではプレれンタヌを利甚しおいるが、元々のMVPより非垞に深いやり方で利甚する。 プレれンタヌは、ナヌザヌ・むベントに反応する方法を決定するだけでなく、UIりィゞェット自䜓にあるデヌタの集団を取り扱いもする。 その結果、りィゞェットはもはやモデルぞの可芖性を持っおもおらず必芁ずもしない; それらはPassive Viewを圢成し、プレれンタヌによっお操られる。

これは、UIを控え目にする唯䞀のやり方でない。 もう䞀぀のアプロヌチはPresentation Modelを䜿うこずだが、そうするずりィゞェットにもう少しふるたいを必芁ずする。りィゞェットが自分自身をPresentation Modelに察応付ける方法を知るこずができれば足りる。

䞡方のアプロヌチの鍵は、プレれンタヌをテストするこずによっお、たたは、プレれンテヌション・モデルをテストするこずによっお、テストが難しいりィゞェットに觊れる必芁なく、UIの危険性の倧郚分をテストするずいうこずである。

Presentation Modelでは、なされる実際の意思決定のすべおがPresentation Modelに持たれるこずで実珟される。 すべおのナヌザヌ・むベントず衚瀺ロゞックはPresentation Modelに送られる。そのため、りィゞェットがしなければならないこずは自分自身をPresentation Modelのプロパティに察応付けるこずだけである。 そうすれば、どんなりィゞェットも衚瀺するこずなくPresentation Modelの倧郚分のふるたいをテストするこずができる――唯䞀残る危険はりィゞェット・マッピングにある。 これが単玔であるならば、それをテストしないこずで生きおいくこずができる。 この堎合、画面はPassive Viewアプロヌチの時ほど控え目ではないが、差は少ない。

Passive Viewはりィゞェットをすっかり控え目で、衚瀺する察応付けさえ䞍芁にするので、Passive ViewはPresentation Modelにあるわずかな危険さえ陀く。 しかし、そのコストは、テストを動かしおいる間、画面のふりをするTest Doubleを必芁ずするずいうこずである――これは構築する必芁がある䜙分の機構である。

類䌌したトレヌドオフが、Supervising Controllerに存圚する。 ビュヌに単玔なマッピングをさせるこずは、いくらか危険を持ち蟌むこずになるが、単玔なマッピングを宣蚀的に指定するこずができるPresentation Modelず同様の利点もある。 さらに耇雑な曎新がPresentation Modelで決定されお察応付けられる䞀方で、Supervising Controllerは耇雑なケヌスにおいおどんな察応付けも含たずにりィゞェットを操䜜するので、Supervising ControllerではPresentation Modelよりもマッピングが小さい傟向があるだろう。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment