@shpro654 ראשית הקוד יפה, וניכר שאתה מכיר הרבה פיצ'רים בתכנות ובES6/TS בפרט.
אתחיל מהשאלה האחרוה, הדרך צריכה להיות מקום אחד שמטפל בהכל בעזרת פונקציות משנה שכמה שיותר ממוקדות בתפקיד מסויים וכמה שפחות ממשיכים את התהליך.
בא נראה את הקוד.
א. השורה הזו:
const getAds = () => {
שקולה (כמעט) לגמרי לפונקציה רגילה:
function getAds() {
עדיף להשתמש במבנה הרגיל והארוך מתי שזה פונקציה מכובדת כשלעצמה, ולהשתמש בפונקציית חץ רק במקומות שכל מילה מכבידה כמו בפרמטר או בפונקציה קצרצרה ממש.
ב. השורה הזו:
checkIfFolderChanghd(ads) && setAds(ads);
היא טריקית, לא שזה נורא, אבל אם זה לא חוסך אין סיבה שלא לכתוב ברחל בתך הקטנה:
if(checkIfFolderChanghd(ads))
setAds(ads);
ג. הפונקציה checkIfFolderChanghd גדולה ומסורבלת מידי (כמדד עצמי, כדאי להשתדל שפונקציה תהיה מתחת 20 שורות, כמובן זה כלל גס אבל עוזר לשים לב לסטיות במטרת הפונקציה).
אני מביא את כולה ואתייחס למספרי שורות.
function checkIfFolderChanghd(ads) {
const adminAdsLength = adminSettings.adsLength
let adsLength = ads.length;
let newUpdate = '';
if (!adsLength) return true;
if (adsLength < adminAdsLength || adsLength > adminAdsLength) {
return true;
}
for (let i = 0; i < adsLength; i++) {
const { fileDateCreated } = ads[i];
if (fileDateCreated > newUpdate) {
newUpdate = fileDateCreated;
}
}
if (newUpdate <= adminSettings.update) {
return false;
}
return true;
}
בעצם נעשית פה בדיקה האם מס' האלמנטים של ads שונה ממספר האלמנטים המוגדר כעת במשתנה גלובלי, והאם אחד האלמנטים של ads יש לו תאריך חדש מאשר התאריך המקסימלי שכבר נמצא בהגדרות גלובליות.
שורה 8 בודקת אם מס' האלמנטים שונה, היא עושה זאת באריכות: די בביטוי כזה
if (adsLength != adminAdsLength)
שורות 12-17 מחלצות את התאריך המקסימלי מהads, ומשווים אם הוא גדול מהתאריך השמור במשתנה הגלובלי. יש פה שתי הערונות: א. נניח התאריך של האלמנט הראשון כבר גדול, המשך הלולאה מיותר. ב. ניתן כבר לקצר ולבדוק ישירות בלולאה במקום לבדוק רק אחרי שחזר הערך. ג. החילות המוגזם של מאפיינים מיותר לגמרי, אסור לגשת למשתנה מקונן? (במקור זה עשוי להיפטר מגישה חוזרת ונשנית למאפיין בן או להיפטר מהזיכרון שתופס כל האובייקט המלא, ופה ממילא לא ניפטר ממנו). הנה כל ההערות מיושמות:
for (let i = 0; i < adsLength; i++) {
if (ads[i].fileDateCreated > adminSettings.update)
return true;
}
גם על קוד שלי המשופץ יש לי שני שיפורים לומר.
האחד תשכחו מלולאת for כמה שיותר, זה לולאה עם קריאות מסבכת ביחס לfor of. הכל נראה אלגנטי הרבה יותר בלולאת for of:
for (const ad of ads) {
if (ad.fileDateCreated > adminSettings.update)
return true;
}
שנית, כל הלולאה מיותרת כי יש בJS פונקציה מובנית לזה בשם array.some שמקבלת פונקציה של כן/לא ומחזירה כן אם זה נכון לגבי אלמנט אחד לפחות (הראשון שהיא מוצאת) כך שאפשר לסכם את כל הפונקציה ככה:
function checkIfFolderChanghd(ads) {
return adminSettings.adsLength != ads.length ||
ads.some(ad => ad.fileDateCreated > adminSettings.update)
}
עם המשך הקוד אני אראה פעם אחרת אם יש לי זמן.
בכל אופן חזק ואמץ.