”Clean Architecture" を Golang で実装する UI変更編

 前回、前々回は"Clean Architecture"で簡単な例を実装してみました。

fight-for-liberty.hatenablog.com

fight-for-liberty.hatenablog.com

 

 この時に作ったサンプルはCUIコンソールから操作するものでした。今回はそれを改造してWebブラウザから操作できるようにしてみたいと思います。

 

今回変更する箇所

f:id:masashi-yamada0110:20180130220618p:plain

 "Clean Architecture"ではビジネスロジックとUIが完全に分離しているので、"External Interface"と"Interface adapter"の変更のみで、UIの変更ができるはず。今回はControllerの変更は無くても良さそうなので、ConsoleとConsolePresenterの置き換えのみでWebから操作可能なUIに置き換えます。

ソースコード(抜粋)

 下記がWebのユーザーインターフェース部分を実装しているソースコードです。

go web sample

 上記を実装するにあたり、以下の書籍を参考にしました。 

Go言語によるWebアプリケーション開発

Go言語によるWebアプリケーション開発

 

 

 一般的なWebアプリケーションの書き方と比べて特に変わったことはしていません。

 フォームで入力された"action"の値によってユースケースを呼び分けています。

 htmlファイルには"{{.DisplayArea}}"という結果を表示する箇所を設けています。

go web sample - web presenter

 WebPresenter.goでは各々のユースケースから受け取った結果をHTML表記に加工して引数で受け取ったExternalDeviceに渡す処理をしています。

動作

f:id:masashi-yamada0110:20180204184731g:plain

感想

 Clean Architecture が謳っているとおり、UIがビジネスロジックから分離されているので、External Interface と Interface Adapter の変更のみで済みました。当たり前ですが、ビジネスロジックに対するテストにも変更はありません。

 Clean Architecture以外のアーキテクチャでもUIとビジネスロジックが分離できますが、Clean Architectureの場合はユースケースでオブジェクトを分けること、その入出力の書き方がInputBoundry、OutputBoundaryによって制約を受けることから、余りプログラムの書き手によって差が出ないのではないかなと思いました。

 UIやData Accessorの置き換えが楽にできることから、マルチプラットフォームに対応したプログラムを書く時にも使えそうですね(そういう場合はそういうフレームワークを使うのかもしれませんけど)。

次にやること

 Clean Architectureについては一区切りつけて、なんか実際に動くものを書きたいなぁと。

 

Clean Architecture: A Craftsman's Guide to Software Structure and Design (Robert C. Martin Series)

Clean Architecture: A Craftsman's Guide to Software Structure and Design (Robert C. Martin Series)