נתוני מופע לעומת נתונים סטטיים
חלק מהיחידה תכנות מונחה עצמים במסלול ה-C# של Coddy. שיעור 15 מתוך 70.
עכשיו, אחרי שהבנת חברים סטטיים, נבהיר מתי להשתמש בנתוני מופע לעומת נתונים סטטיים. ההחלטה הזאת מעצבת את האופן שבו המחלקה שלך מאחסנת ומשתפת מידע.
נתוני מופע שייכים לכל אובייקט בנפרד. כל אובייקט מקבל עותק משלו, ושינויים באובייקט אחד אינם משפיעים על אובייקטים אחרים:
public class BankAccount
{
public string Owner { get; set; } // מופע - ייחודי לכל חשבון
public decimal Balance { get; set; } // מופע - ייחודי לכל חשבון
}לכל BankAccount יש בעלים ויתרה משלו. זה הגיוני, כי בחשבונות שונים יש סכומים שונים עבור אנשים שונים.
נתונים סטטיים שייכים למחלקה עצמה ומשותפים לכל המופעים:
public class BankAccount
{
public static decimal InterestRate = 0.05m; // סטטי - זהה לכולם
public static int TotalAccounts = 0; // סטטי - עוקב אחר כל החשבונות
public string Owner { get; set; }
public decimal Balance { get; set; }
}הריבית חלה במידה שווה על כל החשבונות, ולכן הגיוני שהיא תהיה סטטית. מונה החשבונות הכולל עוקב אחר מידע ברמת המחלקה, ולא אחר נתונים של חשבון בודד.
כלל פשוט: אם הנתונים מתארים אובייקט מסוים, הפוך אותם למופע. אם הם מתארים את המחלקה בכללותה או צריכים להיות משותפים, הפוך אותם לסטטיים. ערבוב שגוי ביניהם מוביל לבאגים שבהם הנתונים משתנים באופן בלתי צפוי בין אובייקטים או אינם נגישים כשצריך אותם.
אתגר
קלבוא נבנה מעקב אחר הפעלת משחק, המדגים את ההבדל בין נתונים השייכים לשחקנים בודדים לבין נתונים המשותפים לכל המשחק.
תיצור שני קבצים כדי לארגן את הקוד שלך:
Player.cs: הגדר מחלקה בשםPlayerבמרחב השמותGameSession. לכל שחקן ישUsername(מחרוזת) ו-Score(int) משלו — הם ייחודיים לכל שחקן. המחלקה צריכה לעקוב גם אחר מידע שחל על כל השחקנים: שדה סטטיGameName(מחרוזת) המאחסן את שם המשחק שכולם משחקים בו, ושדה סטטיTotalPlayers(int) הסופר כמה שחקנים הצטרפו. כלול בנאי המקבל את שם המשתמש ואת הניקוד ההתחלתי, ומגדיל אוטומטית את מספר השחקנים הכולל. הוסף שיטה סטטיתSetGameName(string name)להגדרת שם המשחק.Program.cs: בקובץ הראשי שלך, הגדר את המשחק וצור שחקנים על סמך הקלט. תחילה הגדר את שם המשחק, לאחר מכן צור שני שחקנים והצג את המידע האישי שלהם לצד נתוני המשחק המשותפים.
תקבל חמישה קלטים:
- שם המשחק
- שם המשתמש של השחקן הראשון
- הניקוד ההתחלתי של השחקן הראשון
- שם המשתמש של השחקן השני
- הניקוד ההתחלתי של השחקן השני
הדפס את הפלט בתבנית הזאת:
Game: {GameName}
Player: {Username}, Score: {Score}
Player: {Username}, Score: {Score}
Total Players: {TotalPlayers}לדוגמה, אם הקלטים הם BattleArena, DragonSlayer, 1500, ShadowNinja ו-2200, הפלט צריך להיות:
Game: BattleArena
Player: DragonSlayer, Score: 1500
Player: ShadowNinja, Score: 2200
Total Players: 2חשוב היטב אילו נתונים צריכים להיות מבוססי מופע (שונים עבור כל שחקן) ואילו צריכים להיות סטטיים (משותפים לכל השחקנים). שם המשחק ומספר השחקנים הכולל מתארים את ההפעלה כולה, בעוד ששם המשתמש והניקוד ייחודיים לכל שחקן.
נסו בעצמכם
using System;
namespace GameSession
{
class Program
{
public static void Main(string[] args)
{
// קרא את נתוני הקלט
string gameName = Console.ReadLine();
string username1 = Console.ReadLine();
int score1 = Convert.ToInt32(Console.ReadLine());
string username2 = Console.ReadLine();
int score2 = Convert.ToInt32(Console.ReadLine());
// TODO: הגדר את שם המשחק באמצעות המתודה הסטטית
// TODO: צור שני אובייקטים מסוג Player עם נתוני הקלט
// TODO: הדפס את הפלט בפורמט הנדרש
// משחק: {GameName}
// שחקן: {Username}, ניקוד: {Score}
// שחקן: {Username}, ניקוד: {Score}
// Total Players: {TotalPlayers}
}
}
}
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה תכנות מונחה עצמים
1יסודות התכנות מונחה העצמים
קבצים חיצונייםמרחבי שמות והנחיותמבוא למחלקות ולאובייקטיםמילת המפתח 'this'מתודות ופרמטריםשדות לעומת מאפייניםבנאיםאתחול אובייקטיםסיכום – מחשבון פשוט4ירושה
תחביר ירושה בסיסית (:)מילת המפתח 'base'מילות המפתח Virtual ו-Overrideמחלקות Sealedמחלקת הבסיס 'object'סיכום – היררכיית עובדים7תכונות מתקדמות
העמסת אופרטוריםאינדקסרים (this[])דריסת ToString()מתודות הרחבהסיכום – רשימה מותאמת אישית2מאפיינים וחברים סטטיים
מאפיינים במימוש אוטומטימאפיינים לקריאה בלבד ולכתיבה בלבדשדות ומתודות סטטייםמחלקות סטטיותחברים עם גוף ביטוי5פולימורפיזם וממשקים
פולימורפיזם בזמן קומפילציה לעומת בזמן ריצהממשק לעומת מחלקה מופשטתממשקים מרוביםממשקים מפורשיםהמרה כלפי מעלה והמרה כלפי מטהחזרה: מחשבון צורות8מושגים מתקדמים בתכנות מונחה עצמים
קומפוזיציה במקום ירושהGenerics (מחלקות ומתודות)נציגים ואירועיםמאפיינים ורפלקציהIDisposable והצהרת usingיסודות הזרקת תלויות3ארכיטקטורת מחלקות
נתוני מופע לעומת נתונים סטטייםמילות המפתח 'readonly' ו-'const'שדות גיבויסיכום – מנהל חשבונות בנקתרגלו בעצמכם: קומפיילר C# אונליין