ABA


"בואו נרכז טיפים לכתיבת קוד קריא!"
גירסת הדפסה        
קבוצות דיון פיתוח, תיכנות ובניית אתרים נושא #10963 מנהל    סגן המנהל    מפקח   Winner    צל"ש   מומחה  
אשכול מספר 10963
יוחאי
חבר מתאריך 30.12.15
163 הודעות
   00:32   21.10.12   
אל הפורום  
  בואו נרכז טיפים לכתיבת קוד קריא!  
 
   קודם כל אני אדגיש שאני נגד shortcuts של שפות כמו פייתון, זה הABC של קוד מסורבל ולא קריא.

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

1.One line if statement is eval

אז כולנו נתקלנו בדבר הבא יותר מפעם אחת:

if (x === y) doSomething();

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

אבל קחו למשל קובץ שיש בו 2000 שורות קוד, ברגע שתתחילו לעבוד על הקוד במקרה של שגיאה או משהו, אני מבטיח לכם שהסיכוי שתפספסו את התנאי הזה הוא גבוהה מאוד, אני אישית לפחות כשאני קורא קוד (לכל אחד יש את הטריקים שלו) העיניים שלי פשוט תופסות את כל מה שבין הסוגריים המסולסלות כמבנה בקרה (כל הif/while/for/etc...) וכל מה שמסתיים בנקודה פסיק זה קריאות לפונקציות שאני מבצע, השמה למשתנים ועוד ועוד ועוד (ברור שיש המון מקרים מיוחדים אבל רדו מזה לרגע).

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

עכשיו תורכם!


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

  האשכול     מחבר     תאריך כתיבה     מספר  
  כמה שלי.. VeNom  21.10.12 02:13 1
     שאלה בקשר ל2... ShocKi  26.10.12 13:05 22
  אשכול מבורך dvir8 21.10.12 09:15 2
  אחד הדברים החשובים ביותר לדעתי לצורך קריאות הוא הזחות נכונות asco88  21.10.12 19:41 3
  הכי חשוב בקוד קריא TheKid 21.10.12 20:22 4
     קראת בכלל את ההודעה שלי חח? יוחאי 21.10.12 20:33 5
         כן בהרבה מקרים יש שורות שאתה תשמח לדלג עליהם TheKid 21.10.12 20:38 6
  עוד המלצה... אם עובדים על קוד גדול ורוצים להוסיף נניח תמיכה חדשה TheKid 21.10.12 23:07 7
     אף פעם לא הבנתי את השימוש בifdef יוחאי 21.10.12 23:19 8
         אני חושב שזה משמש בעיקר header ודומיו שקוראים לו מכל קובץ asco88  21.10.12 23:45 9
         אתה יכול לכתוב makefile שיגדיר לך אוטומטית משהו... Zvikadori 22.10.12 00:00 10
         בעקרון המהות של זה היא אם יש לך כמה קונפיגורציות שאתה רוצה לתמוך בהן TheKid 22.10.12 06:23 11
             ומה רע ב Configuration Manager? VeNom  22.10.12 23:39 14
                 LIKE sharkk 23.10.12 00:00 15
                 לא חושב שCM עובד עם מערכות RT... אלא אם כן אני טועה? הXML הוא בצד לקוח לא? TheKid 23.10.12 06:25 16
                     לא..ה XML בצד השרת.. VeNom  23.10.12 08:09 17
                         אוקיי אני לא מדבר על קוד לאתרי WEB או דברים שיושבים ברשת... TheKid 23.10.12 18:32 18
  טיפ קטן שיכול לעזור עם הרבה שורות קוד בפונקציות oriel388  22.10.12 17:40 12
     בVS 2010 ומעלה אפשר לעשות את זה אפילו בלי הREGION... TheKid 23.10.12 18:33 19
  lazy initialization sharkk 22.10.12 19:53 13
  יש טיפ שמישהו בעבודה שלי אוהב למרות שקשה מאוד להתרגל אליו.. dyermaker  24.10.12 15:37 20
     כן, היתה לי מרצה שלימדה ככה asco88  24.10.12 16:40 21

       
VeNom  לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 7.6.02
7922 הודעות, 1 פידבק
   02:13   21.10.12   
אל הפורום  
  1. כמה שלי..  
בתגובה להודעה מספר 0
 
   כמה טיפים:
1. שמות משתנים משמעותיים - גם בדברים הקטנים..ובעיקר בקבועים..

2. גודל פונקציה צריך להיות גג בגודל מסך..ברגע שצריך לגלול למטה\למעלה זה מעצבן..וקוטע את המחשבה..בשביל זה יש "תתי פונקציות"..מעצבן לראות פונקציות ענק של 400 שורות קוד..פשוט הנדסת תוכנה גרועה.

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

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

