Skip to content

Commit

Permalink
✨ 【第8章 実装を隠す】 times の一般化手前まで実装する
Browse files Browse the repository at this point in the history
・TypeScriptの循環参照でエラーになるため Dollar と Franc の実装を一旦 Money クラスに寄せる
  • Loading branch information
dodonki1223 committed Dec 12, 2021
1 parent 870259b commit 76f6989
Show file tree
Hide file tree
Showing 7 changed files with 72 additions and 32 deletions.
1 change: 1 addition & 0 deletions TODO.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,3 +12,4 @@
- [x] equalsの一般化
- [ ] timesの一般化
- [x] FrancとDollarの比較
- [ ] 通貨の概念
7 changes: 4 additions & 3 deletions src/__tests__/dollar.test.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
import { Dollar } from '../dollar';
// import { Dollar } from '../dollar';
import { Money, Dollar } from '../money';

test('times', () => {
const five = new Dollar(5);
const five: Money = Money.dollar(5);

expect(five.times(2)).toEqual(new Dollar(10));
expect(five.times(3)).toEqual(new Dollar(15));
});
6 changes: 4 additions & 2 deletions src/__tests__/franc.test.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,10 @@
import { Franc } from '../franc';
// import { Franc } from '../franc';
import { Money, Franc } from '../money';

test('times', () => {
const five = new Franc(5);
const five: Money = Money.franc(5);

expect(five.times(2)).toEqual(new Franc(10));
expect(five.times(3)).toEqual(new Franc(15));
});

19 changes: 11 additions & 8 deletions src/__tests__/money.test.ts
Original file line number Diff line number Diff line change
@@ -1,20 +1,23 @@
import { Dollar } from '../dollar';
import { Franc } from '../franc';
import { Money } from '../money';
// import { Dollar } from '../dollar';
// import { Franc } from '../franc';
import { Money, Dollar, Franc } from '../money';

test('equals', () => {
expect(new Money(5).equals(new Money(5))).toBeTruthy();
expect(new Money(5).equals(new Money(6))).toBeFalsy();
expect(new Franc(5).equals(new Franc(5))).toBeTruthy();
expect(new Franc(5).equals(new Franc(6))).toBeFalsy();
expect(new Dollar(5).equals(new Dollar(5))).toBeTruthy();
expect(new Dollar(5).equals(new Dollar(6))).toBeFalsy();
});

test('null equals', () => {
const five = new Money(5);
const francFive = new Franc(5);
expect(francFive.equals(null)).toBeFalsy();

expect(five.equals(null)).toBeFalsy();
const dollarFive = new Dollar(6);
expect(dollarFive.equals(null)).toBeFalsy();
});

test('equals Franc = Dollar', () => {
expect(new Franc(5).equals(new Dollar(5))).toBeTruthy();
expect(new Franc(5).equals(new Dollar(6))).toBeFalsy();
});

18 changes: 9 additions & 9 deletions src/dollar.ts
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
import { Money } from "./money";
// import { Money } from "./money";

export class Dollar extends Money {
constructor(amount: number) {
super(amount);
}
// export class Dollar extends Money {
// constructor(amount: number) {
// super(amount);
// }

times(multiplier: number) {
return new Dollar(this.amount * multiplier)
}
}
// times(multiplier: number) {
// return new Dollar(this.amount * multiplier)
// }
// }
18 changes: 9 additions & 9 deletions src/franc.ts
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
import { Money } from "./money";
// import { Money } from "./money";

export class Franc extends Money {
constructor(amount: number) {
super(amount);
}
// export class Franc extends Money {
// constructor(amount: number) {
// super(amount);
// }

times(multiplier: number) {
return new Franc(this.amount * multiplier)
}
}
// times(multiplier: number) {
// return new Franc(this.amount * multiplier)
// }
// }
35 changes: 34 additions & 1 deletion src/money.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,20 @@
export class Money {
// import { Dollar } from "./dollar";
// import { Franc } from "./franc";

export abstract class Money {
constructor(protected readonly amount: number) {
}

static dollar(amount: number):Dollar {
return new Dollar(amount)
}

static franc(amount: number):Franc {
return new Franc(amount)
}

abstract times(multiplier: number): Money

equals(money: Money | null) {
if (money === null) {
return false;
Expand All @@ -10,3 +23,23 @@ export class Money {
return this.amount === money.amount
}
}

export class Dollar extends Money {
constructor(amount: number) {
super(amount);
}

times(multiplier: number): Money {
return new Dollar(this.amount * multiplier)
}
}

export class Franc extends Money {
constructor(amount: number) {
super(amount);
}

times(multiplier: number): Money {
return new Franc(this.amount * multiplier)
}
}

0 comments on commit 76f6989

Please sign in to comment.