לוגו אתר Fresh          
 
 
  אפשרות תפריט  ראשי     אפשרות תפריט  צ'אט     אפשרות תפריט  מבזקים     אפשרות תפריט  צור קשר     חץ שמאלה ‎print ‎"Hello World!"; if‎ ‎not rules.‎know ‎then rules.‎read(); חץ ימינה  

לך אחורה   לובי הפורומים > מחשבים > תכנות ובניית אתרים
שמור לעצמך קישור לדף זה באתרי שמירת קישורים חברתיים
תגובה
 
כלי אשכול חפש באשכול זה



  #1  
ישן 12-02-2009, 19:36
  משתמש זכר dorM dorM אינו מחובר  
מנהל
 
חבר מתאריך: 26.07.08
הודעות: 6,473
טיפ: callback וצורת כתיבת קוד

למי מביניכם שיצא כבר לנסות לכתוב מערכות, בטח נתקל במצב בו הוא שואל את עצמו "איך אתכנן את מחלקת ה-skin בצורה הטובה ביותר כדי שהקוד ייראה הכי טוב שאפשר וגם יהיה יעיל?".

כידוע קוד PHP רץ הרבה יותר מהר מקוד SQL, ולכן בדר"כ לא מקפידים בנושא הייעול בו (מלבד דברים ברורים) כמו שמקפידים בקוד SQL. אבל אני פרפקטציוניסט שלא יכול לסבול דברים בסיגנון של קוד לא אסתטי ושהוא מיותר.

דוגמא לקוד מיותר, כפי שמתכנתים מתחילים אולי היו כותבים את מחלקת ה-skin הנ"ל, הוא כקוד הבא:
קוד PHP:
 class skin
{
    
// some stuff here ...

    
function table_row_start($text)
    {
        echo 
'<tr><td>'$text'</td><td>';
    }

    function 
input_text($id$init_value='')
    {
        echo 
'<input type="text" name="',$id,'" id="',$id,'" value="',$init_value,'" />';    # `name` and `id` considered the same
    
}

    function 
table_row_end()
    {
        echo 
'</td></tr>';
    }
}

$skin = new skin;

$skin->table_row_start('First name:');
$skin->input_text('f_name''');
$skin->table_row_end(); 


דוגמא נוספת:

קוד PHP:
 class skin
{
    
// some stuff here ...

    
function table_row($text$field)
    {
        echo 
'<tr><td>'$text'</td><td>',$field,'</td></tr>';
    }

    function 
input_text($id$init_value='')
    {
        return 
'<input type="text" name="',$id,'" id="',$id,'" value="',$init_value,'" />';    # `name` and `id` considered the same
    
}
}

$skin = new skin;

$skin->table_row_start('First name:'$skin->input_text('f_name''')); 


באפשרות הראשונה מה שמציק לי זה האקסטרא קוד שכותבים.
באפשרות השנייה מה שמציק זה ה-return שיש בפונקציית input_text ובכל הפונקציות האחרות שקשורות לפונקציית ה-skin.
אני יודע שאלו דברים שהם "לא כזה נורא" או גם "לא נורא בכלל" אבל אני אישית לא יכול להסתדר עם זה.

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

דוגמא לקוד שנעזר ב- callback יהיה:
קוד PHP:
 class skin
{
    function 
table_row($text$callback, array $param)
    {
        echo 
'<tr><td>'$text'</td><td>';
        
call_user_func_array(array($this$callback), $param);
        echo 
'</td></tr>';
    }

    function 
input_text($id$init_value)
    {
        echo 
'<input type="text" name="',$id,'" id="',$id,'" value="',$init_value,'" />';    # `name` and `id` considered the same
    
}
}

$skin = new skin;

$skin->table_row('First name:''input_text', array('f_name''')); 


כעת הקוד יותר אסתטי ובלי return'ים מעצבנים לעין.

אבל אז היה אפשר לומר, למה לא פשוט לכתוב את פונקציות ה-field בצורה כזו שה- table_row כלול בתוכם, כלומר:

