מה הם Mixins?

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

 מבלבל?

Mixins קיימים בהרבה שפות, כמו: Dart, Ruby, TypesScript ו- JavaScript החל מES6.
מנועי CSS כמו SCSS גם משתמשים ב- Mixins בצורה מעט שונה.
אני אשתמש ב- TypeScript על מנת להדגים בעיה שניתן לפתור בקלות על ידי שימוש ב- Mixins:
נניח שיש לנו ארבעה גיבורי על: סופרמן, וונדרוומן, בטמן ואיירון מן. עכשיו נציג אותם בקוד:
class Superman implements Hero {
     fly() {
          console.log("Flying");
     }
    superPunch() {
          console.log("Puncing");
     }
}
 
class WonderWoman implements Hero {
     fly() {
          console.log("Flying");
     }
     superPunch() {
          console.log("Puncing");
     }
}
 
class Batman implements Hero {
}
 
class IronMan implements Hero {
     fly() {
          console.log("Flying");
     }
     superPunch() {
          console.log("Puncing");
     }
     shootLazer() {
          console.log("Shooting");
     }
}
הקוד שלמעלה ירוץ, הוא יעבוד מעולה, אבל הוא לא יהיה הכי פשוט לתחזוקה, כיוון שמספר גיבורי על חולקים כוחות זהים, ולכן כאשר נרצה לשנות את הדרך שבה אנחנו מממשים את אחד הכוחות, כנראה שנצטרך לשנות אותו כמה פעמים, במספר מחלקות; בעיה שרק תגדל כאשר יתווספו עוד גיבורים.

הפתרון של Mixin לבעיה הזו

ניתן לפתור בעיה כזו בעזרת Mixins, בצורה הבאה:
 
class FlyAbility {
    fly() {
         console.log("Flying");
    }
}
 
class SuperStrengthAbility {
    superPunch() {
         console.log("Puncing");
    }
}
class LazerAbility {
     shootLazer() {
          console.log("Shooting");
     }
}
 
class Superman implements Hero, FlyAbility, SuperStrengthAbility { }
class WonderWoman implements Hero, FlyAbility, SuperStrengthAbility { }
class Batman implements Hero { }
class IronMan implements Hero, FlyAbility, LazerAbility { }
 
applyMixins (Superman, [FlyAbility, SuperStrengthAbility]);
applyMixins (WonderWoman, [FlyAbility, SuperStrengthAbility]);
applyMixins (IronMan, [FlyAbility, LazerAbility]);
 
 בצורה כזו, כשנרצה לשנות את הדרך שבה אנחנו מממשים כוח נצטרך לשנות רק את המחלקה של אותו הכוח, ולא נצטרך לגעת בגיבורים, וכשנרצה להוסיף גיבור או להוסיף/להסיר כוחות לגיבורים, נוכל לעשות זאת בקלות רק על ידי ציון שמות הכוחות שיש לגיבורים בתור משהו שהמחלקה מממשת, והפעלת הכוחות עצמם בעזרת הפונקציה applyMixins.

חדי העין שבינכם בטח שמו לב לעיצוב החדש של האתר, שמסמל בין היתר גם עד כמה נשבר לי מ- WordPress.

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


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


בקרוב פוסטים חדשים, וקצת יותר אינפורמטיבייים, ואפילו המשך של מדריך ה- Sails.js המצולם שלנו.

לחיי התחלות חדשות :)

הפרק השישי במדריך ל- Sails.js: ה- Framework המטורף ל- Node.js

בפרק השישי נממש הרשמה והתחברות לבלוג.

Sails.js היא Framework מאוד חזק של Node.js, שמאפשרת לייצר אתרי אינטרנט בקלות.

צפייה מהנה!





הפרק החמישי במדריך ל- Sails.js: ה- Framework המטורף ל- Node.js

בפרק החמישי נדבר על גישה לדאטאבייס דרך Blueprints.

Sails.js היא Framework מאוד חזק של Node.js, שמאפשרת לייצר אתרי אינטרנט בקלות.

צפייה מהנה!



 

הפרק הרביעי במדריך ל- Sails.js: ה- Framework המטורף ל- Node.js

