成蹊大学理工学研究報告
J. Fac. Sci. Tech., Seikei Univ.
Vol.43 No.1 (2006) pp.9-15

アスペクト指向プログラミングによる旅館予約システムの開発
飯田善久*1，梅津 圭介*2

Development of a Reservation System for Japanese Style Hotels
using Aspect-Oriented Programming
Yoshihisa IIDA *1, Keisuke UMEDU *2
ABSTRACT：A reservation system for Japanese style hotels using a new business model has alreadybeen reported by one of the authors. The reservation system consists of computer systems of travel
agencies and hotels. Hotels keep their inventories of available rooms, offer services which respond toinquiry about room availability from travel agencies and accept reservation of specified rooms. Standard
XML messages are used for communication between travel agencies and hotels. But hotels are using
their own PMS (property management system) which have room inventory, and there are many kinds ofPMSs. Development cost of a hotel system to cooperate with its PMS is very high. In order to decreasedevelopment cost of a hotel system, this report describes how to interface with PMS using
Aspect-oriented approach.
Keywords：Aspect-oriented programming, Reservation system, AspectJ, PMS(Received March 27, 2006)

１．はじめに(1) 宿泊施設を運営する「宿泊事業者」は，「予約事業者」に対して，あらかじめ販売してほしい部屋数を従来からの旅行会社に加え，数多くのリアル店舗を持事前に申告しておく。（これをブロックと呼ぶ）ネ

たない，いわゆるネット旅行会社が数多く設立され，利ット旅行会社が増え，予約事業者の数が増大するに用者はいつでも，どこからでも宿泊施設の予約が可能に

つれ，宿泊事業者は，各予約事業者に提供するブロなり，ネット予約は大幅に増加している。しかし，現状ック数の管理業務が煩雑になり，また全予約事業者の宿泊施設予約システムには次のような問題点がある。

へ提供したブロック数の総和が，実際の部屋数より（図１参照）も多いこともあり，オーバーブッキングが生じることがある。
(2) 予約事業者は，提供されたブロックの範囲内では，顧客からの予約を自動的に処理することは可能であるが，それを超えた場合は，人手を介して宿泊事業者に空き部屋がないかどうかを問合せる必要がある。
(3) 予約事業者が顧客から受けた予約に関する情報（予図１ 現状の旅館予約システム

約日，予約部屋数，氏名・年齢・性別等の顧客情報）
は，FAX あるいは専用端末により送られてくるので，*1：経営・情報工学科教授（Professor, Department of Information

宿泊事業者 は自社 の館内管理システム（ PMS：Sciences）, iida@is.seikei.ac.jp*2：経営・情報工学科 2005 年度卒業研究生

Property Management System）に再入力しなければな(Undergraduate student, Department of Information Sciences)

らない。

−9−

これらの問題点を解決するために，旅行電子商取引促システム全体はオブジェクトの木構造となる。しかし，[2]進機構 の検討をもとに，図２に示すような次世代型宿そこからもれてしまった機能は，後から多くのオブジェ泊予約システムの試作システムを構築した。
（文献[1]参照）

クトにばらばらに実装されることになる。オブジェクト

予約事業者からの要求にしたがって予約業務を行指向ではうまくできない例として，ロギング機能が挙げなう処理を，宿泊事業者自身が Web サービスの形でられる。[4]ログをとる処理そのものは，独立したオブジ提供する。したがって，日々の予約可能部屋数を管ェクトとして作成することは容易であるが，そこで用意理する在庫データベースは，宿泊事業者自身のシスしたメソッドを呼び出す処理は，ログ出力を必要とするテムで管理する。

各オブジェクトに分散して記述することになる。テスト(1)(2) 予約者に関する情報も，予約事業者からオンライン段階が終了し，実運用に入った場合，開発者はテスト段で受け取り，自社の PMS へ直接反映する。

階で必要としたログ出力メソッドの呼び出しを注意深く(3) 予約事業者，宿泊事業者間でやり取りするメッセー削除しなければならず，その際に新たなエラーを発生さジは旅行電子商取引促進機構で策定中の標準 XMLせることも少なからず生じている。ログ出力の呼び出し[3]

形式 を使用する。のように，多くのオブジェクトに関係する機能を「横断この試作システムを用いて，旅行関係者にデモンスト的関心事(crosscutting concern)」と呼び，オブジェクト指レーションを行ない，その普及に努めているところであ向の考え方ではうまく処理することが出来なかった。横るが，各旅館に導入されている館内管理システム（PMS）

