ABA


"|מדריך|סטנדרטים בסיסיים כשמפתחים בJavascript"
גירסת הדפסה        
קבוצות דיון פיתוח, תיכנות ובניית אתרים נושא #10870 מנהל    סגן המנהל    מפקח   Winner    צל"ש   מומחה  
אשכול מספר 10870
יוחאי
חבר מתאריך 30.12.15
163 הודעות, דרג אמינות חבר זה
   02:12   12.09.12   
אל הפורום  
  |מדריך|סטנדרטים בסיסיים כשמפתחים בJavascript  
 
   ערכתי לאחרונה בתאריך 12.09.12 בשעה 10:44 בברכה, יוחאי
 
קודם כל המדריך מיועד גם למי שפחות חזק בשפה, אם לא הבנתם משהו תשאלו, ואני אסביר, או לפחות אנסה להסביר!

1.כיצד לייצר מופע יחיד לאובייקט בJS הידוע בכינוי Singleton:

מה זה Singleton - הרבה אנשים היום מפתחים מול תשתיות שמבוססות MVC, הרבה גם לא יודעים שSingleton הוא חלק הכרחי בMVC(לפחות לפי הסטנדרט), נניח ויש לנו מספר מחלקות ששייכות ממש לליבת המערכת נקרא להן בשמות:

core1
core2
core3

אנחנו לא מעוניינים לייצר להם יותר ממופע אחד, מה זאת אומרת מבחינת הקוד?

הדוגמא הבאה יוצרת אובייקט בדרך שכן מאפשרת לנו ליצור יותר ממופע אחד:



var core1 = function () { };

core1.prototype.setSomething = function () { };

var x = new core1();
var y = new core1();



מה שבעצם אנחנו רואים כאן שיצרנו אובייקט בתוך core1, כל אובייקט מעצם היותו אובייקט מכיל בתוכו prototype property כאן יש לנו את האופציה לייצר בעצם את כל הפונקציות/ערכים שיוחצנו מחוץ לאובייקט, זאת אומרת יהיו public אפשר לעשות את זה גם דרך הprototype וגם דרך הconstructor (ולהשתמש בthis), עכשיו זאת אחלה דרך לייצר אובייקטים אם המטרה שלנו היא אובייקט שאנחנו נשתמש בו יותר מפעם אחת, נניח אתר שמכיל אוסף של מכוניות כל מכונית יש לה קלאס עם מידע שונה, אז צריך לקחת את אותו class ולעשות לו new כל פעם מחדש עם המידע הנכון (זאת דוגמא נורא נורא מופשטת).

זה בעצם ההסבר למה שאנחנו כרגע לא רוצים לעשות, מה שכן ככה ייראה הקוד שלנו אם נרצה לייצר מופע בודד:


var core1 = (function () {
//define here private variables and functions

return {
setItem: function () { }
}
})();



אנחנו משתמשים פה בכלי מאוד מאוד חזק בjavascript שנהוג לקרוא לו self invoke, מה שבעצם אנחנו אומרים לparser לעשות זה דבר די פשוט, ברגע שהוא רואה את המבנה של הפונקציה שמריצה את עצמה, הוא פשוט מריץ אותה, ובתוך core1 אנחנו נקבל את הערכים שהיא מחזירה (במקרה שלנו אם זה class אז פונקציות וproperties).

דרך אגב החלק הנחמד עם self invoke הוא שאנחנו נמנעים מלהסתבך מול הscope הגלובאלי, מה שגורם לקוד שלנו להיות חסין מהשפעות מבחוץ, דוגמא נחמדה יכולה להיות היא אם למשל יש לנו בתור הפונקציה הזאת משתנה בשם $ ואנחנו רוצים להעביר את jQuery אז זה די פשוט:


var core1 = (function (jQuery_Instance) {
//define here private variables and functions

var getElements = jQuery_Instance.find('#edit-link');

return {
setItem: function () { }
}
})($);



נחמד אה?

החלק הבא הוא שימוש בnamespaces, מה זה בדיוק אומר:

רוב הזמן אנחנו לא מודעים לכך, אבל משתנים שאנחנו יוצרים בscope הגלובאלי, יושבים לנו בתור האובייקט window שזה הגיוני זאת הרמה הראשונה מבחינת העמוד, עכשיו הרבה פעמים יכול להווצר מצב שאנחנו נתנגש עם האובייקט, במיוחד אם אנחנו עובדים עם המון קוד, והמון שמות משתנים, לכן תמיד עדיף ליצור תחת window איזה שהוא אובייקט שתחתיו נכניס ככול העולה על רוחנו.

