commit history
- 2020/12/06 23:44:20 f1bac84
- 2020/12/06 23:43:16 3c7a35b
- 2020/12/06 23:20:11 e198fb1
headline
まず調べてみた
- s,o,l,i,dそれぞれに簡潔な例が乗っていてわかりやすく感じた。
- このリポジトリもs,o,l,i,dそれぞれの簡潔な例文
- クラスを変更する理由は複数存在してはいけない
- 変化の兆候がないのにSRPを含めた原則を適用するのは賢明ではない。原則を適用することを目的にするのはナンセンスである。
- 結合している役割を見つけそれらを分離する作業は、ソフトウェア設計の本質である
実装してみた
上記記事を読んで、 変化の兆候がないのにSRPを含めた原則を適用するのは賢明ではない。原則を適用することを目的にするのはナンセンスである。 によって、小さい例文だけで表そうとするのではなく、結合してしまった時に分離するのが正しい順番だと思ったが、とりあえず小さい例文を考えて実装してみた
interface User {
name: string;
id: number;
}
type NoticeType = 'email'|'sms';
class User {
constructor(user:{name:string,id:number}) {
this.name = user.name
this.id = user.id
}
set setName(value:string) {
this.name = value
}
}
class UserSettings {
noticeType: NoticeType;
#user: User;
constructor(user:User, noticeType:NoticeType) {
this.#user = user
this.noticeType = noticeType
}
set setNoticeType(value:NoticeType) {
this.noticeType = value
}
get getNoticeType(){
return this.noticeType
}
}
const bob = new User({name:'bob',id: 1})
const bobSettings = new UserSettings(bob, 'email')
bobSettings.setNoticeType = 'email'
console.log(bob)
console.log(bobSettings)この実装なら、UserはUserの変更(名前)のみを請け負ってるし、Userの通知に関して変更する場合はUserSettingsをUserを引数にとって実装する必要があり、機能ごとに分割できていると思った。
気づいた問題点を上げる
-
UserSettingsがUserを受け取っているが使っていない
- rubyだと、userインスタンスを受け取ってuserに保存する必要があるので、setNoticeTypeでthis.#user.noticeType = valueみたいに使うだろうと思ってこうした。
いいと思った点
-
UserSettingsからUsreが見えない。
- consoleに出力するとわかるが、UserSettingsからはUserが見えない。#でprivateなアクセサを定義できる。TypeScript3.8から使えるようだ
- https://www.typescriptlang.org/docs/handbook/classes.html#ecmascript-private-fields