Closed32

データ指向プログラミングを読む(Go的解釈と初春の風を添えて)

tenkohtenkoh

データ指向の恩恵として説明されていることは「複雑性を軽減し、ソフトの変更を容易にする」こと

tenkohtenkoh
  • コードとデータを分離する。
  • コードはモジュールにまとめる。(言語によって事情が違うが、例えばパッケージだったり、例えばメンバ無しのクラスオブジェクトだったり)
  • データはメソッド無しのクラスにまとめる。
tenkohtenkoh

データが不変であるかどうかは書かれていたっけ?

tenkohtenkoh

コードとデータを分離することで考えがシンプルになる。

コード(モジュール)間には使用関係しかない。データ間には合成と関連しかない。

tenkohtenkoh

コードはモジュールにまとめる。(言語によって事情が違うが、例えばパッケージだったり、例えばメンバ無しのクラスオブジェクトだったり)

実際に、後の章ではクラスオブジェクトにコードを集約している例が出てくる

tenkohtenkoh

コードは引数にデータオブジェクトを取る

tenkohtenkoh

与えられたデータオブジェクトの中身を書き換えて良いかどうかはまだ示されていない。

tenkohtenkoh

変えていいなら、Goなら構造体のメソッド生やしちゃえば良い気がするんだけど、違うんかな?

tenkohtenkoh

コードはステートレスであることは決められている

tenkohtenkoh

やはりデータはイミュータブルだった(何度でもいう)

tenkohtenkoh

データはmap[string]T(同種マップ)、配列、map[string]any の三種類のみ。
安全性を犠牲にして拡張性を高めている。

tenkohtenkoh

例えばJSONを受け取って異種マップを作ろうと思うと、json.Unmarshalだとネストした配列やオブジェクトをUnmarshalしきれない。

これに対処するにはgjsonを使うと良さそう。

gjsonはjsonのフィールドに素早くアクセスすることを特徴としている。lodashのgetやsetとの住み分けを考えた方が良いのかも

tenkohtenkoh

データのフィールドにアクセスするのはとても簡単。メソッドチェーン的なアクセスではなく、インデックスのパスを与えるだけ。

パスが第一級市民。

tenkohtenkoh

なんとなーく、データだ!と言っている意味がわかってきたような…。

tenkohtenkoh

あくまでプリミティブとコレクション、インデックスで全てを表現する。このパラダイムの根底にあるのは前述したように安全性と変更容易性のトレードオフ。

tenkohtenkoh

コードを読んでもデータの構造を知る術はない(あとでテクニックが出るらしいが)

tenkohtenkoh

存在しないキーでインデックスにアクセスすることも容易に起きうるが、単体テストしてれば当然発見できるよね、ってスタンスなのかな?

tenkohtenkoh

私たちが型を拠り所にしているのは賢いLSPの仕組みに頼って安全にコードを書いていくためであって、コードの出来栄えは型に頼っているわけではない。

tenkohtenkoh

パスの扱いについては一つ上のスレッド参照。gjson?lodash.get?を考えよう

tenkohtenkoh

後半(part3)はDOPとは関係ないようにも見える内容(コードをわかりやすく保つコツなど)が出てきた

tenkohtenkoh

DOPでのポリモーフィズムにマルチメソッドを使うところは面白く見えた。dispatch!

tenkohtenkoh

ベースであるブログ記事を和訳した付録の方が分かりやすい説がある

tenkohtenkoh

データ中心アーキテクチャ(DOA)ってのが先にあるのね(検索して知った)

tenkohtenkoh

うーん、結局オブジェクト指向で、エンティティとサービスを区別して使うのでは?

このスクラップは6ヶ月前にクローズされました