מדריך ארכיטקטורת תוכנה - שיעור 2 גנריות לעומת ספציפיות
-
<<לחץ כאן למעבר לשיעור 1
שלום לכולם!בשיעור הזה נתחיל לדבר, על מה הופך קוד לנקי, אמין ובר תחזוקה לטווח הארוך.
ההבדל הכי יסודי והכי בסיסי שעושה את הקוד לנקי או מלוכלך, זה ההיבט שלו, האם הוא גנרי או ספציפי. קוד גנרי תמיד יהיה בעל נטייה נקיה יותר מאשר קוד ספציפי.
כלל הזהב בכתיבת קוד, שאסור בשום פנים ואופן, לכתוב קוד פעמיים, אם יש לך קוד שחוזר על עצמו, בקונבנציות שונות, אתה צריך לבדוק את עצמך היטיב היטיב, אם אתה לא חוטא. קוד שמבצע פעולה מסויימת, ניתן יהיה לקרוא לו ממקומות שונים לביצוע הפעולה.
מכאן מושפעים 2 שלבים נוספים הכרחיים בארכיטקטורה
הראשון הוא קריאת שמות לפונקציות ואובייקטים למיניהם, כאשר השמות אף הם צריכים לייצג את הפעולה הטהורה של הקוד שבפנים, ולא את התוצאה הגסה. (הערה: נדבר בהרחבה על קריאת שמות לאובייקטים, לפי פעולה או לפי תוצאה, ויש בזה תיאוריות נוספות, אין לשלול קריאת שם לפי תוצאה, בפרט בפונקציות שאמורות להחזיר ערך וזהו כל מהותן, אולם כאן אני שם דגש, על כך שהפונקציה צריכה להיקרא בשם הנקי שלה, הגנרי, ולא בשם ספציפי שמתאים למטרה הסופית של הלקוח הנוכחי)
השלב השני, הוא אישכול נכון של הקוד. אישכול הוא בעצם נגזר של הקפדה על קריאת שמות נכונים לאובייקטים, והאישכול הוא בסך הכל הרחבת משפחות השמות, לפי הקשר של נושאים ונשואים. כל זה נותן שליטה בלתי רגילה בקוד ענק, וככה אפשר לנהל פרוייקטים גם בסדר גודל של לינוקס.
כטבעו של עולם, לכתוב קוד גנרי זה הרבה יותר קשה מנטלית, בפרט בתחילת הדרך, בעיקר בגלל העצלות הטבועה בנו כבעלי חיים, אולם בהמשך כאשר רואים תוצאות, זה הופך להיות חווייה עילאית. זהו עיסוק תמידי באידיאות, ולכן לדעתי מתכנת אמיתי לא נשחק לאורך השנים, אלו שנשחקים ומרגישים עבודה אפרורית, הם האנשים שבאמת עושים עבודה שחורה, ואינם אחראיים על קוד אלא כותבים קוד.
גם כשאתם כותבים קוד ללקוח שמתעסק בתחום מאוד מאוד ספציפי כגון ניהול משולח"ים למיון חרקים בעלי שש רגלים ומעלה באזורים הקרים של צפון אירופה. לעולם הפרוייקט שלכם לא יכיל יותר מ 10% קוד ספציפי מותאם לקוח. ככל שתצמצמו את כמות הקוד הספציפי, כך הקוד יהיה נקי יותר.
לאור הדברים הללו, נחזור לדוגמאות שהבאנו בשיעור 1.
איך אמורים לנהל ערכים של קומבו??? הבה ונחשוב, כאשר יש לנו טבלה אחת גדולה לכל הקומבו בוקס, הבה ונניח, שהלקוח החליט יום אחד להוסיף גם "הסברים צפים" tooltip לכל ערך ברשימה.... אוי, יש לנו 20 טבלאות להוסיף להם עמודות.... לא הכי נעים. אבל אם מדובר בטבלה אחת, עמודה אחת לאותה טבלה ונגמר הסיפור. אם נניח הוא רוצה צבעים??? אין בעיה, עמודה שתכיל ערך של צבע.
תחשבו על ה UI בעצם כשאנו רוצים לנהל קומבו בוקס, יש לנו אובייקט UI אחד ויחיד, שאיתו אנו מתנהלים, רוצים tooltip?? אין בעיה, מוסיפים לו. רוצים ניהול צבעים לערכים??? שום בעיה ברגע אחד שינינו את כל הפרוייקט.
בוא נגיד שהוא החליט שהערכים צריכים להיות אפשריים גם באנגלית, עוד עמודה של אנגלית ונגמר הסיפור, לקומבו הגנרי הכללי, מוסיפים פרמטר של שפה, והערכים מתקבלים בשפה הרצויה. וכן הלאה וכן הלאה וכן הלאה.בנושא של טרנזקציות פיננסיות, אני כמובן אהיה חסיד של השיטה האחרונה הדוגלת בטבלה אחת ענקית, כאשר שאילתות מולה נעשות בצורה הכי גנרית שיש בעולם. אם נרצה לחבר את ההכנסות, הזיכויים, ההתחייבויות העתידיות, ההכנסות הקבועות (סוג של טרנזקציה הייתי אומר) הוראות הקבע, בסך הכל לשנות את משפט ה where של SQL ולקבל תשובה מיידית. אם נרצה להוסיף עמודה שתתאר גם מי אחראי על הטרנזקציה (בכל ארגון למשל יש כמה מורשי חתימה שכותבים שיקים, או כמה אנשים שאוספים תרומות או מקבלים כסף מלקוחות, וכן הלאה), לא נצטרך להוסיף אותה בחמישים טבלאות, בטבלה אחת הוספנו אותה והסיפור הסתיים!!! כשנרצה לדעת באמצעות שאילתה, כמה הוצאות דלק היו באמצעות שליח מסויים???? נוכל בתוך פחות ממיליארדית השניה לקבל סיכום מלא!!!! ולא נצטרך קוד שבנוי מחמישים שאילתות.... לא מקסים????
בשיעור הבא נדבר על הנושא החשוב קריאת שמות לאובייקטים.
פורסם במקור בפורום CODE613 ב18/07/2013 01:32 (+03:00)
-
זה גם נושא מעניין, כמעט בכל המצבים מקובל להחזיק ערכים באמצעות key-value בצורה כזאת שהמשתמש הסופי בדרך כלל רואה את ה value שמייצג string ואילו מסד הנתונים מחזיק את ה ID בשדה שלו.
היתרונות של שיטה זו הם עצומים
א. חיסכון במשאבי מסד נתונים, int תופס הרבה הרבה פחות נפח וזמן עיבוד מאשר string בפרט כשעושים שאילתות כבדות. אתה מקבל תוצאות בצ'יק.
ב. כאשר משנים את ערך הרשימות, כל התוכנה מקבל את השינויים. כי בעצם מה ששמור במסד הנתונים הוא ה IDהחיסרון היחיד הוא שכל הדטה בייס מתמלא במספרים, והופך להיות בלתי קריא לבן תמותה. אבל לא נורא אפשר להסתדר עם זה.
חיסרון נוסף, אם יש לך קומבו שאתה לא מייחס לו חשיבות רבה מבחינת שאילתות וכדומה, אלא מכיל ערך אזוטרי, כגון מקצועו של הסבא רבה של בת הזוג, ייתכן שיכבד על המשתמשים להזין ערכים חדשים ברשימה כל העת, אבל זה שווה את ההשקעה תאמין לי.
פורסם במקור בפורום CODE613 ב25/07/2013 19:03 (+03:00)
-
היי ארכיטקט,
אני ממש חושב שאתה מתקדם מאוד מהר לתכנון מסד נתונים, מאשר באמת לגעת בקוד עצמו.
אני באמת שלא מבין איך אפשר להרים פרוייקט (הקטן שיהיה), בלי שימוש נכון ב-OOP? פשוט לא מובן לי. כי ברגע שאתה מתחיל לזרוק פונקציות על פני הקוד שלך, אתה מתחיל לאבד עניין (לא יודע איך זה למעשה ב-Access, אבל ברור שזה נכון ב-PHP, C#, C++).אני חושב שכל דבר צריך לחשוב אובייקטיבי. פשוט ליצור אובייקט (קלאס), ולראות איך אנחנו ניגשים לכל אלמנט בכל צורה אחרת.
היה לי פרוייקטים שהגעתי ל-7 שכבות של מחלקות (ירושות). אני לא אומר שזה חובה הירושות ברמה כזאת, אבל פשוט שזה אחד הדברים הכי כייפים בתכנות.פורסם במקור בפורום CODE613 ב03/01/2014 00:47 (+02:00)
-
היי ארכיטקט,
אני ממש חושב שאתה מתקדם מאוד מהר לתכנון מסד נתונים, מאשר באמת לגעת בקוד עצמו.
אני באמת שלא מבין איך אפשר להרים פרוייקט (הקטן שיהיה), בלי שימוש נכון ב-OOP? פשוט לא מובן לי. כי ברגע שאתה מתחיל לזרוק פונקציות על פני הקוד שלך, אתה מתחיל לאבד עניין (לא יודע איך זה למעשה ב-Access, אבל ברור שזה נכון ב-PHP, C#, C++).שמעת פעם על DBA?
יש מושג של תיכנון נכון של DB.
בחלק השני ארכיטקט נגע בעיקר בנירמול (של DB + קוד). ואני משוכנע שגם הוא יודע (כמו שכתב כמדומני בפרק 4) שהכל אובייקטים, ההבנה שלו בתיכנון קוד מאד טובה. (תשאל אפילו את מיסטר ר. - ברמה העקרונית ככה הסדר צריך להיות. לגבי מחלקות ו-namespace עיין בפרק 4)
לא שאני מסכים בהכל לגבי הטבלה הענקית, אבל על זה נדבר כשנסיים לדון בנושא הפלטפורמה :lol: :lol: :lol:
@KingYesהיי ארכיטקט,
אני חושב שכל דבר צריך לחשוב אובייקטיבי. פשוט ליצור אובייקט (קלאס), ולראות איך אנחנו ניגשים לכל אלמנט בכל צורה אחרת.
היה לי פרוייקטים שהגעתי ל-7 שכבות של מחלקות (ירושות). אני לא אומר שזה חובה הירושות ברמה כזאת, אבל פשוט שזה אחד הדברים הכי כייפים בתכנות.אני מעתיק כאן את הדוגמא שנתתי לך כאן:
הלקוח רוצה תוכנית קטנה שכל יום בשעה 4 אחה"צ מכווצת קובץ מסויים לZIP, ואז שולחת אותו במייל או מעלה אותו דרך FTP.
איך אתה חושב אובייקטים בC#? (כדי שלא תסביר לי ששאתה צריך לבנות אובייקט בשביל הFTP וכו' - שם יש לך הכל מוכן...)פורסם במקור בפורום CODE613 ב03/01/2014 01:28 (+02:00)