
מה?
בסשן זה נעבור בעזרת מקורות חיצוניים על עשרים הדברות של סי שארפ שחשוב שנדע לפי הכניסה לקוד. סכמו כל דברה בשלושה משפטים. לאחר מכן שבו עם החופף שלכם (או עם ג'יפיטי) שיבדוק את הבנתכם את הנושאים הללו ע"ב הסיכומים. מוכנים? שלוש ארבע ו!
- Access modifiersהסרטון הבא יעבור על רוב מילי הרשאות הגישה. אניח כי אתם כבר מכירים את נושא זה, אך בכל זאת אמליץ לראות את הסרטון כרענון.- לצפייה
 במידה ואתם פחות חדים על הנושא, מוזמנים להסתכל בסרטון הבא, המסביר אותו יותר לעומק.אדגיש כי בפרוייקטים השימוש הוא כרגע רק ב- לצפייה- public,protected,internalואם אתם מרגישים שהבנתם אותם תרגישו חופשי לעבור הלאה, אין צורך להרחיב.
- LINQלינק, או- Language integrated queryהוא דרך לפלטר ולבצע פעולות על רשימות בסי שארפ בצורה נוחה. אנחנו משתמשים בו באופן נרחב בקוד שכן הוא יעבוד גם על רשימות שנקבל מהקליינט או שניצור פנימית, אך אפילו הוא יכול לעבוד גם טבלאות בסיסי נתונים. זאת בעזרת ספריות תומכות, המתרגמות את שאילתת הלינק ל- SQLאו- MQLועוד. בעזרתו נוכל נשתמש בו כדי לבצע שאילתות בקלות ואפקטיביות. כהתחלה נצפה בסרטון זה שיסביר במהירות את הבסיס.וכעת, נצפה בסרטון זה הסוקר את מירב הפעולות הבסיסיות.- לצפייהשימו לב שאתם מכירים את- לצפייה- Select: מעבירה כל איבר באוסף לפורמט אחר. לדוגמה, אם יש לך רשימה של מספרים, אתה יכול להפוך כל מספר למחרוזת.
- SelectMany: משטחת אוסף של אוספים לאוסף יחיד. לדוגמה, אם יש לך רשימה של רשימות, אתה יכול לקבל רשימה אחת גדולה שמכילה את כל האיברים מכל הרשימות הקטנות.
- ToList: ממיר אוסף כלשהו לרשימה.
- ToDictionary: ממיר אוסף כלשהו למילון.
- Whereמסננת אוסף ומחזירה רק את האיברים שעונים על תנאי מסוים.
- Count: מחזירה את מספר האיברים באוסף.
- GroupBy: מקבץ את האיברים באוסף לפי תכונה מסוימת.
- Sum: מחשבת את סכום הערכים המספריים באוסף.
- Max: מחזירה את הערך המקסימלי באוסף.
- Min: מחזירה את הערך המינימלי באוסף.
- Take: מחזירה מספר קבוע של איברים מהתחלה של האוסף.
- Skip: מדלג על מספר קבוע של איברים מהתחלה של האוסף ומחזיר את השאר.
- First: מחזירה את האיבר הראשון באוסף.
- FirstOrDefault: מחזירה את האיבר הראשון באוסף, או ערך ברירת מחדל אם האוסף ריק.
- Single: מחזירה את האיבר היחיד באוסף, ומחזירה שגיאה אם יש יותר מאלמנט אחד או אם האוסף ריק.
 - IEnumerableכדי להבין מה האינטרפייס הזה, ואחרים הקשורים אליו מייצגים, מוזמנים לצפות בסרטון הבא- לצפייה
- Lists vs Dictionariesמתי יותר יעיל להשתמש ברשימה על פני מילון? העמיקו בשאלה הזו בכתבה הזו - לינק.
 כעת נבחן כמה מקרים של חיפוש אובייקט בודד לפי סטרינג, ותענו האם כדאי להשתמש במילון או רשימה.- אוסף של 10,000תלמידי בית ספר.הצג תשובה- רשימה: 38,714.58 ns
- מילון: 62.94 ns
 
- רשימה: 
- אוסף של 5פריטים ברשימת קניות.הצג תשובה- רשימה: 110.12 ns
- מילון: 80.62 ns
 
- רשימה: 
 
 שיקול נוסף, שאומנם הוא תרחיש קצה, אך כדאי להכירו, הוא שהכנסה של פריט למילון לוקחת זמן רב יותר מן הכנסתו לרשימה. (ע"ב - לינק) ולכן במקרים בהם הכתיבה תהיה תכופה רבות יותר מהקריאה, גם במידה וננהל פריטים רבים נשקול שימוש ברשימה.
- אוסף של 
- Heap and Stack- לצפייה
 ולסיכום, קלאס הולך ל- Heapוסטראקט ל- Stack.
- Dependency Injectionהסרטון הבא יסקור בצורה מעמיקה את הנושא, אל תיבהלו שהוא מסביר אותו עם בלייזור, הוא עובד בצורה כמעט וזהה בכל דוט נט מאפליקציית שרת לקונסול.הסרטון הבא יותר ממוקד ופחות מרחיב, ומראה אך מראה אימפלמנטציה על אפליקציית צד שרת.- לצפייהאז מה יהיה אורח החיים של סרביסים באיג'קשן באפליקציית שרת, כאשר הם מוגדרים כ- לצפייה- Singleton,Transient,Scoped?- הצג תשובה- Singleton- אובייקט אחד נוצר לכל האפליקציה.
- Scoped- אובייקט אחד נוצר לכל בקשת- HTTP.
- Transient- אובייקט אחד נוצר בכל פעם שמבקשים אותו משירות ה- DI.
 
- Pattern Matching- לצפייה
 כחלק מ- pattern matchingניתן להשוות משתנה לערך קונסטי, למשל- var2 is 42או- var1 is "Hello". ההבדל בין השימוש ב- isלבין- ==הוא זניח בהקשרי ביצועים (מוזמנים להרחיב עצמאית). אך איפה שהוא כן יהיה עדיף הוא בהשוואה לנאל. והסיבה לכך מפורטת בכתבה הזו - לינק.
- Memory Streamהסרטון הבא יסביר למה עדיף להשתמש ב- memory streamעל פני טעינת קובץ במלואו, בנוסף להסבר כיצד לבצע עליהם אופרציות. החלק השני הוא הרחבה, העיקר הוא שתבינו את היתרון בשימושם.- לצפייה
- IReadOnlyCollectionנניח ואצור רשימה על מנת להנגשת מידע בלבד, ואדע כי רשימה זו תהיה בשימוש בחלקים נרחבים בקוד, חשש שעולה ישר הוא, מה אם מישהו בחלק כלשהו של הקוד יערוך בטעות את הרשימה, ובכך יגרום לשגיאה כללית?
 כפתרון עולה הצורך להגן על הרשימה, ולאפשר קריאה ממנה בלבד. אחד הפתרונות לזה הוא שימוש ב- IReadOnlyCollectionובנלווים אליו. להלן סרטון הסוקר את הממשק.- לצפייה
 אך לפני שנקפוץ למים, חשוב שנכיר את החולשות של השימוש בממשק הזה וכיצד להשתמש בו בצורה נכונה, להלן סרטון המציג זאת.- לצפייה
- HashSetסטים יאפשרו לנו ליצור רשימה של פריטים יוניקיים. הם עובדים כמו מילון, שבו יש רק מפתחות והמפתח הוא גם הערך. הבסיס מפורט בסרטון.מבנה נתונים זה די נישתי, אך יכול להיות שימושי אם נרצה לבדוק הכלות של טיפוסים פרימיטיביים ברשימה מוכנה מראש.- לצפייה
- Frozen Sets And Dictionariesבמידה ונרצה לבצע אופטימיזציה לקריאה ממילונים או סטים, יכולת שחשוב שנכיר היא ההקפאה שלהם, שתאפשר שיפורים ביצועים.- לצפייה
- AsyncLocalדרך נוחה לשמר מידע בסקופ של בקשה הוא להשתמש במשתנה מסוג- AsyncLocal. בסרטון הבא סקירה אודותיו, ועל- ThreadLocal.במשתנה זה נוכל לאגור פרטים גלובאליים אודות הבקשה, למשל אם בתחילת הליך הבקשה נבין מי היוזר ששלח אותה, נוכל לאגור אותו במשתנה זה, במקום להעביר אותו בין כל הפונקציות היעבדו את הבקשה מכאן והלאה. ולאובייקט ה- לצפייה- AsyncLocalנוכל לגשת דרך קלאס סינגלטוני היכיל אותו ויוזרק באינג'קשן היכן שצריך.
 עוד פרט מידע שמתאים לאגירה פה הוא מזהה הקורלציה, שהסרטון הבא יציג.- לצפייה
- Static vs not staticאני מניח שאתם יודעים בכלליות מה ההבדל בין סטאטיו ללא סטאטי במידה ולא, הסרטון הבא יעזור לכם להזכר.אוקיי, אחרי שלמדתם מה זה סטטיק, חשוב שתזכרו שעדיף להשתמש בסטטיק רק בסיטואציות מאוד מסויימות. יש הרבה חברונות לשימוש בסטטיק, שחשוב שתדעו, בשביל להבין זאת החלו בלקרוא את הטרד הזה. אוקי, הייתי רוצה לסמוך עליכם שתבינו מה שרשום, אבל אני לא לוקח סיכונים. אז לאחר שקראתם, מוזמנים לקרוא את הנקודות.- לצפייהלמרות כל האנטי שעשיתי עכשיו על סטאטי, אם אלו פעולות מאוד פשוטות, שאין תרחיש סביר שנרצה להחליף, זה בסדר שנשתמש בסטאטי. לדוגמא, הפעולה שתוצג בסעיף הבא.- הנקודות- שימוש בסטאטי לא מאפשר מודולאריות. כשאתה קורא למחלקה או פונקצייה סטאטית, אתה מרפרנס מקום ספציפי מסויים בקוד של קלאס מסויים, ולכן, במקרה הצורך קשה יותר להחליף אותו בצורה נוחה, המונח המתאר זאת הוא Tight Coupling.
- השימוש בסטטי מפריע לבצע Dependency Injection. משהו שאנחנו מאוד אוהבים לעשות.
- בגלל שהוא מפריע או לפעמים מונע לחלוטין את האפשרות לבצע אינג'קשן ללוגיקות מסויימות, במידה ונרצה לבנות טסטים אוטומטיים למערכת, ולשם כך נדרש לעשות ללוגיקה  Mock, לא נוכל.
 מתי בכלל אני עושה כזה דבר? נניח שנרצה לבצע טסטים ללוגיקה מסויימת שכחלק ממנה, מכניסים נתונים לבסיס הנתונים. כדי שנוכל לבודד הלוגיקה בלבד ושהבדיקות לא יהיו תלויות גם בדיבי, נקים קלאס דאל מוקי שיוזרק במקום האמיתי, ויאגור נתונים במילון במקום בדיבי. הריעו למודולריות!
 
- שימוש בסטאטי לא מאפשר מודולאריות. כשאתה קורא למחלקה או פונקצייה סטאטית, אתה מרפרנס מקום ספציפי מסויים בקוד של קלאס מסויים, ולכן, במקרה הצורך קשה יותר להחליף אותו בצורה נוחה, המונח המתאר זאת הוא 
- Extensionsסיטואציה אמיתית מהחיים שלי: אני אוהב להשתמש במילונים, מת עליהם. אבל יש לי פעולה אחת שהייתי מת שתהיה במילונים ולא קיימת,- AddOrUpdateשתבצע:-  לבדוק אם הKeyקיים.
- אם כן, ליצור אותו עם הערך
- אם לא, לעדכן את הערך של המפתח לערך החדש
 
 וואי, התעייפתי רק מלכתוב את זה. במקום כל זה מה אם היינו יכולים להוסיף פעולה למילון שעושה את הכל אוטומטית במקום לכתוב את זה כל פעם? אנחנו יכולים! כאן נכנסות- Extensions. להלן סרטון אודות השימוש שלהם.- לצפייה
-  לבדוק אם ה
- Attributesפיצ'ר נחמד ופשוט שיכול לעזור לכם לפשט תהליכים.- לצפייה
- Logsכאשר אנחנו מריצים אפליקציה על המחשב שלנו, אם אנחנו לא מבינים מה גרם לשגיאה לקרות פשוט מדבגים, אבל, לרוב האפליקציה שרצה לא רצה על המחשב שלנו, אלה על שרת בענן שאי אפשר לדבג. אז איך בכל זאת נבין מה קורה בתוך הקוד? ונדע אם שגיאות קורות ומה גרם להן? בשביל זה נשתמש בלוגים. להלן סרטון שסוקר את אומנות הלוגים לעומק, אמנם הוא על פייטון, אבל העקרונות תקפים בכל מקום.ובגלל שאנחנו לא בפייטון (תודה לאל) הנה סרטון ב100 שניות המסביר את השימוש סי שארפ- לצפייה- לצפייה
- Usingמשתמשים. במה משתמשים? מתי מפסיקים להשתמש? את כל התשובות תקבלו בסרטון הבא.- לצפייה
- Readonlyנהוג לסמן שדות שמקבלים מהקונסטרקטור ולא עורכים אותם אחר כך כ-לקריאה בלבד. כך,אבל כאן נשאלת השאלה החשובה ביותר, האם הסימון הוא סמלי בלבד, או בעל יתרונות ביצועיים? אמליץ לקרוא את הטרד הבא על כך.- לצפייה
- Thead Safetyאז למדנו על תכנות אסינכרוני, אבל איך אנחנו עושים את הטרדים שלנו בטוחים? רגע, איך בכלל הם יכולים לא להיות בטוחים? זאת נראה בסרטון הבא.מפחדים עכשיו מספיק? כנראה שלא! ולכן אראה אפילו עוד דברים מפחידים עם טרדים.- לצפייה- Deadlock- כיצד לתקוע את האפליקצייה לנצח.- לצפייה
- Race Conditions- איך להרוס למישהו את העו"ש.- לצפייה
- Memory Curruption- כיצד לדפוק את המידע בקריאה מהזכרון - לינק.
 
 אחרי כל מה שקראתם, אתם אמורים להראות בדיוק ככה - 
 אבל אל חשש! יש הרבה דרכים להפוך טרדים לבטוחים בעזרת נעילות, להלן סרטון שסוקר רוב סוגי הנעילות.ואפילו, ישנם דאטא טייפים שמובנים להיות בטוחים לשימוש בטרדים רבים, ולא צריך אפילו לנעול לפני השימוש בהם. השימושיים מבניהם אלו הרשימות. תקראו עליהן, ואמליץ גם להעמיק כדי להבין את היתרונות שלהן ואיך הן עובדות. למשל עבור מילון.- לצפייה
- Design Patternsאוקיי אם הגעתם עד לפה, כנראה שאתם יודעים לתכנת, ואפילו בצורה מקבילית (ובטוחה!). אבל, כיצד נתכנן את הקוד שלנו? האם נשים את הכל ב- Programאו שנפצל בין קלאסים? הגישה של איך הקוד צריך להבנות בבסיסו, היא כמוצג בסרטון הזה:כלומר, הקוד צריך להיות בנוי בצורה כזו שהוא יהיה דינמי - או במילים אחרות, שיהיה ניתן לשנות את הפונקציונאליות בכמה שפחות מאמץ. אמנם בסרטון מציגים את פטרן האסטרטגיה, אבל כל אלו שמות לאותו הדבר - דינמיות, וזה לא באמת משנה. אחרי שהבנו את זה, נעבור אחר העקרונות של- לצפייה- Solid. בהם נשתמש ולפיהם נתכנן את המבנה של הקוד, כדי להגיע לדינמיות הנחשקת.זאת התורה שלנו והשלד של איך שנתכנן קוד. לאחר שהבנו את סוליד, ישנם עוד כמה קונספטים הנבנים על גביו שחשוב שתכירו.- לצפייה- Repository Pattern- איך סוליד נראה בגישה לדיבי שאלתם את עצמכם? אז כמו שאומרים - להלן,- לצפייה
 אם יש בעיה, תלחצו על לראות ביוטיוב.
- Factory Pattern- איך ניצור אובייקטים בצורה דינמית ובלי לחזור על קוד?- לצפייה
- Builder Pattern- עוד דרך מגניבה לבנות אובייקטים, שאודה שאישית אני לא משתמש בה הרבה, היא בנאי. גם עליה נחמד ללמוד.- לצפייה
- Singleton- אתם אמורים כבר להכיר אותו מסרטוני הדפנדנסי אינג'קשן ,אבל למקרה שלא, הנה רענון.- לצפייה
 
- Jalal Tipsולסיום, אמליץ לכם לעבור על פוסטים של מאסטר הסי שארפ, ג'לאל, המפרסם מגוון טיפים קלילים על מבנה קוד ובסט פרקטיסס. לינק אמליץ לעבור על לפחות 30, והכי טוב על הכל.
 
אין תגובות:
הוסף רשומת תגובה