断的関心事の処理方法の研究は，パルアルト研究所に在は，多くのベンダーから提供されている。あるいは大規籍していた Gregor Kiczales らにより進められ，アスペク模旅館においては自作の PMS を使用している場合もあト指向プログラミングとしてまとめられた。[5]る。したがって，このビジネスモデルを使用する場合にアスペクト指向プログラミングでは，この横断的関心は，図２に示した宿泊事業者システムを，各 PMS 毎に開事をオブジェクトに分散させるのではなく，単一のモジ発する必要があり，特に自作の PMS を使用している場合ュール「アスペクト」にまとめて記述し，更に横断的関はその開発費用，保守費用も膨大になることが予想される。

心事を「いつ，どこで」利用するかを，それを利用する

これに対応するために，予約事業者とのインターフェオブジェクト側で指定するのではなく，アスペクト側でースは標準 XML を用い，PMS とのインターフェースの指定する。
（図 3 参照）実行に際しては，その両者をツーみを独立して記述し，アスペクト指向プログラミングのル（アスペクトコンパイラ）を用いて統合する方法が用

考え方を導入してその両者を結合してシステムを構築すいられている。

ることにより，システム開発が効率的に行なわれるのではないかと考え，その利点を検証することにした。

図２ 試作システム

２．アスペクト指向プログラミング
ソフトウエア開発のパラダイムとして，オブジェクト指向の考え方が定着してきている。オブジェクト指向では，システム全体をオブジェクトに分割し，更にそれをサブオブジェクトに分割するといった手段が用いられ，
図３ アスペクト指向の考え方−10−Kiczales らが開発した，Java ベースのアスペクト指向されている。

[6]の実装である AspectJ を例にとって，実装方法を紹介する。

表１，表２のプログラムを用意し，表３①に示すよう

表 1 に示す，「Hello!」を出力するプログラムにアスペクトコンパイラ ajc を呼び出し，両者を１つのHelloWorld.java に，横断的関心事（「I am an Aspect」と出アプリケーションとしてまとめ，それを表３②に示すよ力）を織り込むことを考える。表１に示すように，うに実行すれば，アスペクト Aspect1 の実行結果が先に，HelloWorld.java は通常の Java プログラムであり，クラス本体の HelloWorld クラスの Hello()メソッドの実行結果がHelloWorld のインスタンス を生成し ，その メソッドその後に出力される。

hello()を呼び出している。メソッド Hello()が，「Hello!」

このようにアスペクト指向プログラミングを利用するを出力している。と，もとのコードはそのままにして，既存のプログラムにこれに対して「横断的関心事」を織り込むアスペクト

表３ コンパイルと実行の一例である Aspect1.java を表２に示す。
①行目のキーワード aspect は，Java プログラムの classあるいは interface に相当するキーワードであり，このプ
表１ HelloWorld.java
public class HelloWorld {C:¥>ajc HelloWorld.java Aspect1.java①C:¥>java HelloWorld②

I am an Aspect

Aspect1(表２②)の出力

Hello!

HelloWorld.hello()の出力

C:¥>

public static void main(String[] args) {HelloWorld helloWorld = new HelloWorld();

新しいコードを追加することが出来る。したがって，シhelloWorld.hello();

ステム全体はそのままにして，一部の機能を改善したり，}新しい機能を追加したりすることが容易になる。また，

void hello() {システム開発当初には想定していないシステムとの結合をしなければならない場合にも，結合部分のみをアスペ

System.out.println("Hello!");クトで書き，既存のシステムに織り込めば，全体のシス}

テムを再構築する場合に比べて容易に結合が出来ること}
表２ Aspect1.javaが予想される。１章で述べたように宿泊事業者の予約シ①

ステムの場合も，予約事業者とのインターフェース部分

before():execution(void HelloWorld.hello()) {②

は，全宿泊事業者に共通であるので本体のプログラムとSystem.out.println("I am an Aspect");③

して記述し，各宿泊事業者によって異なる PMS とのイン

public aspect Aspect1 {ターフェース部分をアスペクト化することを考えた。
（図}

４参照）

}
ログラムがアスペクトであることを示し，Aspect1 は作成者が名付けたアスペクト名である。
②行目でアスペクトの織り込み先を指定する。この例では，
before()により，HelloWorld クラスの hello メソッド呼出しの前に織り込むことを表わしている。
③行目で，織り込むメソッド（アドバイスと呼ぶ）を定義している。
② に 示 し た before() は ，HelloWorld.hello()の実行の「前」に挿入することを示すが，この他に HelloWorld.hello()の実行「後」図４ アスペクト指向を取入れた旅館予約システムに実行することを示す after()，HelloWprld.hello()に「代わって」アドバイスを実行することを示す around()が用意−11−

３．アスペクト指向を取り入れた宿泊事業者予約システム

