この特集のトップページへ
Chapter 6:ビジネスロジックの設計

head2.gif 6.2.2 顧客情報の編集
 顧客情報の登録を実装し,その動作を確認したところで,次に顧客情報の編集について考える。

●既存の顧客情報を変更する方法
 それぞれの顧客は顧客情報テーブルに1つのレコードとして格納されており,そのレコードを区別するための唯一無二の値がIDフィールドに格納されている。つまり,既存の顧客情報を変更するためには,顧客を特定するためにIDフィールドに格納された値(顧客番号)を使い,「顧客番号が10番の顧客名をソフトバンクパブリッシングに変更する」といった具合に,「顧客番号が何番の顧客の情報を変更するのか」を指定することになる。

 顧客の情報を変更するメソッドを実装するには,次の2つの方法がある。

1)各フィールドごとに変更するメソッドをそれぞれ用意する方法
 1つ目の方法は,顧客情報テーブルに備わる各フィールドの値を変更するメソッドをフィールドの数だけ実装する方法である。実装例はList 6-12のようになる。

 List 6-12の実装を使って、たとえば顧客番号が10番の顧客名を「ソフトバンクパブリッシング」に変更する場合には,COMクライアントは次のようにしてUpdate_NAMEメソッドを呼び出せばよい。

Dim obj As Business.Customer
Set obj = CreateObject("Business.Customer")
obj.Update_Name 10, "ソフトバンクパブリッシング" 

 さらに電話番号とFAX番号を変更したいということであれば,次のようにUpdate_TELEPHONEメソッドとUpdate_FAXメソッドの2つを呼び出すことになる。

obj.Update_TELEPHONE 10, "03-1234-5678"
obj.Update_FAX 10, "03-2345-6789" 
2)レコード全体を変更するメソッドを用意する方法
 もう1つの方法は,個々のフィールドを変更するためのメソッドを用意するのではなく,新しいフィールドの値すべてを引数として受け取り,1つのレコードに備わるすべてのフィールドを一気に変更してしまうようなメソッドを実装する方法である。実装例は,List 6-13のようになる。

 List 6-13の実装例では,第1引数に変更したい顧客番号を指定し,第2引数以降に変更後の各フィールドの値を指定することを前提としている。そのため,このままでは全フィールドを変更することになってしまい(つまりのところ上書きする),たとえば「顧客の住所だけ」あるいは「住所と電話番号だけ」を変更するといったことはできなくなる。そこで,このようなアプローチで実装する場合には,List 6-13に示した実装例に加え,既存の顧客の情報を取得するメソッドが必要になる。そのようなメソッドの実装例は,List 6-14のようになる。

 List 6-14に示したGetCustomerメソッドを実装しておけば,たとえば,顧客番号が10番であるレコードの電話番号のみを「03-1234-5678」に変更することも可能になる。具体的には,あらかじめGetCustomerメソッドを呼び出して,その時点のフィールドの値を取得しておき,電話番号を変更してList 6-13で挙げたUpdateCustomerメソッドを呼び出すのである(List 6-15)。

 上記の1)と2)の方法は,それぞれメリットとデメリットがある。

 まず,1)の方法のデメリットとして挙げられるのは,フィールドの数だけメソッドを用意しなければならないという点である。いうまでもなく,この場合はフィールド数が増えれば増えるほど,メソッドの実装は面倒になってゆく。それに比べると,2)の方法では,ただ1つのメソッド(実際には情報の取得用のメソッド――上記の例でいえばList 6-14に示したGetCustomerメソッド――も用意しなければならないので実質2つだが)を実装すればよいため,実装が容易になる。

 では,効率的にはどちらがよいのだろうか。すでに説明したように,ビジネスロジックはネットワークを経由してクライアント(プレゼンテーション層)から呼び出されるものである。よって,ネットワークの往復する回数とデータ転送量が少ないほうが望ましい。

 まず,顧客番号が10番である顧客の電話番号だけを変更することを考えてみる。このとき,1)の方法では,Fig.6-38に示すようにUpdate_TELEPHONEメソッドをただ1度,ネットワーク経由で呼び出すだけですむ。それに比べ,2)の方法だと,まずGetCustomerメソッドを呼び出してその時点の情報を取得するために1往復し,さらにUpdateCustomerメソッドを呼び出す必要があるため,ネットワーク上のやり取りは2回必要となる。よって,1)の方法のほうが効率がよい。