5. לדעת לתת הרשאות מתאימות לפונקציות\משתנים במחלקות(במקרה של OOP)..יש סיבה להרשאות PRIVATE וזה מעצבן שאתה בא להשתמש במחלקה שהכל פתוח ואתה לא יודע באיזה פונקציה לבחור כי יש 2 פונקציות עם תיאור דומה(שאחת היא פונקציית "עזר" שהייתה צריכה להיות מוגבלת בגישה כלפי חוץ).

6. לצמצם את התנאים עד כמה שאפשר..קשה לדבג דברים לפעמים בגלל ריבוי תנאים(בד"כ תנאים של וגם, או, שלילות ובלאגנים) - תמיד אפשר לעשות את זה נוח יותר..מי שמתכנת בסי שארפ בטוח נתקל בlamda expressions ענקיות שאי אפשר לדבג בצורה נוחה..Keep it simple..


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ShocKi  לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 19.3.02
20171 הודעות, 10 פידבק
   13:05   26.10.12   
אל הפורום  
  22. שאלה בקשר ל2...  
בתגובה להודעה מספר 1
 
   אם לוקחים בחשבון שיקולי הנדסת תוכנה אז צריך להתחשב בכך שגם כל קריאה לפונקציה זה אומר עוד מחסנית לאוסף ולהעתיק פרמטרים למחסנית החדשה...

אני לא חושב שאורך הקוד הוא הפרמטר היחיד שצריך להתחשב בו, לא כך?


קאש-באק ישראלי: https://www.cashback.co.il/?uref=33330
קאשבק לAsos ואמזון דרך Ebates: https://goo.gl/MX87Y7 - מקבלים 10$ לאחר שימוש ראשון.


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


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
asco88 
חבר מתאריך 17.6.04
26757 הודעות
   19:41   21.10.12   
אל הפורום  
  3. אחד הדברים החשובים ביותר לדעתי לצורך קריאות הוא הזחות נכונות  
בתגובה להודעה מספר 0
 
ההבדל בין קוד שלא מוזח נכון, לבין קוד שמוזח, זה שמיים וארץ, זה להבין את המשמעות של כל סוגריים, איפה מתחיל ונגמר תנאי, לולאות, פשוט הכל.
מליון פעם אני בא לעזור לבנאדם שלא עובד לו משהו, אני בסה"כ מסדר לו יפה את הקוד, אומר לו להסתכל שוב, ופתאום גם הוא מבין את השגיאה.


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
TheKid לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 5.10.07
17978 הודעות, 1 פידבק
   20:22   21.10.12   
אל הפורום  
  4. הכי חשוב בקוד קריא  
בתגובה להודעה מספר 0
 
   מעבר להזחות זה לכתוב עפ"י כללים מסויימים כמו למשל לא לכתוב פעם אחת if עם רווח לתנאי ופעם אחת if בלי רווח לתנאי...

בדוגמא שנתת למשל כדאי לכתוב if מקוצר מאשר לכתוב כמו שכתבת.

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



//This code handles button press
{
some code
}

//This code handles color change
{
code...
}


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
יוחאי
חבר מתאריך 30.12.15
163 הודעות
   20:33   21.10.12   
אל הפורום  
  5. קראת בכלל את ההודעה שלי חח?  
בתגובה להודעה מספר 4
 
   אני נגד if מקוצר, הדוגמא שרשמתי היא איך לא לכתוב, והתכוונתי גם לif מהסוג הבא:


(a)? x : y

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

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


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
TheKid לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 5.10.07
17978 הודעות, 1 פידבק
   20:38   21.10.12   
אל הפורום  
  6. כן בהרבה מקרים יש שורות שאתה תשמח לדלג עליהם  
בתגובה להודעה מספר 5
 
   כמו למשל הרבה חיווים על משתנים ... שאין לך צורך להבין או לדבג כשאתה עובר על קוד.. ויכול לחסוך לך הרבה זמן...

ככלל כשמדובר בקוד עם משמעות עדיף שלא... זה ברור..


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
TheKid לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 5.10.07
17978 הודעות, 1 פידבק
   23:07   21.10.12   
אל הפורום  
  7. עוד המלצה... אם עובדים על קוד גדול ורוצים להוסיף נניח תמיכה חדשה  
בתגובה להודעה מספר 0
 
   שמתפרסת על הרבה מקומות בקוד..
עדיף להגדיר איזשהו #define
ובכל מקום שמכניסים שינוי לעטוף אותו ב#ifdef ככה יהיה הרבה יותר קל לנטר את המקומות בקוד שעשיתם את השינויים במידה ויש באגים מסויימים..
ובסוף הבדיקות "להטמיע"...


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
יוחאי
חבר מתאריך 30.12.15
163 הודעות
   23:19   21.10.12   
אל הפורום  
  8. אף פעם לא הבנתי את השימוש בifdef  
בתגובה להודעה מספר 7
 
   אם אני עושה define למשהו אז מדובר לרוב במשהו שאני יודע שהגדרתי למה אני צריך לבדוק אם הגדרתי אותו?

הרי אין דבר כזה הגדרה דינאמית (או שאפשר לעשות define בruntime?)


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
asco88 
חבר מתאריך 17.6.04
26757 הודעות
   23:45   21.10.12   
אל הפורום  
  9. אני חושב שזה משמש בעיקר header ודומיו שקוראים לו מכל קובץ  
בתגובה להודעה מספר 8
 
ואם תנסה בכל הרצה לקמפל כמה פעמים define תקבל שגיאה


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Zvikadori
חבר מתאריך 3.8.02
5369 הודעות
   00:00   22.10.12   
אל הפורום  
  10. אתה יכול לכתוב makefile שיגדיר לך אוטומטית משהו...  
בתגובה להודעה מספר 8
 
   השתמשתי בזה כמה פעמים, כשהייתי צריך לתמוך בכמה קונפיגורציות, אבל לא היה ניתן לקרוא מקובץ(כשאתה כותב קרנל על מע' הפעלה מאוד מסוימת לדוג').

ישנם כל מיני דוג'.

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


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
TheKid לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 5.10.07
17978 הודעות, 1 פידבק
   06:23   22.10.12   
אל הפורום  
  11. בעקרון המהות של זה היא אם יש לך כמה קונפיגורציות שאתה רוצה לתמוך בהן  
בתגובה להודעה מספר 8
 
   אשר בכל אחת יש התנגשות של כמה דברים ואתה לא רוצה שהUSER יהיה מסוגל בזמן ריצה לשנות את הקונפיגורציה של התוכנה.

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

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


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
VeNom  לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 7.6.02
7922 הודעות, 1 פידבק
   23:39   22.10.12   
אל הפורום  
  14. ומה רע ב Configuration Manager?  
בתגובה להודעה מספר 11
 
   ערכתי לאחרונה בתאריך 22.10.12 בשעה 23:43 בברכה, VeNom
 
תכתוב את הקונפיגורציות ב XMLים נפרדים ולכל לקוח תשים את הקונפיגרוציות שמתאימות לו.
בנוסף זה גם מאפשר לך לשנות כל מיני דברים חשובים בלי לעשות עוד BUILD.

לגבי ה IFDEF הוא יעיל בעיקר לצרכי דיבאג(לפעמים אתה רוצה שהתוכנית תבצע הדפסות רק שאתה במוד של דיבאג - ולא לכתוב לוגים ל DB או משהו).
בנוסף נהוג ב CPP לכתוב קבצי H ובכדי לא לייצר מצב שהקומפיילר נכנס פעמיים לקובץ H מסוים(במקרים שיש הגדרות שיפילו את הקומפילציה), נהוג להשתמש ב DEFINE וב IFNDEF, כלומר אם לא בוצע DEFINE, כנס..בצע DEFINE ותרוץ על הקובץ..אם בטעות תכנס שוב לקובץ, הוא לא יבצע שוב את הפעולה.


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
sharkk
חבר מתאריך 2.9.02
1306 הודעות
   00:00   23.10.12   
אל הפורום  
  15. LIKE  
בתגובה להודעה מספר 14
 
  


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
TheKid לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 5.10.07
17978 הודעות, 1 פידבק
   06:25   23.10.12   
אל הפורום  
  16. לא חושב שCM עובד עם מערכות RT... אלא אם כן אני טועה? הXML הוא בצד לקוח לא?  
בתגובה להודעה מספר 14
 
   ערכתי לאחרונה בתאריך 23.10.12 בשעה 06:31 בברכה, TheKid
 
וכמובן אני מדבר על בלוקים שלמים שיורדים/משתנים בין גירסא לגירסא...
איך XML עוזר לי בזה...? זה לא שינוי של פרמטרים וזהו...
כמו כן אני מאמין שXML זה לא הדבר הכי מאובטח ולכן עדיף לסגור את זה בBUILD. - כשמוציאים גירסא ללקוח לא מתקמצנים על חצי שעה של BUILD


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
VeNom  לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 7.6.02
7922 הודעות, 1 פידבק
   08:09   23.10.12   
אל הפורום  
  17. לא..ה XML בצד השרת..  
בתגובה להודעה מספר 16
 
   בוא נגיד שיש לך אתר דילים כזה..
לקוח אחד רוצה 20 מוצרים בדף אחד, ולקוח אחר רק 10.
אז הקוד שלך יראה משהו כזה:

int numberOfItemsToShow = ConfigurationManager.NumberOfItemsToShow;
for(int i = 0 ; i < numberOfItemsToShow ; i++)
renderItem();

בקיצר יש לך XML עם NODE של NumberOfItemsToShow.
בתיקיה שלך, יהיה XML לכל לקוח וסביבה:
configuration.Groupon.Production.xml
configuration.Groupon.Test.xml
...
configuration.Buy2.Test.xml
...

בפועל אחרי הבילד ישב לך רק קובץ אחד של קונפיגורציות שתקרא לו configuration.xml ואתה תקח את הנכון.
למה זה טוב? זה לא מסרבל את הקוד..דברים שהלקוח רוצה שתכניס עוד שבוע נגיד אפשר להכניס NODE בקונפיגורציה ולעשות IF על התוכן שלו בקוד לטובת הרצת מודלים וכו'..אפשר לשנות דברים(נגיד לקוח רוצה שהאתר פתאום יציג 25 אייטמים לדף, זה נגמר בשניה וחצי של עבודה ובלי בילד).
אין לי מושג לגבי מערכות RT..אני יותר מדבר על מערכות קליינט סרבר שמשרתות בד"כ יותר מסוג לקוח אחד..אבל אני בטוח שיש פתרון קצת יותר טוב מאשר לכתוב IFDEFS בכל הקוד.
לעשות בילד לכל לקוח אי אפשר בכל מוצר..כמו שאמרתי לך יש מצבים שיש לך 20-30 לקוחות שונים על מוצר אחד ואתה משחרר מוצר עם RLS NOTES על כל בילד..

לגבי אבטחה, אם אתה מתעקש, אפשר להצפין חלקים בקונפיגורציה(עושים את זה בעיקר על CONNECTION STRINGS בPRODUCTION) או אפילו יותר טוב, להגדיר שאין גישה לקובץ הזה מרחוק(תלוי עם איזה שרת אתה עובד).


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
TheKid לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 5.10.07
17978 הודעות, 1 פידבק
   18:32   23.10.12   
אל הפורום  
  18. אוקיי אני לא מדבר על קוד לאתרי WEB או דברים שיושבים ברשת...  
בתגובה להודעה מספר 17
 
   אני מדבר על מוצרים.. כמו מדפסות , מכוניות, וכו'...


כתיבה בשפת C בעיקר.


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
oriel388 
חבר מתאריך 19.6.11
2247 הודעות
   17:40   22.10.12   
אל הפורום  
  12. טיפ קטן שיכול לעזור עם הרבה שורות קוד בפונקציות  
בתגובה להודעה מספר 0
 
   בתחילת (לפני ה- }) הפונקציה לשים region# ובסופה (אחרי ה- {) endregion#
