「リファクタリング 第2版」Swiftでコーディング その9
リファクタリング 第2版
14頁 第1章 play変数の削除 「変数のインライン化(p.129)」
Swift版 main.swift
データ生成、結果表示付き。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 | import Foundation makeData () func playFor ( aPerformance : Performance ) - > Play { return plays [ aPerformance . playID ]! } func statement ( invoice : Invoice , plays : Dictionary < String , Play > ) - > String { var volumeCredits = 0 var totalAmount = 0 var result = "Statement for \( invoice . customer )\n" let format = NumberFormatter () format . numberStyle = . currency format . locale = Locale ( identifier : "en_US" ) for perf in invoice . performances { volumeCredits += max ( perf . audience - 30 , 0 ) if "comedy" == playFor ( aPerformance : perf ). type { volumeCredits += Int ( perf . audience / 5 ) } result += " \( playFor ( aPerformance : perf ). name ): " + format . string ( from : NSNumber ( value : amountFor ( aPerformance : perf ) / 100 ))! + " (\( perf . audience ) seats)\n" totalAmount += amountFor ( aPerformance : perf ) } result += "Amount owed is " + format . string ( from : NSNumber ( value : totalAmount / 100 ))! + "\n" result += "You earned \( volumeCredits ) credits\n" return result } func amountFor ( aPerformance : Performance ) - > Int { var result = 0 switch playFor ( aPerformance : aPerformance ). type { case "tragedy" : result = 40000 if aPerformance . audience > 30 { result += 1000 * ( aPerformance . audience - 30 ) } case "comedy" : result = 30000 if aPerformance . audience > 20 { result += 10000 + 500 * ( aPerformance . audience - 20 ) } result += 300 * aPerformance . audience default : print ( "error" ) } return result } let result = statement ( invoice : invoices [ 0 ], plays : plays ) print ( result ) |