Fig.6-38 電話番号のみを変更する場合
fig6_38

 次に,顧客番号10の顧客の郵便番号,住所,電話番号,FAX番号の4つを変更することを考えてみる。この場合,1)の方法ではFig.6-39に示すようにUpdate_ZIPメソッド,Update_ADDRESSメソッド,Update_TELEPHONEメソッド,Update_FAXメソッドの4回の呼び出しが必要なのに対し,2)の方法では,Fig.6-38に示したのと同様にGetCustomerメソッドを呼び出したあとUpdateCustomerメソッドを呼び出すだけですむ。よって,2)の方法のほうが効率がよくなる。

Fig.6-39 郵便番号,住所,電話番号,FAX番号の4つの情報を変更する場合
fig6_39

 つまり,顧客の一部の情報しか変更しないのであれば1)の方法のほうが効率がよく,複数の情報を変更するのであれば2)の方法のほうが効率がよいということである。


One Point! ここでは,ネットワークを経由したメソッドの呼び出し回数での速度比較をしているが,ネットワークの呼び出し速度はメソッドの呼び出し回数だけで決まるものではなく,ネットワークを流れるデータ量にも依存する。Fig.6-39において,1)の方法では郵便番号,住所,電話番号,FAX番号の4つのデータしか流れないのに対し,2)の方法では,Fig.6-38で示したように顧客名,よみがな,郵便番号,住所,電話番号,FAX番号,締め日,摘要,作成者,最終更新者,最終更新日といった多数のデータが流れる。そのため,そのデータ量によっては,複数の情報を更新する場合でも1)の方法のほうが高速であることもある(たとえば,摘要の項目に長い文字列が含まれている場合など)。

 本サンプルで顧客の情報を変更するときは,「その時点の顧客情報の値をテキストボックスなどで表示し,そこにユーザーが新しい値を入力し,[OK]ボタンなどを押して顧客情報を更新する」というユーザーインタフェース(Fig.6-40)に基づくことが多いと思われる。

Fig.6-40 顧客の編集画面の例
fig6_40

 Fig.6-40のユーザーインタフェースを提供するためには,編集対象となる顧客情報を取得し,その時点の情報をテキストボックスに表示する必要がある。よって,List 6-14に示したGetCustomerメソッドの実装は必須である。

 Fig.6-40のユーザーインタフェースで顧客の情報を変更した場合,1)の方式だと,ユーザーがどの情報(フィールド)を変更したのかを判断し,顧客名が変更されたならばUpdate_NAMEメソッドを,電話番号が変更されたならばUpdate_TELEPHONEメソッドを,といった具合に,List 6-13に示したメソッドを逐一呼び出すことになる。一方,2)の方法では,UpdateCustomerメソッドを呼び出すだけでよい。効率面からいえば,ユーザーが一部の情報しか変更しなかったならば1)のほうが効率はよく,多数の情報を変更したならば2)のほうが効率がよい,ということになる。

 一般的に,顧客の情報というのは,そう頻繁に変更されるものではない。そこで本サンプルでは効率性よりも実装の手軽さを重視し,2)の方法で実装することにする。1)の方法で実装してもよいが,Fig.6-40のようなユーザーインタフェースを実装するときに,「ユーザーがテキストボックスの内容を変更したのか」を判断する処理を各テキストボックスに組み込まなければならなくなり,煩雑になってしまう。もちろん,その判断処理を省き,List 6-13に示したメソッド(Update_NAMEUpdate_YOMIGANAUpdate_ZIPUpdate_ADDRESS,……)をすべて順に呼び出すという方法もある。しかし,これでは2)の方法に比べて明らかに効率が悪い。


One Point! 1)の方法と2)の方法は組み合わせて実装してもかまわない。たとえば,顧客の電話番号だけを頻繁に変更するようなケースでは,List 6-14UpdateCustomerメソッドに加え,電話番号を変更するためのUpdate_TELEPHONEというメソッドも併せて実装しておく。そして,電話番号だけを変更したいだけのときには,UpdateCustomerメソッドを呼び出すのではなく,Update_TELEPHONEメソッドを呼び出すようにする。こうすることで,ネットワークに流れるデータを抑えることができ,結果として高速になる。つまり,全フィールドを一括設定するメソッド(上記の例ではUpdateCustomerメソッド)を実装し,頻繁に変更されるフィールドがあれば,それぞれのフィールドの値のみを変更するメソッド(Update_TELEPHONEメソッドやUpdate_FAXメソッドなど)を実装することで,パフォーマンスの向上を期待できるのである。
prevpg.gif Chapter 6 17/92 nextpg.gif