TOP>>OBAQ>>環境獲得 概略ツアー<OBAQ>構成定義アプリケーションサーバリファレンスサイトマップ

環境獲得とは


身近にある環境獲得

環境獲得という概念は一見複雑ですが、 実は我々はこれに近いことを日常的に行なっています。 ここでは、まずそのような例を示します。

会社でパソコンOSを決定する

例えば、会社のパソコンで使用するOSをどのように決定するか考えてみましょう 。

多くの会社では会社全体の標準として、原則的にこのOSを使用するということを決定していると思います。 しかし、例えば会社の標準がWindows-MEだったとしても、 部門によっては業務上の必要のために、linuxを使うケースがあります。 しかし、その部門にいても互換性のチェックのためにあえてWindows-NTを使用する人もいます。

これを逆の方法から見ていくと、次のようになります。

  1. 自分が業務のために、特に必要とするOSがあれば、それを使う
  2. なければ、部門で標準となっているOSを使用する
  3. 部門が標準を設定しなければ、会社全体の標準を使用する

環境獲得とは、このような処理をシミュレーションするプログラミングモデルです。

ヤマちゃん

もうひとつ別の例をあげます。

あなたの職場には、山本さんとか山口さんという名前で「ヤマちゃん」と呼ばれる人がいませんか? まずここでは、「ヤマちゃん」が会社の中に何人もいると想像してみてください。

そして、あなたが同僚に「この書類、ヤマちゃんに届けといてよ」と頼まれたとします。 この時に、同僚が言っている「ヤマちゃん」が誰なのか、どのように決定するでしょうか?

たぶん、あなたと同僚が所属する職場(仮に1部1課とします)の中で「ヤマちゃん」という人がいないか考えます。 もしいなかったら、1部全体で誰か「ヤマちゃん」がいないか探して、 最後に会社全体でそういう人はいないかという思考を(一瞬のうちに)たどると思います。

形式的に言うと

まず、包含関係にあるいくつかのオブジェクトが存在します。 この例では、社員が部門に所属し、部門が会社に所属します。

そして、そのオブジェクトがそれぞれ属性を持っています。 この場合だと、標準OSという属性です。

そして、あるオブジェクトの属性値を参照するには、次のような手順で検索します。

  1. そのオブジェクト自身が属性値を持っているか
  2. なければ、そのオブジェクトが所属するオブジェクト(部門)が属性値を持っているか
  3. なかればさらにそのオブジェクトが所属する上位のオブジェクト(会社)が属性値を持っているか

このようなモデルを、ほぼそのとおりに記述できるモデルが「環境獲得」です。

サンプル

上記の例をそのままサンプルプログラムにしました。 ソース全体とその説明は、後程示します。 ここでは、雰囲気だけ味わってください。

# OS決定の例
class Employee
  # 一部省略
  acq_import :os
  def what_os_do_you_use?
    puts "Hi, I'm #{@name}, I use #{os} every day"
  end
end

ms = Campany.new("Windows")
fud_section = Section.new(ms, "Linux")
excel_section = Section.new(ms)

bill = Employee.new("Bill")
bill.employed_by(fud_section)
bill.what_os_do_you_use? # => "Hi, I'm Bill, I use Linux every day"

bill.employed_by(excel_section)
bill.what_os_do_you_use? # => "Hi, I'm Bill, I use Windows every day"

acq_import :os で、osというメソッドを環境から借りてくる指定をします。 すると、自動的に所属する環境の持つosを取得できるようになります。 その結果、所属するセクションの標準OSまたは会社の標準OSを参照できるようになります。

# ヤマちゃんの例
class Employee
  def who_is_yamachan
    puts "yama_chan is Mr.#{yama_chan.name} in #{yama_chan.section.name}"
  end
end

kanto = Section.new("Kanto")
tokyo = Section.new("Tokyo", kanto)
kanagawa = Section.new("Kanagawa", kanto)

kansai = Section.new("Kansai")
osaka = Section.new("Osaka", kansai)

yamaguchi = Employee.new("Yamaguchi", tokyo)
kanto.add_role_object(:yama_chan, yamaguchi)
yamashita = Employee.new("Yamashita", kanagawa)
kanagawa.add_role_object(:yama_chan, yamashita)

yamabe = Employee.new("Yamabe", osaka)
kansai.add_role_object(:yama_chan, yamabe)

suzuki = Employee.new("Suzuki", tokyo)
suzuki.who_is_yamachan # => yama_chan is Mr.Yamaguchi in Tokyo

nakamura = Employee.new("Nakamura", kanagawa)
nakamura.who_is_yamachan # => yama_chan is Mr.Yamashita in Kanagawa

tanaka = Employee.new("tanaka", osaka)
tanaka.who_is_yamachan # => yama_chan is Mr.Yamabe in Osaka

ページトップへ