なわち，① 予約事業者から送られてくる標準 XML フォーマッ[1]

図２に示したシステム の処理の流れを図 5 に示す。

トのメッセージを解読し，予約に関するデータを取

図 5 に示す処理の中で，宿泊事業者のデータベースにアり出し，宣言された変数にセットする処理

クセスする必要がある(4)の在庫照会に対する回答，(5)②

PMS に問い合わせ(③)をし，予約が取れる場合にはの予約基本処理(予約要求)に対する回答，(6)宿泊者の詳空き部屋数を更新し(④)，宿泊事業者の予約番号を細情報受入れ処理に対してアスペクト指向プログラミン得て(⑤)，宿泊者情報を PMS のデータベースに書込グの考え方を導入した。すなわち，旅行電子商取引促進

む処理(⑥)を行なうメソッド AccessDB を呼び出す。

機構が策定した，標準 XML 形式で予約事業者とメッセ⑦ージ交換をする予約事業者とのインターフェース部分

PMS の結果を受けて，回答用標準メッセージを作成する処理（図５太線部分の処理）と，各宿泊事業者固有の PMSから構成されている。このうちで，③の部屋残数を得るとのインターフェース（図 5 の網掛け部分の記述）とをgetRoomZan()メソッドは，ここでは常に 0 を返すように明確に分離し，後者は対象とする PMS により異なるので，作成してある。したがって，④〜⑥の処理を行なうことアスペクトとして記述することにした。以下では，(5)のはないが，表４に示してあるように，何もしないことが予約基本処理（予約要求）に対する回答処理について詳記述されている。

述する。

これに対して，各 PMS に対応するアスペクトの枠組み

表４に，予約事業者から送られてきた予約要求に対すを表５に示す。基本的には PMS のデータベースにアクセる，宿泊事業者側の処理をするクラスの概要を示す。すスする部分を，各 PMS に対応して記述することになる。

図５ アスペクト指向を取入れた予約システム

public class BookingResponse {static ・・☆・・

表４ 予約要求に回答するプログラム// 各種データをセットする変数の宣言

static String confnum = null;// 宿泊事業者の予約番号

static String bookingcode = null;// 空室があったら HK，満室だったら UC

static int roomtype;// 部屋タイプ

public Element [] answer(Element [] elems) throws Exception{
XML を解読し，ホテル ID, 予約事業者 ID，宿泊日等を☆にセット // ①
AccessDB();// ②

返信用 XML 作成// ⑦−12−return 返信用 XML;}static void AccessDB(){// 空き部屋数を一時的に記憶する変数

int RoomZan = 0;
BookingResponse booking = new BookingResponse();// ③ 宿泊日，部屋タイプを与えて空き部屋数を得る

roomZan = getRoomZan(checkinDate,roomtype);if(RoomZan>0){
updateRoomZan(checkinDate,roomtype,roomZan);// ④ 空き部屋数を１減らす

getConfNum(booking,checkinDate,roomtype,roomZan);// ⑤ 宿泊事業者の予約番号を得る

InsertGuestData(booking,checkinDate);// ⑥ 宿泊者情報書込み

bookingcode = "HK";} else {bookingcode = "UC";}}private static int getRoomZan(String date,int room){return 0;}// date:宿泊日 room:部屋タイプ

private static void getConfNum(BookingResponse booking,String date,int room,int zan){}// booking:本体クラスのオブジェト date:宿泊日 room:部屋タイプ zan:空室数

private static void InsertGuestData(BookingResponse booking,String date){}// booking:本体クラスのオブジェト date:宿泊日

private static void updateRoomZan(String date,int room,int zan){}// date:宿泊日 room:部屋タイプ

zan:空室数}
宿泊事業者の予約番号を得る getConfNum メソッドに対し対しても，顧客情報は送信されてくる XML メッセージに詳ては，アスペクトから本体の宿泊事業者予約番号，予約日

細に記述され，本体のプログラムで解読されているので，

時 を 記 憶 す る 変 数 に ア ク セ ス で き る よ う に ， クラス

パラメータとしてクラス BookingResponse のオブジェク

BookingResponse のオブジェクトを引数として渡している。

トを与えている。