סדר בקוד: javascript היא שפה מאוד נוחה, היא לא תכעס עליכם אם לא תייצרו את כל המשתנים למעלה במקום אחד, אבל בשביל הסדר הטוב, מומלץ לסדר את המשתנים בצורה כזאת שלא תצטרכו להתאמץ יותר מדי כדי לדבג את הקוד, וגם לא להשתמש בהצהרה אחת של המילה var על 10 משתנים, קודם כל תחשבו על זה שאם שכחתם פסיק קטן בהוספה של משתנה, זה טיפה מעצבן, מה שגם מי שעובד עם כלים של debugging יודע שאין כמו לעבור שורה שורה משתנה משתנה ולהסתכל על התכולה שלו, מה שלא מאופשר עם הצהרה של var יחיד.

משתנים - תמיד מתחילים באות קטנה אם יותר ממילה אחת מחוברת אז פשוט עושים לכל מילה אחרי המילה הראשונה upper case לאות הראשונה.

קבועים - בJS אין באמת קבועים, מה שכן עדיף להיות חכם ופשוט לייצר משתנים שאנחנו בוודאות יודעים שאנחנו לא נוגעים בהם, והם יהיו הקבועים שלנו, קבועים תמיד באותיות גדולות,


חלוקה של רכיב אחד לתתי רכיבים:

טוב זה נושא קצת מורכב, ולא פשוט להסביר את כוונת המשורר, אבל נתחיל מהעקרון הפשוט פונקציה שמכילה יותר מ20 שורות, שמבצעות יותר מתפקיד אחד בתוך הפונקציה, זאת לא פונקציה שכתובה טוב והינה דוגמא:



var NotGoodCode = (function () {
return {
calculate: function () {
var result = 0;

for (var i = 0; i < arguments.length; i) {
result = arguments[i];
}

result = (Math.PI * 3000);

$("#result").html(result);
}
}
})();



הפונקציה כמו שאתם רואים מתחילה בזה שהיא עוברת על הפרמטרים שהיא מקבלת בקריאה, מחברת אותם, מבצעת עליהם חישוב, ואז מכניסה את החישוב אל תוך העמוד.

הפונקציה תעבוד מצויין, הבעיה היחידה איתה היא מצב שבו יש באג, כרגע מדובר בפונקציה של כמה שורות בודדות, אז אנחנו נוכל לדבג את זה די בקלות ולפתור, אבל תדמיינו 500 שורות קוד, שמתעסקות עם HTML ועם חישובים, ובקשות לשרת, ומיליון דברים אחרים, קשה מאוד מאוד למי שאין ניסיון לדבג את זה, לכן יהיה נוח יותר לחלק את הפונקציה לפונקציות קטנות, ולטפל בחריגים בתוך כל פונקציה למשל:



var GoodCode = (function () {
function make_some_calc(n) {
try {
var r = n (Math.PI * 3000);
} catch (e) {
//we have sub function error (we also write logs to get more information on the debug;

console.error("Message", e.message);
}
return r;
};

function set_html(result) {
try {
$("#result").html(result);
} catch (e) {
}
};

return {
calculate: function () {
var result = 0;

for (var i = 0; i < arguments.length; i) {
result = arguments[i];
}

result = make_some_calc(result);

set_html(result);
}
}
})();



עכשיו אולי הקוד נראה לכם טיפה יותר ארוך, אבל אם תסתכלו קצת יותר לטווח הארוך, לכל מתכנת שייצטרך לטפל בקוד, זה יהיה ממש כמו לקרוא ספר הוראות.

תרגישו חופשי לשאול שאלות


                                שתף        
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד

  האשכול     מחבר     תאריך כתיבה     מספר  
  סחטיין, תודה רבה asco88  12.09.12 06:33 1
  כל הכבוד :] מתי שיעור הבא? dvir8 12.09.12 08:18 2
     חח כשיהיה לי זמן, אם אתה צריך משהו ספציפי אין בעיה שתשאל ואני אמצא זמן יוחאי 12.09.12 10:51 8
  מה אומר return כשאתה מכניס אותו לפוקנציה עם בלוק? dvir8 12.09.12 08:33 3
     תשובה יוחאי 12.09.12 10:51 7
  כל הכבוד על היוזמה יוחאי Net_Boy  12.09.12 10:12 4
     חחח כה מישהו ערך אותו ומחק בטעות בעע יוחאי 12.09.12 10:40 5
         וכמובן שבטעות השארתי את החלון של הכתיבה עוד פתוח אז מצאתי שחזור חח יוחאי 12.09.12 10:44 6
  תודה על ההשקעה אורי  14.09.12 14:24 9
  זה בעצם סוג של class נכון? dvir8 17.09.12 13:03 10

       
