Clean Architectureについて

Google App Engine / Goで作っている個人プロジェクトにClean Architectureを適用してみた中で思ったことのメモです。
この記事ではClean ArchitectureとDIPとDIについて書いてます。
いわゆるDDDは意識してません。あくまでレイヤーについての感想です。

Clean Architecture とは

いくつかあるレイヤードアーキテクチャのうちのひとつです。
目的は関心の分離で、関心の分離をすると何が嬉しいかというと、のちの設計理解や維持管理が楽になることです。

f:id:utahta:20171129102106j:plain

図のように4層の円で構成されていて、それぞれ異なる役割(関心事)を表しています。
外側にいくほど実装の詳細を表現し、内側にいくほど抽象を表現します。
ちなみに層は4つのみという決まりはなく、必要であれば増やしても良いです。

依存関係は、外側から内側への一方向になります。
これは必ず従うべきルールで、内側から外側のコードを直接呼び出したらダメです。
依存関係は大事で、ここをしっかり押さえないとたぶん何を選択してもダメです。

以下、各層について私の解釈です。

External Interfaces

技術の詳細を担当します。
例えば、データの永続化にMySQLを使うのかSQLiteを使うのか、技術的な選択を内側の層で意識しなくて良いように薄くラッピングします。
ここにはロジックを書きません。

Interface Adapters

外側の層と内側の層をうまく取り持つ役割を担当します。
例えば、HTTPリクエストを受け取るControllerは、受け取ったHTTPリクエストを内層で扱える形に変換して渡す役目です。
基本それ以上のことはしません。
よく言われていることですが、仮にHTTPリクエストを内層(Use Cases)にそのまま渡すと、そのUse Casesは外界に依存することになり、依存関係は一方向というルールに反します。
使い回しという側面もありますが、そもそもの依存関係が破綻しているのでもうダメです。

Use Cases

ロジックの取りまとめとトランザクション管理を担当します。
繰り返しになりますが、WebやCommandなど外層の世界に依存しないように注意します。
1ファイルにつき1つの振る舞いを書くと見通しがよくて個人的に好みです。

Entities

技術的な関心から離れたロジックを担当します。
このロジックは、use case(用途)に限定しない一般的なものと解釈してます。
どこにも依存しない孤高の存在です。

依存関係逆転の原則(DIP)について

Clean Architectureを適用するにあたって、DIPの原則に従います。

(解説)
上位のモジュールは下位のモジュールに依存してはならない。
どちらのモジュールも「抽象」に依存すべきである。

雑にまとめると、interface(抽象)を用意して、処理の呼び出しをinterface経由にすると、実装の差し替えとか簡単になって便利!というものです。
内層から外層のコードを呼び出すときは、interfaceを経由します。
作用として、テストが書きやすくなり、DIと合わせることでcycle importsの解消にも役立ちます。
interfaceの置き場には議論の余地がありますが、私はEntities層に置くことが多いです。

依存性の注入(DI)について

コンストラクタやセッターメソッドでinterfaceを引数に取り、外部から実装を渡すパターンです。
実装の差し替えが簡単になり、融通の効くソースコードになります。
Use Cases層でよく使ってます

まとめ

大体Clean Architecture 翻訳と言ってることは同じ(でも自分の言葉にしておきたい)。
Clean Architectureは図が分かりやすくて、ソースコードに落とし込みやすい。
interfaceとDIを半ば強制されるので、自然とテストが書きやすいコードになる。
依存関係と合わせて単一責務の原則を守れば、酷いコードになりにくい。
コード量は増える。

続く。

Signing commits with GPG をした

GitHub のヘルプ を参考に設定した。

プログラミング初心者な人に .gitconfig の設定を参考にしてもらおうと雑に渡したら user.name と email をそのまま使われてしまって、成りすましのようになってしまったことが発端。
どう防ぐのかいいか少し悩んだけど、僕の方で署名しておくのが妥当かなと思い至った。

設定したので Verified マークがついた図。 f:id:utahta:20171109235723p:plain

設定メモ

gpg コマンドインストール

$ brew install gpg

GPG key を作成

日本語だと文字化けして何を言ってるんだお前は状態になったので、英語指定してる。

$ LANG=en_US.utf-8 gpg --full-gen-key
$ gpg --list-secret-keys --keyid-format LONG
Users/utahta/.gnupg/pubring.kbx
--------------------------------
sec   rsa4096/<サインキー> 2017-11-09 [SC] [有効期限: 2019-11-07]
... 略 ...
$ gpg --armor --export <サインキー> | pbcopy

コピーした GPG key を GitHub アカウントに追加

https://github.com/settings/keys

GPG Key ID を .gitconfig に追加

家と仕事場でキーを変えてみようと思い、.gitconfig.local に設定して include するようにした。

$ vi ~/.gitconfig.local
[user]
  signingkey = <サインキー>

