Goのシンプルさについて
自己紹介
twitter : pospome
blog :pospomeのプログラミング日記
職種 : サーバサイドエンジニア
興味  : クラス設計全般, DDD
アイコン:羊じゃなくてポメラニアンです
Go からシンプルさを感じたことを話そうかと思います
時間限られているので
サラッとしか説明できませんが・・・
・package private
・コンストラクタ
・struct に static な method
・package private
・コンストラクタ
・struct に static な method
自分が触ったオブジェクト指向言語には
アクセス修飾子として以下が用意されていた
モジュールレベルの public, private
クラスレベルの public, protected, private
特にクラスレベルのアクセス修飾子は強力
クラスは自分自身のプロパティ、メソッドに対して
公開、非公開をコントロールできる
仮に
1つのモジュールに大量のクラスを突っ込んでも
触られたくないものをクラスレベルで隠すことができるので
ある程度の秩序は保たれる
最悪モジュールの依存関係、粒度は気にしなくても
なんとかなる
なので、クラスをどう設計するかを重心する印象
普段モジュール同士の依存関係とか粒度とかって
考えて設計してますか?
一方、Goにはパッケージレベルのアクセス修飾子しかない
同じパッケージであれば、
struct, function, value は触り放題
仮に
1つのパッケージ内に大量の struct を突っ込むと
全てが触り放題になってしまう
触られたくないものが存在する場合、
パッケージを分けて package private にする必要がある
つまり、Go では
パッケージレベルのアクセス修飾子だけ考えればいい
パッケージの循環参照が禁止なこともあり、
パッケージレベルで
粒度、公開範囲、依存方向を考えるべき
struct ベースで考えてもこれらは解決できない
struct は保持する値と振る舞いの管理だけ考えればいい
パッケージと struct で妙な責務の分離ができている
シンプルな点
package private しかない
パッケージレベルのアクセス修飾子しか提供しない
・package private
・コンストラクタ
・struct に static な method
Go にはコンストラクタがない
NewXxxx() という function が
コンストラクタのような役割を担っている
実質 static な factory method みたいな実装になる
個人的にはコンストラクタよりも
実装パターンとしての
static な factory method が好き
「どんなオブジェクトを生成するのか」
をメソッド名で表現できるから
シンプルな点
コンストラクタはないので function で実装する
・package private
・コンストラクタ
・struct に static な method
Go では
struct に static な method を持たせることができない
最初は違和感しかなかったし、
static method 欲しかったので、
無理やりそれっぽい実装したこともあった
ただ、最初に説明したとおり、
Go はパッケージを中心に考えた方がいい気がする
無理やり struct に static method を持たせることに
違和感があるのも事実
今では大人しく function で実装しています
シンプルな点
struct に static method は生やせないので
function で実装する
まとめ
・package private しかない
・コンストラクタはない
・struct に static method はない
削ることによってシンプルになっている
個人的には多機能な言語は魅力的だった
自分のやりたいことに対して
何かしらの適切な選択肢が存在する
ただ、Goを触ってみて、
多機能な言語は不適切な選択をしてしまうリスクも
あると思った
例
「継承が悪いのではない、お前の使い方が悪いだけだ」
Go から学んだシンプルさは
他の言語を書くときにも役立つと思う
いろんな言語を触ってみるって大事ですね
(´・ω・`)
おわり

More Related Content

ODP
Goのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考える
PDF
マイクロサービスバックエンドAPIのためのRESTとgRPC
KEY
やはりお前らのMVCは間違っている
PDF
オブジェクト指向の設計と実装の学び方のコツ
PDF
PostgreSQLアンチパターン
PDF
SQLアンチパターン - ジェイウォーク
PDF
例外設計における大罪
PDF
オブジェクト指向できていますか?
Goのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考える
マイクロサービスバックエンドAPIのためのRESTとgRPC
やはりお前らのMVCは間違っている
オブジェクト指向の設計と実装の学び方のコツ
PostgreSQLアンチパターン
SQLアンチパターン - ジェイウォーク
例外設計における大罪
オブジェクト指向できていますか?

What's hot (20)

PDF
ソースコードの品質向上のための効果的で効率的なコードレビュー
PDF
ドメインオブジェクトの見つけ方・作り方・育て方
PDF
Spring Boot × Vue.jsでSPAを作る
PDF
ドメイン駆動設計 モデリング_実装入門勉強会_2020.3.8
PDF
DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話
PDF
At least onceってぶっちゃけ問題の先送りだったよね #kafkajp
PDF
オブジェクト指向エクササイズのススメ
PDF
Pythonの理解を試みる 〜バイトコードインタプリタを作成する〜
PDF
正しいものを正しく作る塾-設計コース
PDF
3分でわかるAzureでのService Principal
PDF
怖くないSpring Bootのオートコンフィグレーション
PPTX
「DNS浸透いうな」と言うけれど… (#ssmjp 2018/07)
PDF
「GraphDB徹底入門」〜構造や仕組み理解から使いどころ・種々のGraphDBの比較まで幅広く〜
PPTX
やってはいけない空振りDelete
PDF
Pythonによる黒魔術入門
PDF
DDDのモデリングとは何なのか、 そしてどうコードに落とすのか
PDF
DDDを実践できるエンジニアを育成するための取り組みについて
PDF
ドメイン駆動設計のためのオブジェクト指向入門
PDF
ドメイン駆動設計 本格入門
PDF
継承やめろマジやめろ。 なぜイケないのか 解説する
ソースコードの品質向上のための効果的で効率的なコードレビュー
ドメインオブジェクトの見つけ方・作り方・育て方
Spring Boot × Vue.jsでSPAを作る
ドメイン駆動設計 モデリング_実装入門勉強会_2020.3.8
DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話
At least onceってぶっちゃけ問題の先送りだったよね #kafkajp
オブジェクト指向エクササイズのススメ
Pythonの理解を試みる 〜バイトコードインタプリタを作成する〜
正しいものを正しく作る塾-設計コース
3分でわかるAzureでのService Principal
怖くないSpring Bootのオートコンフィグレーション
「DNS浸透いうな」と言うけれど… (#ssmjp 2018/07)
「GraphDB徹底入門」〜構造や仕組み理解から使いどころ・種々のGraphDBの比較まで幅広く〜
やってはいけない空振りDelete
Pythonによる黒魔術入門
DDDのモデリングとは何なのか、 そしてどうコードに落とすのか
DDDを実践できるエンジニアを育成するための取り組みについて
ドメイン駆動設計のためのオブジェクト指向入門
ドメイン駆動設計 本格入門
継承やめろマジやめろ。 なぜイケないのか 解説する
Ad

More from pospome (9)

PDF
トランザクションスクリプトのすすめ
PDF
MicroServices & APIs
ODP
どこに何を書くのか?
PDF
アプリケーションコードにおける技術的負債について考える
PDF
Datastore/Go のデータ設計と struct の振る舞いについて
PDF
パッケージの循環参照
PDF
Controllerのbefore_actionにおける インスタンス変数セットについて
PDF
REST API のコツ
PDF
サーバサイドNodeの使い道
トランザクションスクリプトのすすめ
MicroServices & APIs
どこに何を書くのか?
アプリケーションコードにおける技術的負債について考える
Datastore/Go のデータ設計と struct の振る舞いについて
パッケージの循環参照
Controllerのbefore_actionにおける インスタンス変数セットについて
REST API のコツ
サーバサイドNodeの使い道
Ad

Goのシンプルさについて