asco88 
חבר מתאריך 17.6.04
26757 הודעות, דרג אמינות חבר זה
   06:33   12.09.12   
אל הפורום  
  1. סחטיין, תודה רבה  
בתגובה להודעה מספר 0
 


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
dvir8
חבר מתאריך 13.5.02
5929 הודעות, דרג אמינות חבר זה
   08:18   12.09.12   
אל הפורום  
  2. כל הכבוד :] מתי שיעור הבא?  
בתגובה להודעה מספר 0
 
  


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
יוחאי
חבר מתאריך 30.12.15
163 הודעות, דרג אמינות חבר זה
   10:51   12.09.12   
אל הפורום  
  8. חח כשיהיה לי זמן, אם אתה צריך משהו ספציפי אין בעיה שתשאל ואני אמצא זמן  
בתגובה להודעה מספר 2
 
   לכתוב עליו.


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
dvir8
חבר מתאריך 13.5.02
5929 הודעות, דרג אמינות חבר זה
   08:33   12.09.12   
אל הפורום  
  3. מה אומר return כשאתה מכניס אותו לפוקנציה עם בלוק?  
בתגובה להודעה מספר 0
 
   זה נראה כאילו אתה מחזיר JSON של פונקציה.


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
יוחאי
חבר מתאריך 30.12.15
163 הודעות, דרג אמינות חבר זה
   10:51   12.09.12   
אל הפורום  
  7. תשובה  
בתגובה להודעה מספר 3
 
   return קודם כל זה חלק מכל פונקציה, זה בעצם הערך שאנחנו מעוניינים להחזיר כשהפונקציה מסיימת לרוץ.

מה שקורה הוא שאנחנו מעוניינים לייצר אובייקט מוכן עם כל הפונקציות שלנו, מבלי שנצטרך לבצע לו new, אז אנחנו מייצרים פונקציה שמריצה את עצמה פשוט ומחזירה אובייקט עם פונקציות:

בעצם כל התוכן של הפונקציה ירוץ פעם אחת נניח:


var GoodCode = (function () {
var a = 5;

alert(a);

return {
setA: function (n) {
a = n;
},
alertA: function () {
alert(a);
}
};
})();

GoodCode.setA(3);
GoodCode.alertA();

מקווה שזה ברור יותר עכשיו!


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Net_Boy  לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 1.4.02
17151 הודעות, 1 פידבק, 2 נקודות
   10:12   12.09.12   
אל הפורום  
  4. כל הכבוד על היוזמה יוחאי  
בתגובה להודעה מספר 0
 
   המדריך נחתך או משהו כזה? אני רואה רק ממש קצת ממנו...

הערה קטנה,
אתה מניח שכולם יודעים מה זה MVC ואני לא חושב שכולם יודעים.
אני חושב שכדי להדגים מה זה Singelton כדאי לתת דוגמא קלאסית, כמו איזשהו Log Manager.


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
יוחאי
חבר מתאריך 30.12.15
163 הודעות, דרג אמינות חבר זה
   10:40   12.09.12   
אל הפורום  
  5. חחח כה מישהו ערך אותו ומחק בטעות בעע  
בתגובה להודעה מספר 4
 
  


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
יוחאי
חבר מתאריך 30.12.15
163 הודעות, דרג אמינות חבר זה
   10:44   12.09.12   
אל הפורום  
  6. וכמובן שבטעות השארתי את החלון של הכתיבה עוד פתוח אז מצאתי שחזור חח  
בתגובה להודעה מספר 5
 
  


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
אורי 
חבר מתאריך 9.7.12
20459 הודעות
   14:24   14.09.12   
אל הפורום  
  9. תודה על ההשקעה  
בתגובה להודעה מספר 0
 
  


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
dvir8
חבר מתאריך 13.5.02
5929 הודעות, דרג אמינות חבר זה
   13:03   17.09.12   
אל הפורום  
  10. זה בעצם סוג של class נכון?  
בתגובה להודעה מספר 0
 
   אבל איך אתה מונע משיטה להיות public וכד'?


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד

תגובה מהירה  למכתב מספר: 
 
___________________________________________________________________

___________________________________________________________________
למנהלים:  נעל | תייק בארכיון | מחק | העבר לפורום אחר | מחק תגובות | עגן אשכול
       



© כל הזכויות שמורות ל-רוטר.נט בע"מ rotter.net