בפרק הרביעי נדבר על הLayout של Sails.js, ונשלב את Bootstrap בבלוג.

Sails.js היא Framework מאוד חזק של Node.js, שמאפשרת לייצר אתרי אינטרנט בקלות.

צפייה מהנה!






 

הפרק השלישי במדריך ל- Sails.js: ה- Framework המטורף ל- Node.js

בפרק השלישי נדבר על מה הם מודלים, איך יוצרים אותם ב- Sails.js, ועל איך לקנפג את הדאטאבייס ב- Sails.js.

Sails.js היא Framework מאוד חזק של Node.js, שמאפשרת לייצר אתרי אינטרנט בקלות.

צפייה מהנה!



 

הפרק השני במדריך ל- Sails.js: ה- Framework המטורף ל- Node.js

בפרק השני נדבר על איך ליצור Controller ולהתאים לו View, על איך לייצר Template בעזרת ejs ועל Routes.

Sails.js היא Framework מאוד חזק של Node.js, שמאפשרת לייצר אתרי אינטרנט בקלות.

צפייה מהנה!



 

הפרק הראשון במדריך ל- Express..js. ה- Framework המוכר והאהוב ל- Node.js.

בפרק הראשון נדבר קצת על NodeJS ועל ExpressJS ואיך הם מתקשרים, נעבור על ההתקנה, נסביר על פקודות בסיסיות וניצור את הפרוייקט הראשון שלנו ב- ExpressJS.

צפייה מהנה!




פרק ראשון בסדרת המדריכים המצולמים החדשה שלנו!

החלק הוא סדרה של סרטונים על Sails.js, שבסופם תדעו לייצר פרויקט שלם ב- Sails.

Sails.js היא Framework מאוד חזק של Node.js, שמאפשרת לייצר אתרי אינטרנט בקלות.





 

Web Notifications הוא API שמאפשר הצגת התראות למשתמש מחוץ לאתר - דרך הדפדפן. נכון לכתיבת שורה זו, כל הדפדפנים חוץ מ- Safari Mobile, Internet Explorer ו- Internet Explorer Mobile תומכים ביכולת הזו בצורה כלשהי, מה שהופך את Notifications API לנפוץ מאוד בימים האלו.

אתרים רבים משתמשים ב- Notifications API, כמו לדוגמא הממשקים הווביים של WhatsApp ו- Telegram, כיוון שנוח מאוד להודיע למשתמשים על הודעות צ'אט בעזרתו.

כידוע, WPF מממשת Observer על מנת ליידע את ה- UI שהמידע שקשור (Bound) אליו משתנה. ה- Interface שמממש את ה- Observer הזה נקרא INotifyPropertyChanged, והמימוש שלו נתון לשיקול המפתח.