קוד PHP:
 class skin
{
    
// ...

    
function input_text($text$id$init_value)
    {
        echo 
'<tr><td>',$text,'</td><td>
            <input type="text" name="'
,$id,'" id="',$id,'" value="',$init_value,'" />',
        
'</td></tr>';
    }



הסיבה שלא כדאי לעשות זאת היא שכנראה בעתיד יהיה צורך אך ורק בפונקצית ה- input_field, בלי החלק של המעטפת שכוללת את התגים td ו- tr. מהסיבה הזו גם ניקבע חוק הנירמול (מקוה שאני לא טועה בשמו), שבו חובה שכל אלמנט יהיה מבודד. חוק זה מיושם גם בתיכנון מבנה מסדי נתונים.

מקוה שעזרתי כאן למישהו שגם בשבילו זה היווה בעיה. בהצלחה.

נ.ב. קיויתי שיש אפשרות שפונקציות callback לוקחות מהמערך רק את הפרמטרים שיש להם key שהוא מספר (או לפחות key שלא הגדירו אותו עבור האיבר), ולא key שהוא אסוציאטיבי (מילולי, אותיות), אבל לצערי גם האיברים שיש להם key אסוציאטיבי יכולים להיחשב כפרמטרים של פונקציית ה-callback.
הסיבה היא שאולי אפשר לנצל את הקיום של המערך הזה ולקחת ממנו את המידע, במקום להוסיף פרמטרים למתודה table_row.

נערך לאחרונה ע"י dorM בתאריך 12-02-2009 בשעה 19:39.
תגובה ללא ציטוט תגובה עם ציטוט חזרה לפורום
  #8  
ישן 20-02-2009, 14:41
  משתמש זכר dorM dorM אינו מחובר  
מנהל
 
חבר מתאריך: 26.07.08
הודעות: 6,473
תיקון...
בתגובה להודעה מספר 1 שנכתבה על ידי dorM שמתחילה ב "טיפ: callback וצורת כתיבת קוד"

עשיתי benchmark לכל השיטות ובסופו של דבר מסתבר שעדיף את השיטה עם ה-return.

ה"וויכוח" תכלס נע בין callback ו- return בלבד.
בבדיקות שעשיתי מסתבר ש- callback איטי יותר, ולפעמים אפילו ב- 250%, מאשר ה- return. בסה"כ זה לא כזה משנה כי בסופו של דבר הפונקציות האלו לא מופיעות יותר מידי פעמים בעמוד אחד, כך שזה לא ישפיע משמעותית.
הפעם היחידה ש- callback היה מהיר יותר מאשר ה-return זה כשעברתי על מערך והיה צריך לעשות הדבקות רבות של מחרוזות בשיטת ה-return.
הרי בשיטת ה-callback לא היה צורך בהדבקת מחרוזות, אפשר פשוט ל"זרוק" אותן ישר לצד לקוח.
בשיטת ה-return, במידה ומבצעים הדבקות רבות, אז זה פחות מומלץ...

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

נערך לאחרונה ע"י dorM בתאריך 20-02-2009 בשעה 14:46.
תגובה ללא ציטוט תגובה עם ציטוט חזרה לפורום
תגובה

כלי אשכול חפש באשכול זה
חפש באשכול זה:

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

מזער את תיבת המידע אפשרויות משלוח הודעות
אתה לא יכול לפתוח אשכולות חדשים
אתה לא יכול להגיב לאשכולות
אתה לא יכול לצרף קבצים
אתה לא יכול לערוך את ההודעות שלך

קוד vB פעיל
קוד [IMG] פעיל
קוד HTML כבוי
מעבר לפורום



כל הזמנים המוצגים בדף זה הם לפי איזור זמן GMT +2. השעה כעת היא 21:12

הדף נוצר ב 0.05 שניות עם 12 שאילתות

הפורום מבוסס על vBulletin, גירסא 3.0.6
כל הזכויות לתוכנת הפורומים שמורות © 2025 - 2000 לחברת Jelsoft Enterprises.
כל הזכויות שמורות ל Fresh.co.il ©

צור קשר | תקנון האתר