📖
【学習備忘録】(Swift)Adapterパターン
はじめに
デザインパターンについて、ViewControllerに全て詰め込んでコードを書く方法から脱却したい、そしてTDD(テスト駆動開発)をしたいと思い、まずはデザインパターンの学習をしています。
Adapterパターンについて学習し、下の参考リンクの動画内のコードを写経しました。
Adapterパターンとは
・Adapterパターンは、既に提供されているがそのまま使えないものに対し、必要な形に変換して利用するための方式。
・継承を利用した方法と委譲を利用した方法がある。
・Wrapperパターンと呼ばれることもあります。Wrapperは包むものという意味になります。(よくTwitterなどで、ラップするという単語が出てきて、よくわからなかったのですが、理解できるようになりました。)
・GoFのデザインパターンでは、構造に関するデザインパターンに分類される。
サンプルコード
・ViewControllerがスッキリしていることに感動しました。
・下のextentionはBannerを直接Printerプロトコルに適合させる実装方法もあるという例です。
・実際にクラス図を書いたり、コードの流れを追うとより理解が深まりました。
class ViewController: UIViewController {
let client = Client()
override func viewDidLoad() {
super.viewDidLoad()
client.use(printer: PrintBanner(text: "hello"))
}
}
// Target
protocol Printer {
func printWeak()
func printStrong()
}
// Adaptee(適合される側)
struct Banner {
let text: String
func showWithParen() {
print("(" + text + ")")
}
func showWithAster() {
print("*" + text + "*")
}
}
// Client
struct Client {
func use(printer: Printer) {
printer.printWeak()
printer.printStrong()
}
}
// Adapter(適合する側)
struct PrintBanner: Printer {
private let banner: Banner
init(text: String) {
self.banner = Banner(text: text)
}
func printWeak() {
banner.showWithParen()
}
func printStrong() {
banner.showWithAster()
}
}
extension Banner: Printer {
func printWeak() {
showWithParen()
}
func printStrong() {
showWithAster()
}
}
GitHub
参考にしたもの
1.[ライブ] Swiftでデザインパターン使ってみる(Adapter, Builder, Strategy)
2.デザインパターン ~Adapter~
さいごに
写経し、データの流れを追うことでより理解が深まりました。また、書籍のコードやネットのコードを理解する、そして他人のコードを読めるようになるにも、デザインパターンを学習することで助けになってくれると感じました。
間違いや認識違いがあれば指摘いただければ幸いです。
Discussion