private int _age;public int Age{get { return _age; }set{_age = value;// NotifyPropertyChanged....}}

ה- XAML יראה כך:

[xml][/xml]

גם אם אתם כבר מכירים את 2 המימושים הבסיסיים, האחרון יכול לחדש לכם, ולכן לקרוא אותו.

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

לאחרונה מייקרוסופט שחררו את Visual Studio 2015, ויחד איתו גם את C# 6. הפוסט היום יעסוק בפיצ'רים החדשים שנעשו בשפה:

1. Conditional Access Operator

החידוש הראשון נקרא Conditional Access Operator (או "אופרטור גישה מותנת"), הסימון שלו הוא ?. ובסיטואציות מסויימות הוא עלול להקל המון על החיים שלכם.

if (University != null){ if (University.Students != null) { int numberOfStudents = University.Students.Count; }})

 

יהפוך ל:

int? numberOfStudents = University?.Students?.Count;

 

האופרטור יחזיר null אם אחד מהאובייקטים בשרשרת הוא null, מה שיכול להיות מאוד שימושי בשרשראות ארוכות.

 


 

2. Auto Property Initializer

זוכרים Auto Properties? אותם Properties שמגדירים עם get ו- set אוטומטיים, מבלי לממש את הגוף שלהם? אז עכשיו גם אפשר לתת להם ערך.

בC# 6 ניתן לעשות השמה לProperty, מה שבסך הכל חוסך להגדיר אותו ב- Constructor.

פעם:

class Person { public string Name { get; set; } public Person  { Name = "Eliran"; } }

 

בC# 6:

class Person { public string Name { get; set; } = "Eliran";}

 

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

3. שיטה שונה לכתוב Constructor

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

פעם:

class Person { public string Name { get; set; } public Person(string name) { this.Name = name; }}

 

בC# 6:

class Person(string name) { public string Name { get; set; } = name;}

 

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

4. חידוש מסעיר ב- Out Parameter

אני משער שרוב מי שכותב בC# יותר מיום יומיים נתקל במטודה TryParse - ולמי שבכל זאת לא: מדובר במטודה שנמצאת בכמה מהמחלקות של C#, ומטרתה לנסות ולהפוך string לאובייקט מסויים. לדוגמא, המטודה TryParse ב- int מנסה להפוך string ל... int. המטודה מקבלת 2 פרמטרים: את ה- string שאנחנו רוצים להמיר, ו- out argument שאליו היא תכניס את התוצאה, כשהסיבה ל- out היא שהפונקציה מחזירה bool שמטרתו לייצג האם הניסיון צלח או כשל.

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

אני אתחיל בדוגמא, פעם היינו רושמים:

int value = 0;if (int.TryParse("5", out value) && value > 4) { Console.WriteLine("value is greater than 4");}

בC# 6 ניתן לרשום:

if (int.TryParse("5", out int value) && value > 4) { Console.WriteLine("value is greater than 4");}

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

5. Exception Filters

החידוש הבא מאפשר לסנן את ה- Exceptions שאנחנו רוצים לתפוס, על מנת שלא נתפוס סתם Exceptions ובכך נמנע מהם לחלחל.

זה נראה כך:

try { throw new Exception("Eliran");}catch (Exception e) when (e.Message == "Eliran") { Console.WriteLine("Caught Eliran");}

המילה השמורה when מאפשרת לתפוס Exceptions רק כאשר התנאי שבתוכה מתקיים.

6. שימוש ב- using על מחלקה סטטית

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

הדוגמא הבאה תסביר את עצמה:

using static System.Console;public class Program{ public static void Main() { WriteLine("Hello World"); }}

 

קצת לא ברור לטעמי, אבל מי אני שאשפוט.

7. String Interpolation

מי שמכיר קצת PHP מכיר את האפשרות לרשום משתנים בתוך string, כאשר הם מוקפים ב- { }. ב- C# 6 שאבו את האפרשות הזו, וכאשר תכתבו $ לפני ה- string שלכם, הוא יוכל להכיל שמות משתנים.

לדוגמא:

string name = "Eliran";string fruit = "Apple";Console.WriteLine($"{name} is eating an {fruit}");

 

8. Roslyn

החידוש האחרון שאדבר עליו, הוא לא בדיוק חידוש ב- C# 6, אלא יותר ב- Visual Studio 2015:

Visual Studio 2015 היא הגרסא הראשונה של Visual Studio שבאה עם הקומפיילר החדש של .NET - רוסלין! למי שלא מכיר, רוסלין הוא קומפיילר חדש לחלוטין, שלעומת הישן, כתוב כולו ב- C# (במקום ב- C++), והוא Open Source תחת רישיון Apache.

רוסלין מפותח כבר כמה שנים, כאשר היה ניתן להשתמש בו באמצעות תוספים ל- Visual Studio, או ב- Visual Studio Community.

הצעד הזה חשוב מאוד, כיוון שהוא מלמד על זניחת הקומפיילר הקודם ומעבר לפלטפורמת Open Source, שבה באופן תאורתי - כל אחד יכול להרחיב את השפה, או למשל להשתמש בקוד של רוסלין על מנת לקמפל קוד C# לפלטפורמות אחרות.

זהו לבנתיים על C# 6. קיימים עוד שינויים חשובים ומעניינים, כמו await ו- nameof, אבל עליהם כבר ארחיב בפוסט אחר.

שמחתי לראות שהשפה ממשיכה להתרחב ולהתפתח.

מה הם Mixins?

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

 מבלבל?

Mixins קיימים בהרבה שפות, כמו: Dart, Ruby, TypesScript ו- JavaScript החל מES6.
מנועי CSS כמו SCSS גם משתמשים ב- Mixins בצורה מעט שונה.
אני אשתמש ב- TypeScript על מנת להדגים בעיה שניתן לפתור בקלות על ידי שימוש ב- Mixins:
נניח שיש לנו ארבעה גיבורי על: סופרמן, וונדרוומן, בטמן ואיירון מן. עכשיו נציג אותם בקוד:
class Superman implements Hero {
     fly() {
          console.log("Flying");
     }
    superPunch() {
          console.log("Puncing");
     }
}
 
class WonderWoman implements Hero {
     fly() {
          console.log("Flying");
     }
     superPunch() {
          console.log("Puncing");
     }
}
 
class Batman implements Hero {
}
 
class IronMan implements Hero {
     fly() {
          console.log("Flying");
     }
     superPunch() {
          console.log("Puncing");
     }
     shootLazer() {
          console.log("Shooting");
     }
}
הקוד שלמעלה ירוץ, הוא יעבוד מעולה, אבל הוא לא יהיה הכי פשוט לתחזוקה, כיוון שמספר גיבורי על חולקים כוחות זהים, ולכן כאשר נרצה לשנות את הדרך שבה אנחנו מממשים את אחד הכוחות, כנראה שנצטרך לשנות אותו כמה פעמים, במספר מחלקות; בעיה שרק תגדל כאשר יתווספו עוד גיבורים.

הפתרון של Mixin לבעיה הזו

ניתן לפתור בעיה כזו בעזרת Mixins, בצורה הבאה:
 
class FlyAbility {
    fly() {
         console.log("Flying");
    }
}
 
class SuperStrengthAbility {
    superPunch() {
         console.log("Puncing");
    }
}
class LazerAbility {
     shootLazer() {
          console.log("Shooting");
     }
}
 
class Superman implements Hero, FlyAbility, SuperStrengthAbility { }
class WonderWoman implements Hero, FlyAbility, SuperStrengthAbility { }
class Batman implements Hero { }
class IronMan implements Hero, FlyAbility, LazerAbility { }
 
applyMixins (Superman, [FlyAbility, SuperStrengthAbility]);
applyMixins (WonderWoman, [FlyAbility, SuperStrengthAbility]);
applyMixins (IronMan, [FlyAbility, LazerAbility]);
 
 בצורה כזו, כשנרצה לשנות את הדרך שבה אנחנו מממשים כוח נצטרך לשנות רק את המחלקה של אותו הכוח, ולא נצטרך לגעת בגיבורים, וכשנרצה להוסיף גיבור או להוסיף/להסיר כוחות לגיבורים, נוכל לעשות זאת בקלות רק על ידי ציון שמות הכוחות שיש לגיבורים בתור משהו שהמחלקה מממשת, והפעלת הכוחות עצמם בעזרת הפונקציה applyMixins.

חדי העין שבינכם בטח שמו לב לעיצוב החדש של האתר, שמסמל בין היתר גם עד כמה נשבר לי מ- WordPress.

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


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


בקרוב פוסטים חדשים, וקצת יותר אינפורמטיבייים, ואפילו המשך של מדריך ה- Sails.js המצולם שלנו.

לחיי התחלות חדשות :)