共用したければ export & import すれば良い。

$ gpg -o secret.key --export-secret-key <メールアドレス>
... 持ち運び ...
$ gpg --import secret.key

その他細かい設定

必要だったので追加した(ちゃんと調べてない)。

$ vi ~/.zshrc
export GPG_TTY=$(tty)

毎回 git commit -S したくない場合。

$ vi ~/.gitconfig
[commit]
  gpgsign = true

ちなみに

GPG Key 作成時に、自分の GitHub アカウントで認証していないメールアドレスを使うと Unverified になる。
f:id:utahta:20171110011130p:plain

全ての commit に署名をつけるのは悪手という話もみたけど、今回の意図とはそぐわないのでみなかったことにした。

パニック障害と脳MRI

発症

9月14日、いつものように朝会をしているとき、ふわふわとした感覚になった。
ここ半年ほど、たまにそういった症状になることがあり、またかと思った。
いつもすぐ治るので、今回もそうだろうと思った。
けど、その日はそれで治まらなかった。

突然、動悸と共に猛烈な勢いで心拍数が上がるのを感じた。
BPMで200くらい。落ち着こうとしても全く制御できない。
とにかくこれはヤバイという不安でいっぱいになった。
いよいよマズいと思ったので、体調悪いことを伝えて朝会をぬけ、深呼吸を続けた。

BPM200の異常な心拍数は治まってきた。
でも動悸はするし、今度はなんだか手足が痺れてきた。
完全にヤバイと思ったので、病院に向かった(上司が付き添ってくれて本当に有難かった)。

動悸・心拍数の上昇・手足の痺れ・とにかくヤバイことを伝えて、検査の手配をしてもらう。
心電図とレントゲンと血液と念のため脳CT。

そこで脳に白い影があると分かった。他の検査は異常なし。
もしかしたらと思っていたけど、本当にそうだとどうしたらいいのか分からない。
けど、お医者さん曰くこの位置だと今回の症状とは関係ないとのこと。
内心そんなことある?と思う。
とにかく原因をハッキリさせたかったし、そのまま大病院にいくことにした。
上司は大病院まで付き添ってくれた。感謝しかない。

大病院でも結局原因はハッキリしなくて、脳MRIの予約をして帰宅する。

帰り道、症状は落ち着いてきたものの、歩くとふわふわするし頭部はずっと鳥肌が立っているし不安な感覚は続く。
万が一に備えて両親に電話する。
症状を一通り説明すると、父親に自律神経失調症では?と言われた。

検証

主な症状は、動悸・頻脈・息苦しさ・手足の痺れ・異常な不安感。
いろいろ調べてみると、たしかに自律神経失調症の症状と一致する。

手足の痺れは、酸素の取り込みすぎが原因の過換気症候群にみえる。
両手で鼻と口を覆うようにして深呼吸するとずいぶん落ち着いた。

それでもまだ脳の件もある。
翌日は大事をとってお休みをもらい、そのまま土日祝の3連休へ。

土曜日、症状はほとんどなくなり、治った気がした。
日曜日、様子見を兼ねてスーパーへ買い物に向かう。
けど、買い物はできなかった。
店内の明るさ・BGM・人混み・子供の声、すべてが刺激物のようだった。

でも、おかげで絞り込めた。
ここでようやく、これは神経やっちまってると確信した。

マンガでおなじみのゆうメンタルクリニックを思い出して調べてみる。
意外と各地の駅前にあることが分かって、すぐ予約も取れたので、そこに行くことにした。

治療

人混みが厳しいみたいな状態だったので、クリニックまで歩いた。
大通りは避ける。

診察室で症状を一通り説明すると、パニック障害ですねと言われた。
お医者さんに、いま一番過敏になっていると思いますと言われて少しホッとする。
これ以上になるといろいろと面倒だから。

長くじわじわ効く薬と、短くつよく効く薬の2種類を貰った。
短くつよく効く薬をすぐさま飲む。

薬を貰った時点ですこし症状が治まったので、やっぱり神経という感じだった。

とすると、あの脳の白い影はなんだったのか。

MRIの結果、生まれつき血管がこんがらがってるのでしょうと言われた。
つまり問題はないそう。
ふわっとした内容にモヤモヤしたけど、まぁ問題ないなら良かった。

現在

長くじわじわ効く薬を2日に一度くらいのペースで飲んでる。
4日くらいで効き目完全消滅するらしい。
まぁ徐々に飲む回数を減らしていければいいかなという気持ち。
普通に仕事もライブも音ゲーもいける。
症状的には軽いようで助かってる。

今後

運動不足や栄養バランスの偏りも少なからず影響あると思っている。
とりあえずその2つを解消する。
一度発症すると完治まで結構かかるみたいなので、その前に対策するべきだった。
堕落した生活はたのしい。

とりあえずジム通いと自炊をゆるふわにやっていく。