ToCode

חדשים באתר? לחצו כאן כדי ליצור משתמש  שכחתי סיסמה 

זהו נושא דיון מלווה לערך המקורי שב־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