Menu
Coddy logo textTech

נתוני מופע לעומת נתונים סטטיים

חלק מהיחידה תכנות מונחה עצמים במסלול ה-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; }
}

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

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

challenge icon

אתגר

קל

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

תיצור שני קבצים כדי לארגן את הקוד שלך:

  • 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}
        }
    }
}
quiz iconבחנו את עצמכם

השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.

כל השיעורים ביחידה תכנות מונחה עצמים

תרגלו בעצמכם: קומפיילר C# אונליין