バッドプラクティスから学ぶ インターフェース分離の原則 による柔軟なシステム設計
class MultiFunctionDevice def print_document puts '印刷する' end def scan_document puts 'スキャンする' end def fax_document puts 'FAXを送信する' end end class OldPrinter < MultiFunctionDevice def scan_document raise 'スキャン機能はありません' end def fax_document raise 'FAX機能はありません' end end
scan_document
fax_document
module Printable def print_document raise NotImplementedError end end module Scannable def scan_document raise NotImplementedError end end module Faxable def fax_document raise NotImplementedError end end class MultiFunctionPrinter include Printable include Scannable include Faxable def print_document puts '印刷する' end def scan_document puts 'スキャンする' end def fax_document puts 'FAXを送信する' end end class OldPrinter include Printable def print_document puts '印刷する' end end
class Animal def fly; end def swim; end def run; end end class Fish < Animal def fly raise '魚は飛べません' end def run raise '魚は走れません' end end
module Flyable def fly; end end module Swimmable def swim; end end module Runnable def run; end end class Fish include Swimmable def swim puts '魚が泳ぐ' end end
class Worker def work; end def eat; end end class Robot < Worker def eat raise 'ロボットは食べません' end end
module Workable def work; end end module Eatable def eat; end end class Robot include Workable def work puts 'ロボットが作業をする' end end
class Vehicle def drive; end def fly; end end class Car < Vehicle def fly raise '車は飛びません' end end
module Drivable def drive; end end module Flyable def fly; end end class Car include Drivable def drive puts '車が走る' end end
class Player def play_audio; end def play_video; end end class MP3Player < Player def play_video raise '動画再生はできません' end end
module AudioPlayable def play_audio; end end module VideoPlayable def play_video; end end class MP3Player include AudioPlayable def play_audio puts '音楽を再生します' end end
class Payment def pay_credit; end def pay_cash; end end class CreditPayment < Payment def pay_cash raise '現金払いはできません' end end
module CreditPayable def pay_credit; end end module CashPayable def pay_cash; end end class CreditPayment include CreditPayable def pay_credit puts 'クレジットカードで支払い' end end