
Geek Gig 〜Goでゼロから作り直した話〜 を開催しました! #geekgig
こんにちは!Showcase Gig VPoE さとうです。 Showcase Gig では、『Geek Gig』という Geek な話をするイベントを開催しています。
この度、DONUTS社と一緒に「Goでゼロから作り直した話」というテーマでイベントを開催しました!
本エントリは、イベントレポートとして、イベント内容を簡単にまとめています! イベントの詳細は、アーカイブをご視聴ください。
イベント概要
システム移行やリニューアルでGoを選んだ話や新規サービスでGoを選んだ話など、業務でのGo活用事例を中心に、そこから学んだ知見などを共有させていただくイベントです。
Showcase Gigからは、以下の方々が登壇しました!
イベント内容
イベントレポートでは、 Showcase Gig がお話したものをピックしてレポートします!
Go+gRPCで使った次世代店舗の裏側
The Label Fruit という次世代店舗では、商品の受け渡しをスマートロッカーで行います。
@howyi_lq の発表では、オフラインの店舗にあるスマートロッカーを、オンラインのプラットフォームとどう接続したのかという裏側を語ってくれました。
次世代店舗のシステム構成は次のようになっており、ロッカー以外にもサイネージやキッチンディスプレイというデバイスとの連携も必要になります。

これに対して、gRPC利用者向けのSDKを用意して、これらのデバイスから簡単に利用できるようにしています。

ロッカーと接続するエッジサーバは、IoTロッカーソフトウェアとWebSocket&HTTPで接続する必要がありました。 単純に、gRPCとの変換サーバを用意すると、サーバ構築や運用コストもかかってしまいます。
そこで、ロッカー内部に変換サーバを作ってしまう案を考えました。

これにより、運用するサーバやデバイスを増やすことなく、プラットフォームとロッカーをgRPCで接続できました。 IoTならではの工夫を感じますね!
GoとDDDでモバイルオーダープラットフォームを型安全に作り直した話
Showcase Gigでは、事業戦略実現のためにモバイルオーダープラットフォームを作り直すことがありました。 その際に、GoとDDDを用いて作り直しをしたお話です。
モバイルオーダーと言っても、さまざまな切り口があり複雑です。 それらをプラットフォームとして提供するには、複雑さと立ち向かわなければなりません。
そこで、DDDを用いることにしました。
モデリングを進めると、次のようなモデルを発見しました。

これを実際のコードにします。 ドメイン層、ユースケース層など、次のようなコードで表現されました。



正しいモデルしか存在し得ないしくみにするのは、保守性が高く素敵ですね!
コンストラクタを経由しないオブジェクト生成
前述の struct で作成した Value Object は、コンストラクタを経由せずに作成できてしまいます。 そこで、「コンストラクタを経由しないオブジェクト生成を禁止できないのか」という話題がありました。
イベントの際に言及はされていませんでしたが、解決策の1つとして struct を private として扱い、 interface を用いることで対応ができます。 単純な Value Object で表すと次のようになります。
package value
type FirstName interface {
FirstName() string
// Value Object の振る舞いを適宜記載する
}
func NewFirstName(firstName string) (FirstName, error) {
// 許容されない値はエラーにする処理を記載する
return &stdFirstName{
firstName: firstName,
}, nil
}
type stdFirstName struct {
firstName string
}
func (f *stdFirstName) FirstName() string {
return f.firstName
}
ちょっと複雑になりますが、これでコンストラクタを強制することが可能になりました。
おわり
以上、イベントレポートでした!
Showcase Gigは、これからも"Geek"なイベントを開催してきますので、楽しみにしていてください!