@@ -685,20 +685,23 @@ func main() {
685
685
// footnote[wire][@<href>{https://github.com/google/wire}]
686
686
// footnote[simplicity][@<href>{https://employment.en-japan.com/engineerhub/entry/2018/06/19/110000}]
687
687
688
- == 終わりに
689
- 本章では、SOLIDの原則のおさらいをしました。
690
- そして、SOLIDの原則の各原則が@<tt>{Go}のプログラミングの中でどう表出されるのか確かめました。
691
- @<tt>{Go}は一般にオブジェクト指向言語と呼ばれるプログラミング言語がもつ特徴を十分に備えていません。
692
- そのような@<tt>{Go}でもオブジェクト指向設計のプラクティスや原則を守ることで、よりよいいコードを書くことができます。
688
+ === @<tt>{依存関係逆転の原則}と@<tt>{Go}
689
+ @<tt>{DIP}を使うことでパッケージ間、構造体間の結合度を下げることができます。
690
+ ただし、早すぎたり過剰な抽象化はソースコードの可読性を下げたり、手戻りが発生しやすくなります。
691
+ 他言語で@<tt>{DI}ツールが重宝されるのは以下の理由もあります。
692
+
693
+ * @<tt>{DLL}ファイルや@<tt>{Jar}ファイルから実行時に動的にクラスをロードできる
694
+ * フレームワークや@<tt>{UI}に依存した実装を避けたい
693
695
694
- ただし、早すぎたり過剰な抽象化はソースコードの可読性を下げたり、手戻りが発生しやすくなります 。
695
- 特に、@<code>{interface}を使った過剰な抽象化には注意が必要です。
696
+ データベースに依存させたくないなどの理由がある場合など、@<tt>{DI}の利用は適切に用法用量を守って使いましょう 。
697
+ 特に、@<code>{interface}を使った過剰な抽象化には注意が必要です。
696
698
@<tt>{Go}はインターフェースを使ったダックタイピングを採用しているため、次の箇条書きの情報を得るにはIDEなどの助けが必要になります。
697
699
698
700
* ある@<tt>{struct }がどの@<code>{interface}を継承しているのか
699
701
* ある@<code>{interface}を継承している@<tt>{struct }はどれだけ存在しているのか
700
702
701
- @<list>{ensure_interface}は@<code>{Knight}型が@<code>{Jedi}インターフェースを満たしているか、コンパイル時に検証させる方法です@<fn>{ensure}。
703
+ 現実的な解法の1 つとして、ある構造体(実装の詳細)が特定のインターフェースを実装しているかコンパイラにチェックさせる方法があります@<fn>{ensure}。
704
+ @<list>{ensure_interface}は@<code>{Knight}型が@<code>{Jedi}インターフェースを満たしているか、コンパイル時に検証させる方法です。
702
705
このようなプラクティスはあるものの、過剰な抽象化をしないように気を付けましょう。
703
706
704
707
// list[ensure_interface][コンパイラを使った実装チェック]{
@@ -714,7 +717,11 @@ var _ Jedi = (*Knight)(nil)
714
717
715
718
// footnote[ensure][@<href>{https://splice.com/blog/golang-verify-type-implements-interface-compile-time/}]
716
719
717
-
720
+ == 終わりに
721
+ 本章では、SOLIDの原則のおさらいをしました。
722
+ そして、SOLIDの原則の各原則が@<tt>{Go}のプログラミングの中でどう表出されるのか確かめました。
723
+ @<tt>{Go}は一般にオブジェクト指向言語と呼ばれるプログラミング言語がもつ特徴を十分に備えていません。
724
+ そのような@<tt>{Go}でもオブジェクト指向設計のプラクティスや原則を守ることで、よりよいいコードを書くことができます。
718
725
719
726
== 参考文献
720
727
最後に、本章を執筆するにあたって参考にした書籍を挙げておきます。
0 commit comments