複数通貨をサポートする金銭オブジェクト
💡通貨の例
💡金銭オブジェクトの設定
プロジェクト株価合計IBM 100025 USD 25000 USD Novartis 4005150 CHF 60000 CHF合計65000ドル
基準換算レートCHFUSD 1.5
💡ワークフロー
1.やるべきことをリストアップします.
待機事項リスト
$5 + 10CHF = $10(환율이 2:1일 경우)
**$5 X 2 = $10****
→2件目のリストから始めることを意味します.テスト後にオブジェクトを作成します.
テストは小さなことから始めます.
💡TDDサイクル1-テストをすばやく追加
テストを作成するときは、製品の完璧なインタフェースを想像したほうがいいです.
私たちは今、テストコードに製品が外部でどのように見えるかについての話を書いています.
これは、
できるだけ最高のAPIから始め、逆方向に仕事をするのは、最初から複雑で見苦しいことや「現実」になるよりもいいです.
単純な乗算例
public func testMultiplication() {
let five = Dollar(5)
five.times(2)
XCTAssertEqual(10, five.amount)
}
保留中のリストの更新
$5 + 10CHF = $10(환율이 2:1일 경우)
**$5 X 2 = $10**
amount를 private으로 만들기
Dollar 부작용
Money 반올림?
💡TDDサイクル2-すべてのテストを実行し、新しく追加したテストが失敗したかどうかを確認します。
征服
- Dollar 클래스가 없음.
- 생성자가 없음.
- times(int) 메서드가 없음.
- amount 필드가 없음.
作成
Dollar
class Dollar {
var amount: Int!
init(_ amount: Int) { }
func times(_ multiplier: Int) { }
}
💡TDDサイクル3-コードを少し変更します。
class Dollar {
var amount: Int! = 10 //수정부분
init(_ amount: Int) {}
func times(_ multiplier: Int) {}
}
💡TDDサイクル4-すべてのテストを実行し、すべてが成功したことを確認します。
amount
を修正した後、XCTAssertEqual(10, five.amount)
のテストに成功した.💡TDDサイクル5−再包装により重複を排除した。
💡 依存性と重複性
スティーブ・フリーマン氏は、テストとコードの間の問題は重複していないと指摘した.問題は、テストとコードの間に存在する依存性です.すなわち、コードまたはテストのいずれかを変更する場合は、別のコードを変更する必要があります.
コードを変更せずに有意義なテストを作成することを目標としていますが、現在の実装は不可能です.
依存性はソフトウェア開発の各段階における核心的な問題である.特定のデータベース・ベンダーが提供する詳細機能をコードの各セクションから別のベンダーの製品に変更する場合は、コードがベンダーに依存していることがわかります.
依存性が問題そのものであれば,繰り返しが問題の兆候である.繰り返しの最も一般的な例は論理的な繰り返しである.重複論理は、同じ文がコードの異なる場所に現れることを意味します.重複する論理を一つの論理につなげるには,オブジェクトを利用することが望ましい.
現実世界で問題の兆候だけを残して、他の場所で最悪の形で問題を暴露する一般的な状況とは異なり、プログラムでは重複を解消すれば依存性を解消することができる.これがTDDの2番目のルールが存在する理由です.次のテストを行う前に重複データを消去し、1つのコードのみを修正することで、次のテストに合格する可能性を最大限に高めた.
これまでTDDサイクルの1~4番目のプロジェクトを完了してきましたが、これで重複除外が行われます.
データも重複とみなされます.
通常、コードを比較して重複データを検索しますが、この場合、重複データは「テスト中のデータ」と「コード内のデータ」の間に存在します.
class Dollar {
var amount = 5 * 2
}
amount = 10
をamount = 5 * 2
に変更します.(10は5と2の積だったのですが…)テストコードには5と2があり、Dollarクラスにも5と2があるので、重複したデータです.
重複除外
```swift
class Dollar {
var amount: Int!
init(_ amount: Int) {}
func times(_ multiplier: Int) {
amount = 5 * 2 //수정부분
}
}
```
- 5와 2를 한 번에 제거할 수 있는 방법은 없지만, 객체의 초기화 단계에 있는 설정 코드를 `times()` 메서드 안으로 옮겨보자.
- 테스트는 통과될 것이고, 테스트 막대 역시 초록색이다.
- 이러한 단계가 작아보이지만 TDD의 핵심은 이런 작은 단계를 밟아야 한다는 것이 아니라, **이런 작은 단계를 밟을 능력을 갖추어야 한다는 것**이다.
```swift
class Dollar {
var amount: Int!
init(_ amount: Int) {
self.amount = amount //수정부분
}
func times(_ multiplier: Int) {
amount = amount * 2 //수정부분
}
}
```
- 5는 테스트 코드의 생성자에서 넘어오는 값이니 amount 변수에 저장해보자.
```swift
class Dollar {
var amount: Int!
init(_ amount: Int) {
self.amount = amount
}
func times(_ multiplier: Int) {
amount = amount * multiplier //수정부분
}
}
```
- 테스트 코드에서 인자 multiplier의 값이 2이므로, 상수를 이 인자로 대체할 수 있다.
```swift
class Dollar {
var amount: Int!
init(_ amount: Int) {
self.amount = amount
}
func times(_ multiplier: Int) {
amount *= multiplier //수정부분
}
}
```
- Dollar 클래스의 중복 제거를 위해 `amount = amount * multiplier`의 중복되는 부분도 제거하자
💡完了待機リストを表示
$5 + 10CHF = $10(환율이 2:1일 경우)
$5 X 2 = $10(완료)
amount를 private으로 만들기
Dollar 부작용
Money 반올림?
💡今までやってきたことを整理する
Reference
この問題について(複数通貨をサポートする金銭オブジェクト), 我々は、より多くの情報をここで見つけました https://velog.io/@gooreum_90/다중통화를-지원하는-Money-객체テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol