typescriptと相性がいいです。
type句書かないのでスッキリします。
難しいことするとtype句は必要ですがrepositoryに隠蔽してしまえばアプリケーション層では全く書かないはずです。
Enterprise Business Rules
class ValueObject {
constructor(private value: any) {}
get() {
return this.value;
}
eq(valueObject: this) {
return this.value === valueObject.get();
}
}
class Entity {
constructor(
private props: {
id: ValueObject;
name: string;
}
) {}
get id() {
return this.props.id;
}
set name(value: string) {
this.props.name = value;
}
}
interface StreageInterface {
save(entity: Entity): void;
find(id: ValueObject): Entity;
}
Application Business Rules
/**
* ユースケース: Entityを取得して名前を書き換え上書き永続化
*/
class Usecase {
constructor(private repository: StreageInterface) {}
invoke(id: ValueObject) {
const entity = this.repository.find(id);
entity.name = "山田 太郎";
this.repository.save(entity);
}
}
Interface Adapters
const storeage = [
new Entity({
id: new ValueObject(1),
name: "unknown",
}),
];
class Repository implements StreageInterface {
save(entity: Entity) {
storeage.push(entity);
}
find(id: ValueObject) {
const entity = storeage.find((item) => item.id.eq(id));
if (entity) {
return entity;
} else {
throw new Error("entityが存在しない");
}
}
}
class Controller {
patch(param: string) {
new Usecase(new Repository()).invoke(new ValueObject(param));
}
}