0️⃣
[読書メモ]オブジェクト設計スタイルガイド 3章6~8節 with TypeScript
オブジェクト設計スタイルガイドを読みながら、TypeScriptでやるならどうやるかを考えながら書きました。
要約的に読める内容になっていると思うので、サクッと3分ぐらいで読める記事となっています。
3.6 複合値を表現する新しいオブジェクトを抽出する
例: Amount と Currency
class Amount {
get val() {
return this._val
}
constructor(private _val: number) {
if (_val <= 0) {
throw new Error()
}
}
}
const Currency = {
JPY: "JPY",
USD: "USD"
} as const;
type Currency = (typeof Currency)[keyof typeof Currency];
class Currency_VO {
get val() {
return this._val
}
constructor(private _val: Currency) {
}
}
// NG
class Converter{
convert(amount: Amount, local: Currency, target: Currency) {
}
}
// OK
class Money {
constructor(private amount: Amount, private currency: Currency) {
}
}
3.7 アサーションを使ってコンストラクタ引数を検証する
メソッドの冒頭でのチェックをアサーションと呼ぶ。前提チェックともいう。
基本的にはアサーションライブラリを使って検証しましょう。
3.8 依存関係は注入せずに必要ならばメソッド引数として渡す
サービスは依存関係を持つことができるので、コンストラクタ引数として渡すのが良いが、、、
サービス以外では、値や値のリストを受け取るように留めること。
interface PasswordHasher {
hash(password: string): string
}
class User {
private name: string
private hashedPassword: string
constructor(name: string) {
this.name = name
}
setPassword_Q(plainTextPassword: string) {
this.hashedPassword = "" // ここでPasswordHasherサービスを使い、ハッシュ化したい。
}
setPassword_Ans(plainTextPassword: string, hasher: PasswordHasher) {
this.hashedPassword = hasher.hash(plainTextPassword)
}
}
Discussion