Rubyのデザインパターン。プログラミングにおけるアピアランスパターンの応用
アピアランスパターンとは?
アピアランスパターンは、サブシステム内の異種インターフェースの集合に対して統一されたインターフェースを提供する。外観は上位のインターフェースを定義し、複雑さを軽減し、サブシステム間の通信と依存関係を隠すことによってサブシステムを使いやすくします。
あるサブシステムに異なるクラスの集合があり、そのうちのいくつかは互いに依存しているとしよう。この場合、クライアントはそれぞれのクラスについて知っておく必要があるため、サブシステム内のクラスを利用することが難しくなります。外観は、サブシステム全体へのエントリポイントとして機能します。クライアントの中には、サブシステムのクラスをあまりカスタマイズせずに、サブシステムの基本的な動作だけを必要とするものがあり、外観はそのようなクライアントに簡略化されたインタフェースを提供します。サブシステムのクラスからより多くの動作をカスタマイズする必要があるクライアントだけが、外観の背後にある詳細に関心を持つことになります。
外観のパターン。システム内の一連のインタフェースに対して統一されたインタフェースを提供する。アピアランスは、サブシステムを使いやすくするための高レベルのインタフェースを定義する。
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
メリット:ユーザーは様々な銘柄について知る必要がなく、ファンドを売買するだけでよい。
関連
-
Ruby正規表現とサンプルコード
-
GitHubが提唱するRubyコードの書き方まとめ
-
UbuntuでRuby on RailsフレームワークとRubyMine IDEを設定する
-
Ruby Hash ハッシュ型 基本操作のメソッド一覧 まとめ
-
RubyのProcクラスとProc.newメソッドの使用法
-
Ruby on Railsで構築するアプリケーションの基本的なディレクトリ構造のまとめ
-
Rubyの文字列と配列の最大化問題の考察
-
Rubyのデザインパターン。アダプタパターン実践ガイド
-
RubyのSimple FactoryパターンとFactory Methodパターンを利用する
-
Rubyのモジュールに関する基礎知識
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
Rubyを使ったFTPパスワードクラッキング
-
Rubyの二分探索(dichotomous search)アルゴリズムの簡単な例
-
Ruby on Railsフレームワークの設計構造をMVCマインドで理解する
-
RubyのHash構造体の基本操作のまとめ
-
Jekyll静的ウェブサイトのバックエンドエンジンのチュートリアル
-
RubyのTimeオブジェクトの共通機能まとめ
-
Rubyの基本的な環境変数の設定と一般的なインタープリタコマンド
-
RubyインタプリタをOSにインストールするためのチュートリアル
-
Ruby on Railsのメーラーの使い方を説明します。
-
ブログのスパムメッセージを簡単にブロックする方法