זהו נושא דיון מלווה לערך המקורי שב־https://www.tocode.co.il/bundles/typescript/lessons/typescript-b2ad3e3f-a9c6-4485-ac0b-29791e63ab6a
class Summer {
numbers: Array<number> = []
add(...num: number[]) {
this.numbers = [...this.numbers, ...num];
}
total() {
return this.numbers.reduce((sum, num) => {
return sum + num
}, 0)
}
addToAll(numToAdd: number) {
this.numbers = this.numbers.map(num => num + numToAdd)
}
update(callbackfn: (num: number) => number) {
this.numbers.forEach((number, index) => {
this.numbers[index] = callbackfn(number)
})
}
}
const s = new Summer()
s.add(1)
s.add(2, 3, 4)
console.log(s.total());
// 10
s.addToAll(5)
// [6,7,8,9]
console.log(s.total());
// 30
s.update(x => x + 1)
// [7,8,9,10]
console.log(s.total());
// 34
לייק 1
הי,
התחלה מצוינת ותודה על הפיתרון!
אני חושב שכדאי להגדיר בצורה מפורשת את טיפוס ערך ההחזר של פונקציות, כי זה עוזר לתפוס טעויות. בנוסף שמתי לב שבפונקציה add
החלטת להעתיק את כל רשימת המספרים במקום לשנות אותה in place עם push
, וכך גם ב addToAll
, אבל ב update
החלטת לשנות את הרשימה in place במקום ליצור חדשה עם map
. יש סיבה להבדל?
(אני הייתי מממש את addToAll
שיקרא ל update
)
ועוד אתגר לסיום - אני אני מפעיל כמה פעמים ברצף את הפונקציה total היא תחזיר את אותה תוצאה, וכמו שהקוד כתוב היא תחשב את הסכום מחדש בכל הרצה. נסה לעדכן את הקוד כך שפונקציית total לא תצטרך לחשב מחדש את הסכום כשמפעילים אותה כמה פעמים ברצף, ותחשב אותו שוב רק אם קוראים לה אחרי שהפעילו (מאז הפעם הקודמת שקראו לה) את add, addToAll או update
class Summer {
total: number = 0;
private _values: number[] = [];
constructor() {
this.total = 0
}
private calculateTotal(): void {
this.total = this._values.reduce((acc, val) => acc + val, 0)
}
add(...args: number[]): void {
this._values.push(...args);
this.calculateTotal();
}
addToAll(n: number): void {
this._values = this._values.map(val => val + n);
this.calculateTotal();
}
updateAll(fn:(n:number)=>number): void {
this._values = this._values.map(fn);
this.calculateTotal();
}
}
לייק 1