📖

【学習備忘録】(Swift)Adapterパターン

2022/05/16に公開

はじめに

デザインパターンについて、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

https://github.com/MasakatsuTagishi/Practice-AdapterPattern

参考にしたもの

1.[ライブ] Swiftでデザインパターン使ってみる(Adapter, Builder, Strategy)

https://www.youtube.com/watch?v=RU_jsa1MmSk&t=3578s

2.デザインパターン ~Adapter~

https://qiita.com/i-tanaka730/items/da8731c219c921d30a59

さいごに

写経し、データの流れを追うことでより理解が深まりました。また、書籍のコードやネットのコードを理解する、そして他人のコードを読めるようになるにも、デザインパターンを学習することで助けになってくれると感じました。
間違いや認識違いがあれば指摘いただければ幸いです。

Discussion