また，顧客情報を必要とする InsertGuestData メソッドにpublic aspect IGuestData {表５ 予約要求に対する PMS とのインターフェースを記述するアスペクト//宿泊日，部屋タイプを与えて部屋の残数を得る getRoomZan を書き換えるアドバイス
int around(String date,int room) :execution(private static int BookingResponse.getRoomZan(String,int)) && args(date,room) {int nRoomZan=0;
日別の空き部屋数を記憶しているテーブルから，引数で指定された宿泊日の行を読み取る;

nRoomZan = 上記により得られた ResultSet の，引数で指定した部屋タイプ・フィールドのデータ;
return nRoomZan;}//空き部屋数を１減らす updateRoomZan を書き換えるアドバイス
void around(String date,int room,int zan) :execution(private static void AccoBookingResponse.updateRoomZan(String,int,int))&& args(date,room,zan){
日別の空き部屋数を記憶しているテーブルから，引数で指定された宿泊日の行，room で指定された列の値をzan-1 に更新する;}−13−

//宿泊事業者の予約番号を得る getConfNum を書き換えるアドバイス
void around(BookingResponse booking,String date,int room,int zan) :execution(private static void BookingResponse.getConfNum(BookingResponse,String,int,int))&& args(booking,date,room,zan){
宿泊施設が与える予約番号を記憶しているテーブルにアクセスし，その番号を booking.confnum にセットする;
そのテーブルの予約番号を１増加する;
booking.bookingdate（予約日）を更新する;
booking.bookingtime（予約時刻）を現在時刻に更新する;}// 顧客情報を書き込む InsertGuestData を書き換えるアドバイス
void around(BookingResponse booking, String date) :execution(private static void BookingResponse.InsertGuestData(BookingResponse,String))&& args(booking,date){
商品情報からこの商品が指定する食事コードを得る
顧客情報を記憶しておくテーブルに顧客情報(名前，連絡先，男女別，大人子供別，到着手段，チェックイン日時等），選択した食事コードを書込む;}}
ラムと各アドバイスのそれぞれの織り込み点での影響

４．アスペクト指向を取り入れた宿泊事業者予約シを考慮しなければならず，分かりにくいといわれている。

ステムの実装また，開発に当たっても，本体のプログラムを充分に理解したうえで，アスペクトを作成しなければならない。

文献[1]で報告した試行システムで用いた株式会社ア

したがって，この方法を実用化するにあたって，予約事

ルゴ２１のフロントくん Win[8]，およびアスペクト指向

業者との間のメッセージの解読方法およびその結果をの利点を検証するために自作した簡易 PMS を対象にし記憶してある変数名等を知らなくても，PMS との間のて，２つの宿泊施設側のシステムを開発した。
（予約事業インターフェースをつかさどるアドバイスを開発でき者側のシステムは，文献[1]のものをそのまま使用した。
）

るようにするために，各アスペクトの機能を明確に定義

文献[1]で報告したシステムでは，宿泊施設側の予約処したマニュアルを用意し，更にアスペクトのアドバイス

理は，予約事業者からの XML メッセージを処理する部を各 PMS に対応して直接コーディングするのではなく，分と，PMS とのインターフェース部分との切り分けがき

図６に示すように，必要なデータをユーザーの言葉で表ちんとできていなかったので，宿泊事業者側のフロント

わし，それをどのテーブルのどのフィールドに書込むかくん Win に対するものも再構築したが，それが完成したを記述するだけで，アドバイスを自動生成するユーザ・

あとの自作の PMS に対するアスペクトの作成は数日程インターフェースの開発が必要であろう。

度の作業で完成することが出来，アスペクト指向の考え方による開発期間の短縮が実現できたものと考えられ，今後他の PMS に対するシステムも容易に作成できる見通しが得られた。
なお開発は，Eclipse に AJDT（AspectJDevelopment Tools）[6][7]をプラグインしたものを用いて行なった。

５．考 察
アスペクト指向プログラミングのコードの正しさについては，本体のプログ

図６ アスペクト開発のためのユーザ・インターフェース

−14−

参考文献
[1] 飯田 善久，中島 玲子，宮本 聡子：次世代型宿泊予約システムの開発，成蹊大学理工学研究報告，Vol.42，No.1，pp13-18，2005 年 6 月[2] 旅行電子商取引促進機構，http://www.travel-edi.
com/[3] ジェイアール総研情報システム：旅館施設情報提供
および予約業務における業務プロセス及び情報モデル調査，2004 年 3 月[4] 千葉 滋：アスペクト指向ソフトウエア開発とそのツール，情報処理，Vol.45，No.1，pp28-33，2004 年
1月[5] Gregor Kiczales: Aspect-Oriented Programming,
http://www.cs.ubc.ca/~gregor/papers/kiczales-ECOOP1997-AOP.pdf[6] 立掘 道昭：AspectJ によるアスペクト指向プログラ
ミング入門，ソフトバンクパブリッシング，2004 年
4月[7] AJDT (AspectJ Development Tools), http://www.ecli
pse.org/ajdt/[8](株)アルゴ２１，http://www.argo21.co.jp/hotel/
frontkun_win.html−15−