הפרק השישי במדריך ל- Sails.js: ה- Framework המטורף ל- Node.js

בפרק השישי נממש הרשמה והתחברות לבלוג.

Sails.js היא Framework מאוד חזק של Node.js, שמאפשרת לייצר אתרי אינטרנט בקלות.

צפייה מהנה!





הפרק החמישי במדריך ל- Sails.js: ה- Framework המטורף ל- Node.js

בפרק החמישי נדבר על גישה לדאטאבייס דרך Blueprints.

Sails.js היא Framework מאוד חזק של Node.js, שמאפשרת לייצר אתרי אינטרנט בקלות.

צפייה מהנה!



 

הפרק הרביעי במדריך ל- Sails.js: ה- Framework המטורף ל- Node.js

בפרק הרביעי נדבר על הLayout של Sails.js, ונשלב את Bootstrap בבלוג.

Sails.js היא Framework מאוד חזק של Node.js, שמאפשרת לייצר אתרי אינטרנט בקלות.

צפייה מהנה!






 

הפרק השלישי במדריך ל- Sails.js: ה- Framework המטורף ל- Node.js

בפרק השלישי נדבר על מה הם מודלים, איך יוצרים אותם ב- Sails.js, ועל איך לקנפג את הדאטאבייס ב- Sails.js.

