# 2021-04-21 Pair-A v2 定例
## 疑問
### 粟田
#### 値オブジェクトだけどDBにはIDがある場合
ライフサイクルがあるならエンティティ。
在籍ステータスはIDじゃなくて名前で判定できるので値オブジェクトとして扱いたい。
そうすると、ドメインモデルからIDが消える。
ただしPrismaを使う上で登録や紐づけるときにIDがどうしても必要。
- 仮に値オブジェクトとして扱うなら登録時のID生成ロジックはインフラ層で隠蔽していいのか?
- それともそういうケースにおいてはエンティティ的な扱いをすべきか?
#### ファクトリが別の集約のリポジトリを呼ぶのはありか?
そもそもそういった生成方法を隠蔽するのがファクトリなので、抽象的なリポジトリへの依存は問題なさそうな気がする。引数としてリポジトリからの戻り値を渡すほうが、ユースケース層にエンティティ生成のロジックが漏れ出してやばそう、、
#### 引数はインターフェースかクラスか
引数として受け取るオブジェクトの型はインターフェースにしておくべきか、実際のクラスにしておくべきか?
強い制約があって、コンストラクタでバリデーションをかけなきゃいけないような場合はクラス、そうでなければインターフェースが良さそうな気がする。
### 玄徳
- 課題グループや在籍ステータスの扱い方
- DBに選択肢の値を持つようにしていたが、無理では?
- 値を取得できても、どの値にどの意味があるのかをアプリケーションから判断できない
- アプリケーション側で単純にunion typesとかで持つほうがいいと思った
- DBでは"isRecess"とかのtextの値をMemberに持たせる?
→ isInitialValueとか作る
- 順番どっち?
- ドメインオブジェクト作る→サービスとかユースケース作る
- サービスとかユースケース作る→ドメインオブジェクト作る
→ 【聞く】ドメインオブジェクトから作るのが理想であるのがわかってるけど、むずかしくない?松原さんどうしてます?
- これの意味がよくわからんかった
- https://eslint.org/docs/rules/no-underscore-dangle
- 変数名とかにアンダーバーつけるのやめとけみたいなeslintルールがある
→ 【聞く】メンバーとgetメソッドを同じ名前にしたいときあるくない?でもアンダースコアつけちゃだめならどうすれば、、、(getterだけ公開したprivateメンバ変数)
### 永井
- githubのレビュアーの設定方法わからん
- 練習用のcrud見てほしい
- ファーストクラスコレクションのレビューをしてほしい、
- prismaで複合主キーの仕方
- @@id
- コントローラ層における実装をみてほしい
```typescript
class Book {
private readonly id:number
private readonly name:string
private readonly price:number
constructor(props:{id:number,name:string,price:number}) {
const { id, name, price } = props
this.id = id
this.name = name
this.price = price
}
}
class BookList {
private readonly bookList:Book[]
constructor(props:{bookList:Book[]}) {
const { bookList } = props
if (bookList.length > 4 ) {
throw new RangeError("4冊までしか登録できません。");
}
this.bookList = bookList
}
// privateでも外部からアクセスしたいのでgetアクセサを使う
get get(){
return this.bookList
}
add(book:Book) {
// concatで配列に追加してしまうと、業務ルールのチェックができなくなる。
//return this.bookList.concat(book);
// 新しくクラスを作ってそれを返すことで業務ルールを適用できる
return new BookList({bookList:[...this.bookList,book]})
}
count():number {
return this.bookList.length
}
}
const book1 = new Book({id:1,name:"15時間でわかるGit集中講座",price:2580})
const book2 = new Book({id:2,name:"達人に学ぶDB設計徹底指南書",price:2600})
const book3 = new Book({id:3,name:"失敗から学ぶRDBの正しい歩き方",price:2740})
const book4 = new Book({id:4,name:"SQLアンチパターン",price:3200})
const book5 = new Book({id:5,name:"ドメイン駆動設計入門",price:3200})
console.clear()
const bookList = new BookList({bookList:[book1]})
console.log(bookList)
//
const bookList2 = new BookList({bookList:[...bookList.get,book2]})
console.log(bookList2)
// booklistそのものの値は変更されていない。
console.log(bookList)
//
// 5冊登録すると業務ルールに弾かれるのでエラーになる
const bookList3 = new BookList({bookList:[...bookList2.get,book3,book4,book5]})
console.log(bookList3)
```
###### Tags: `Pair-A v2`