Q&A
テーマ、知りたいこと
当方、RubyとJavaScriptで仕事をしていますが、趣味でGolangを書いているものです。
golangにはstructというものがありますが、"text/template"モジュールを使う際に、全く別の概念を一つのstructに格納してしまうのではと思ったためご相談です。以下に詳細書きます。
背景、状況
一つのhtmlの画面で複数のループを行いたい場合、text/template(もしくはhtml/template)を使って以下のように書くことができます。
go
1package main 2 3import ( 4 "html/template" 5 "log" 6 "os" 7) 8 9var tmplSrc = ` 10Slice One: 11{{ range .SliceOne }} 12 {{ . }} 13{{ end }} 14 15Slice Two: 16{{ range .SliceTwo}} 17 {{ . }} 18{{ end }}` 19 20type Data struct { 21 SliceOne []int 22 SliceTwo []string 23} 24 25func main() { 26 t := template.Must(template.New("tmpl").Parse(tmplSrc)) 27 28 data := &Data{ 29 []int{1, 2, 3}, 30 []string{"one", "two", "three"}, 31 } 32 33 if err := t.Execute(os.Stdout, data); err != nil { 34 log.Fatalln(err) 35 } 36}
この例の場合は特にstruct内のsliceoneなどには意味を持たせていないので問題ないかもしれませんが、実際には一つの画面で複数の別の概念をループさせたい場合などあるかと思います。
例えば、本を投稿して一覧で閲覧できるアプリがあったとして、
「実際に投稿した本の一覧」
と
「ユーザーが投稿成功した際に画面に描画するメッセージ」
が考えられると思います。
両方とも複数個描画させたい場合、上記のコードと同じように書くと、
go
1type Data struct { 2 Books []Book 3 Notifications []Notification 4}
となるかと思います。
このような書き方だと、BookとNotificationの抽象概念がDataというものとなってしまい、モデリングとして正しいのか?と疑問に思ってしまいました。そもそもこのBookとNotificationを同じstructに格納するべきなのかと思っています。なぜなら、そんなことを言ってしまったらこの世の全てのオブジェクトはDataのstructに格納できてしまい、godclass(golangにはclassはないですが)のようなものが生まれてしまうからです。実際にはそうしないとコードが動かないのでそうしていますが。。。ただおそらくオブジェクト指向の考えで上記のような考えになっている気もしていて、golangはオブジェクト指向の言語ではないという話を聞いたことがあるので、考え方の違いなんだろうかとも思っています。
以上質問内容としましては、
・複数のオブジェクトループを実現するより良いコードはありますか?
・もしない場合、上の書き方はモデリング(DataがBooksとNotificationsの抽象概念になってしまっていること)として正しいのでしょうか?
・そもそもgolangではそのような考え方はしないのでしょうか?
何卒よろしくお願いします。
回答2件
下記のような回答は推奨されていません。
このような回答には修正を依頼しましょう。