1. ホーム
  2. スクリプト・コラム
  3. ルビートピックス

Rubyのデザインパターン。プログラミングにおけるアピアランスパターンの応用

2022-01-31 14:27:49

アピアランスパターンとは?

    アピアランスパターンは、サブシステム内の異種インターフェースの集合に対して統一されたインターフェースを提供する。外観は上位のインターフェースを定義し、複雑さを軽減し、サブシステム間の通信と依存関係を隠すことによってサブシステムを使いやすくします。

    あるサブシステムに異なるクラスの集合があり、そのうちのいくつかは互いに依存しているとしよう。この場合、クライアントはそれぞれのクラスについて知っておく必要があるため、サブシステム内のクラスを利用することが難しくなります。外観は、サブシステム全体へのエントリポイントとして機能します。クライアントの中には、サブシステムのクラスをあまりカスタマイズせずに、サブシステムの基本的な動作だけを必要とするものがあり、外観はそのようなクライアントに簡略化されたインタフェースを提供します。サブシステムのクラスからより多くの動作をカスタマイズする必要があるクライアントだけが、外観の背後にある詳細に関心を持つことになります。

    外観のパターン。システム内の一連のインタフェースに対して統一されたインタフェースを提供する。アピアランスは、サブシステムを使いやすくするための高レベルのインタフェースを定義する。

Appearanceパターンを使用するタイミングは?

  •     サブシステムはだんだん複雑になってきています。パターンを適用する過程で、これらのサブシステムに対してよりシンプルなインタフェースを提供するためにアピアランスを使用できる多くのクラスが進化してきました。
  •     サブシステムは、アピアランスを使って階層化することができます。各サブシステムのレベルには、エントリポイントとしてアピアランスがある。アピアランスを通じて通信することで、依存関係を単純化することができる。

Ruby版外観パターンアプリケーション
要求事項

株主が株式を購入・売却する

イニシャルコード

# -*- encoding: utf-8 -*-

# Stock1
class Stock1
  def buy
    puts 'stock1 buy'
  end
  
  def sell
    puts 'stock1 sell'
  end
end

#Stock2
class Stock2
  def buy
    puts 'stock2 buy'
  end
  
  def sell
    puts 'stock2 sell'
  end
end

#Stock3
class Stock3
  def buy
    puts 'stock3 buy'
  end
  
  def sell
    puts 'stock3 sell'
  end
end

#NationalDebt1
class NationalDebt1
  def buy
    puts 'NationalDebt1 buy'
  end
  
  def sell
    puts 'NationalDebt1 sell'
  end
end

#realty1
class Realty1
  def buy
    puts 'Realty1 buy'
  end
  
  def sell
    puts 'Realty1 sell'
  end
end
s1 = Stock1.new
s2 = Stock2.new
s3 = Stock3.new
n1 = NationalDebt1.new
r1 = Realty1.new

s1.buy
s2.buy
s3.buy
n1.buy
r1.buy

s1.sell
s2.sell
s3.sell
n1.sell
r1.sell



質問です。

ユーザーは、株や国債、不動産について知り、その具体的な売買に、高い結合度で関わる必要があることがわかります。

コードの改善

# -*- encoding: utf-8 -*-

# Stock1
class Stock1
  def buy
    puts 'stock1 buy'
  end
  
  def sell
    puts 'stock1 sell'
  end
end

#Stock2
class Stock2
  def buy
    puts 'stock2 buy'
  end
  
  def sell
    puts 'stock2 sell'
  end
end

#Stock3
class Stock3
  def buy
    puts 'stock3 buy'
  end
  
  def sell
    puts 'stock3 sell'
  end
end

#NationalDebt1
class NationalDebt1
  def buy
    puts 'NationalDebt1 buy'
  end
  
  def sell
    puts 'NationalDebt1 sell'
  end
end

#realty1
class Realty1
  def buy
    puts 'Realty1 buy'
  end
  
  def sell
    puts 'Realty1 sell'
  end
end

#Fund class
class Fund
  attr_accessor s1, s2, s3, n1, r1
  
  def initialize
    s1 = Stock1.new
    s2 = Stock2.new
    s3 = Stock3.new
    n1 = NationalDebt1.new
    r1 = Realty1.new
  end
  
  def buy
    s1.buy
    s2.buy
    s3.buy
    n1.buy
    r1.buy
  end
  
  def sell
    s1.sell
    s2.sell
    s3.sell
    n1.sell
    r1.sell
  end
end

f1 = Fund.new
f1.buy
f1.sell



メリット:ユーザーは様々な銘柄について知る必要がなく、ファンドを売買するだけでよい。