ואחרי region# לשים את השם של הפונקציה.
ואז אפשר לקבץ את הפונקציה בצורה נוחה מאוד..
אני משתמש בזה ב #c


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
TheKid לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 5.10.07
17978 הודעות, 1 פידבק
   18:33   23.10.12   
אל הפורום  
  19. בVS 2010 ומעלה אפשר לעשות את זה אפילו בלי הREGION...  
בתגובה להודעה מספר 12
 
  


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
sharkk
חבר מתאריך 2.9.02
1306 הודעות
   19:53   22.10.12   
אל הפורום  
  13. lazy initialization  
בתגובה להודעה מספר 0
 
   תיצרו אובייקט/משתנה רק שבאמת יש צורך בכך שלא תפוס מקום סתם בזיכרון.

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


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
dyermaker 
חבר מתאריך 4.2.03
1644 הודעות
   15:37   24.10.12   
אל הפורום  
  20. יש טיפ שמישהו בעבודה שלי אוהב למרות שקשה מאוד להתרגל אליו..  
בתגובה להודעה מספר 0
 
   נכון תמיד בתנאים רושמים:


if (x==1) then...

אז הוא טוען שעדיף לכתוב


if (1==x) then...

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


if (x=1) then...

והקומפיילר כמובן לא יזהה פה שגיאת קוד והתוצאה הרסנית...

לעומת זאת אם טעינו ורשמנו


if (1=x) then...

כמובן שהקומפיילר יצעק שגיאה...


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
asco88 
חבר מתאריך 17.6.04
26757 הודעות
   16:40   24.10.12   
אל הפורום  
  21. כן, היתה לי מרצה שלימדה ככה  
בתגובה להודעה מספר 20
 
בעיקר שימושי עם NULL כי זה יכול לבלבל עם שם של משתנה


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

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

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



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