Sails.js היא Framework מאוד חזק של Node.js, שמאפשרת לייצר אתרי אינטרנט בקלות.

צפייה מהנה!



 

הפרק השני במדריך ל- Sails.js: ה- Framework המטורף ל- Node.js

בפרק השני נדבר על איך ליצור Controller ולהתאים לו View, על איך לייצר Template בעזרת ejs ועל Routes.

Sails.js היא Framework מאוד חזק של Node.js, שמאפשרת לייצר אתרי אינטרנט בקלות.

צפייה מהנה!



 

הפרק הראשון במדריך ל- Express..js. ה- Framework המוכר והאהוב ל- Node.js.

בפרק הראשון נדבר קצת על NodeJS ועל ExpressJS ואיך הם מתקשרים, נעבור על ההתקנה, נסביר על פקודות בסיסיות וניצור את הפרוייקט הראשון שלנו ב- ExpressJS.

צפייה מהנה!




פרק ראשון בסדרת המדריכים המצולמים החדשה שלנו!

החלק הוא סדרה של סרטונים על Sails.js, שבסופם תדעו לייצר פרויקט שלם ב- Sails.

Sails.js היא Framework מאוד חזק של Node.js, שמאפשרת לייצר אתרי אינטרנט בקלות.





 

Web Notifications הוא API שמאפשר הצגת התראות למשתמש מחוץ לאתר - דרך הדפדפן. נכון לכתיבת שורה זו, כל הדפדפנים חוץ מ- Safari Mobile, Internet Explorer ו- Internet Explorer Mobile תומכים ביכולת הזו בצורה כלשהי, מה שהופך את Notifications API לנפוץ מאוד בימים האלו.

אתרים רבים משתמשים ב- Notifications API, כמו לדוגמא הממשקים הווביים של WhatsApp ו- Telegram, כיוון שנוח מאוד להודיע למשתמשים על הודעות צ'אט בעזרתו.

כידוע, WPF מממשת Observer על מנת ליידע את ה- UI שהמידע שקשור (Bound) אליו משתנה. ה- Interface שמממש את ה- Observer הזה נקרא INotifyPropertyChanged, והמימוש שלו נתון לשיקול המפתח.


