
מה?
בסשן זה נעבור בעזרת מקורות חיצוניים על עשרים הדברות של סי שארפ שחשוב שנדע לפי הכניסה לקוד. מוכנים? שלוש ארבע ו!
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, והכי טוב על הכל.
אין תגובות:
הוסף רשומת תגובה