מה התועלת משימוש באובייקט?
-
אולי הניסוח של הכותרת קצת לא במקום, אבל אני מנסה להבין האם הקוד שלי בנוי בצורה הנכונה.
יש לי פונקציה שאמורה להחזיר מידע חודשי, המידע מחולק לשבועות, לכל שבוע יש ימים, ולכל יום יש סט ערכים.הבסיס נראה כך:
let monthly_data = class { constructor(month, year) { this.month = month; this.year = year; } get_data = function(){ var self = this; return $.ajax({ type: 'POST', url: 'data.php', data: { m: this.month, y: this.year, action: 'get_monthly_data' }, dataType: "json", success: function(data) { console.log("Data added!", data); self.data = data; }, error: function(){ swal.fire('ajax error'); } }).fail(function(){ swal.fire('error'); }); } get weeks(){ var weeks = []; return weeks; } }; function get_monthly_data(m, y){ var ttt = new monthly_data(m, y); ttt.get_data().then(function(data){ console.log(data.msg); }) }
כפי שניתן לראות - הפונקציה (method)
get_data
בקלאסmonthly_data
מחזירה פרומיס שמחזיר את המידע מ-AJAX.
במבט שטחי נראה שיכולתי פשוט ליצור פונקציה רגילה שתחזיר את המידע מה-AJAX. האם יש תועלת בכך שאני מכניס את זה לתוך תבנית של אובייקט?
האם יש דרך לשפר את הקוד? -
@איש-נחמד לפום ריהטא אני לא רואה פה שום תועלת בעובדה שזה קלאס. אדרבה בלי קלאס הקוד יותר פשוט.
קלאס יכול להיות שימושי כאשר יש state אחר חוץ מהארגומנטים עצמם. או כאשר אתה מוסיף פונקציות utility על הקלאס שמפשטים פעולות נפוצות.
אבל פה לקחת פונקציה פשוטה והפכת אותה לקלאס קיבלת רק יותר מלל בלי שום תועלת.האם לא ניתן לפשט את הקוד שלך לזה:
function get_monthly_data (m, y) { return $.ajax({ type: 'POST', url: 'data.php', data: { action: 'get_monthly_data', m, y }, dataType: "json" }) } // usage get_monthly_data(m, y).then( (data, textStatus, jqXHR) => doStuff(), (jqXHR, textStatus, errorThrown) => dealWithIt() )
-
@איש-נחמד תחשוב על קלאס בצורה זו: זה אבסטרקציה לקבוצה של דאטה שקשורים אחד לשני ויש להם התנהגויות תלויות הדדי.
למשל, אתה כבן אדם, לא נתאר אותך כקבוצה של מולקולות שמאוגדים בצורה מסויימת ומשפיעם אחד על השני בצורה מסויימת, אלא נאגד את הכל למושג אחד: אדם. הוא הדין בתכנות, אם יש לך תיאור למושג מופשט שמכיל קבוצה של דאטה והתנהגויות, אפשר לעשות מזה אובייקט ולחשוב על זה בצורה יותר אבסטרקטית, עם כמה יתרונות (למשל אפשרות להסתיר את המימוש משאר הקוד ולחשוף רק ממשק קטן מוגדר, זה מקל על שינויים בקוד).
במקרה שלך, המושג של שליפת מידע חודשי, זו פעולה. אין סיבה להפוך פעולה לקלאס, יש לנו כבר אבסטרקציה מצויינת עבור פעולות: פונקציה.
הקבוצה של (חודש, שנה) יכול להיות בסיס לאבסטרקציה ראויה, כלומר במקום להסתכל על זה כשני פיסות דאטה לא קשורות, אפשר לאגד אותם תחת קלאס בשם "תאריך-חודש" או משהו כזה (טוב, שמות טובות זו אחת מהבעיות הגדולות והמפורסמות במדעי מחשבים... ). אבל זה לא מה שניסית לעשות. וגם אם תעשה את זה, לא הייתי שם את המתודה
get_data
על הקלאס הזה, כי זה לא חלק מתיאור האובייקט, אלא הייתי מצהיר שפונקצייתget_monthly_data
מקבלת אובייקט של "תאריך-חודש" במקום שתי פיסות המידע של חודש ושנה בנפרד.גילוי נאות: אני לא משתמש גדול של OOP, וגם לא מבין גדול בנושא. כתבתי הנלע"ד כעת.