private int _age;public int Age{get { return _age; }set{_age = value;// NotifyPropertyChanged....}}

ה- XAML יראה כך:

[xml][/xml]

גם אם אתם כבר מכירים את 2 המימושים הבסיסיים, האחרון יכול לחדש לכם, ולכן לקרוא אותו.

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

לאחרונה מייקרוסופט שחררו את Visual Studio 2015, ויחד איתו גם את C# 6. הפוסט היום יעסוק בפיצ'רים החדשים שנעשו בשפה:

1. Conditional Access Operator

החידוש הראשון נקרא Conditional Access Operator (או "אופרטור גישה מותנת"), הסימון שלו הוא ?. ובסיטואציות מסויימות הוא עלול להקל המון על החיים שלכם.

if (University != null){ if (University.Students != null) { int numberOfStudents = University.Students.Count; }})

 

יהפוך ל:

int? numberOfStudents = University?.Students?.Count;

 

האופרטור יחזיר null אם אחד מהאובייקטים בשרשרת הוא null, מה שיכול להיות מאוד שימושי בשרשראות ארוכות.

 


 

2. Auto Property Initializer

זוכרים Auto Properties? אותם Properties שמגדירים עם get ו- set אוטומטיים, מבלי לממש את הגוף שלהם? אז עכשיו גם אפשר לתת להם ערך.

בC# 6 ניתן לעשות השמה לProperty, מה שבסך הכל חוסך להגדיר אותו ב- Constructor.

פעם:

class Person { public string Name { get; set; } public Person  { Name = "Eliran"; } }

 

בC# 6:

class Person { public string Name { get; set; } = "Eliran";}

 

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

3. שיטה שונה לכתוב Constructor

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

פעם:

class Person { public string Name { get; set; } public Person(string name) { this.Name = name; }}

 

בC# 6:

class Person(string name) { public string Name { get; set; } = name;}

 

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

4. חידוש מסעיר ב- Out Parameter

אני משער שרוב מי שכותב בC# יותר מיום יומיים נתקל במטודה TryParse - ולמי שבכל זאת לא: מדובר במטודה שנמצאת בכמה מהמחלקות של C#, ומטרתה לנסות ולהפוך string לאובייקט מסויים. לדוגמא, המטודה TryParse ב- int מנסה להפוך string ל... int. המטודה מקבלת 2 פרמטרים: את ה- string שאנחנו רוצים להמיר, ו- out argument שאליו היא תכניס את התוצאה, כשהסיבה ל- out היא שהפונקציה מחזירה bool שמטרתו לייצג האם הניסיון צלח או כשל.

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

אני אתחיל בדוגמא, פעם היינו רושמים:

int value = 0;if (int.TryParse("5", out value) && value > 4) { Console.WriteLine("value is greater than 4");}

בC# 6 ניתן לרשום:

if (int.TryParse("5", out int value) && value > 4) { Console.WriteLine("value is greater than 4");}

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

5. Exception Filters

החידוש הבא מאפשר לסנן את ה- Exceptions שאנחנו רוצים לתפוס, על מנת שלא נתפוס סתם Exceptions ובכך נמנע מהם לחלחל.

זה נראה כך:

try { throw new Exception("Eliran");}catch (Exception e) when (e.Message == "Eliran") { Console.WriteLine("Caught Eliran");}

המילה השמורה when מאפשרת לתפוס Exceptions רק כאשר התנאי שבתוכה מתקיים.

6. שימוש ב- using על מחלקה סטטית

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

הדוגמא הבאה תסביר את עצמה:

using static System.Console;public class Program{ public static void Main() { WriteLine("Hello World"); }}

 

קצת לא ברור לטעמי, אבל מי אני שאשפוט.

7. String Interpolation

מי שמכיר קצת PHP מכיר את האפשרות לרשום משתנים בתוך string, כאשר הם מוקפים ב- { }. ב- C# 6 שאבו את האפרשות הזו, וכאשר תכתבו $ לפני ה- string שלכם, הוא יוכל להכיל שמות משתנים.

לדוגמא:

string name = "Eliran";string fruit = "Apple";Console.WriteLine($"{name} is eating an {fruit}");

 

8. Roslyn

החידוש האחרון שאדבר עליו, הוא לא בדיוק חידוש ב- C# 6, אלא יותר ב- Visual Studio 2015:

Visual Studio 2015 היא הגרסא הראשונה של Visual Studio שבאה עם הקומפיילר החדש של .NET - רוסלין! למי שלא מכיר, רוסלין הוא קומפיילר חדש לחלוטין, שלעומת הישן, כתוב כולו ב- C# (במקום ב- C++), והוא Open Source תחת רישיון Apache.

רוסלין מפותח כבר כמה שנים, כאשר היה ניתן להשתמש בו באמצעות תוספים ל- Visual Studio, או ב- Visual Studio Community.

הצעד הזה חשוב מאוד, כיוון שהוא מלמד על זניחת הקומפיילר הקודם ומעבר לפלטפורמת Open Source, שבה באופן תאורתי - כל אחד יכול להרחיב את השפה, או למשל להשתמש בקוד של רוסלין על מנת לקמפל קוד C# לפלטפורמות אחרות.

זהו לבנתיים על C# 6. קיימים עוד שינויים חשובים ומעניינים, כמו await ו- nameof, אבל עליהם כבר ארחיב בפוסט אחר.

שמחתי לראות שהשפה ממשיכה להתרחב ולהתפתח.