Données d'instance vs statiques
Fait partie de la section Programmation Orientée Objet du Journey C# de Coddy — leçon 15 sur 70.
Maintenant que vous comprenez les membres statiques, clarifions quand utiliser des données d'instance par rapport aux données statiques. Cette décision façonne la manière dont votre classe stocke et partage les informations.
Les données d'instance appartiennent à chaque objet individuellement. Chaque objet possède sa propre copie, et les modifications apportées à un objet n'affectent pas les autres :
public class BankAccount
{
public string Owner { get; set; } // Instance - unique par compte
public decimal Balance { get; set; } // Instance - unique par compte
}Chaque BankAccount a son propre propriétaire et son propre solde. C'est logique car différents comptes détiennent des montants différents pour différentes personnes.
Les données statiques appartiennent à la classe elle-même et sont partagées entre toutes les instances :
public class BankAccount
{
public static decimal InterestRate = 0.05m; // Statique - identique pour tous
public static int TotalAccounts = 0; // Statique - suit tous les comptes
public string Owner { get; set; }
public decimal Balance { get; set; }
}Le taux d'intérêt s'applique de la même manière à chaque compte, il est donc logique qu'il soit static. Le compteur total de comptes suit les informations à l'échelle de la classe, et non les données d'un compte individuel.
Une règle simple : si la donnée décrit un objet spécifique, rendez-la instance. Si elle décrit la class dans son ensemble ou doit être partagée, rendez-la static. Les mélanger de manière incorrecte entraîne des bogues où les données changent de manière inattendue entre les objets ou ne sont pas accessibles quand on en a besoin.
Défi
FacileConstruisons un suivi de session de jeu qui démontre la différence entre les données appartenant aux joueurs individuels et les données partagées sur l'ensemble du jeu.
Vous allez créer deux fichiers pour organiser votre code :
Player.cs: Définissez une classePlayerdans l'espace de nomsGameSession. Chaque joueur possède son propreUsername(string) etScore(int) - ceux-ci sont uniques à chaque joueur. La classe doit également suivre les informations qui s'appliquent à tous les joueurs : un champ statiqueGameName(string) qui stocke le nom du jeu auquel tout le monde joue, et un champ statiqueTotalPlayers(int) qui compte le nombre de joueurs ayant rejoint la partie. Incluez un constructeur qui prend le nom d'utilisateur et le score de départ, et qui incrémente automatiquement le nombre total de joueurs. Ajoutez une méthode statiqueSetGameName(string name)pour configurer le nom du jeu.Program.cs: Dans votre fichier principal, configurez le jeu et créez des joueurs en fonction des entrées. Définissez d'abord le nom du jeu, puis créez deux joueurs et affichez leurs informations individuelles ainsi que les données de jeu partagées.
Vous recevrez cinq entrées :
- Le nom du jeu
- Le nom d'utilisateur du premier joueur
- Le score de départ du premier joueur
- Le nom d'utilisateur du deuxième joueur
- Le score de départ du deuxième joueur
Affichez la sortie dans ce format :
Game: {GameName}
Player: {Username}, Score: {Score}
Player: {Username}, Score: {Score}
Total Players: {TotalPlayers}Par exemple, si les entrées sont BattleArena, DragonSlayer, 1500, ShadowNinja, et 2200, la sortie devrait être :
Game: BattleArena
Player: DragonSlayer, Score: 1500
Player: ShadowNinja, Score: 2200
Total Players: 2Réfléchissez bien aux données qui doivent être basées sur l'instance (différentes pour chaque joueur) et à celles qui doivent être statiques (partagées par tous les joueurs). Le nom du jeu et le nombre total de joueurs décrivent la session dans son ensemble, tandis que le nom d'utilisateur et le score sont uniques à chaque individu.
Aide-mémoire
Utilisez des données d'instance pour les propriétés qui sont uniques à chaque objet :
public class BankAccount
{
public string Owner { get; set; } // Chaque compte a son propre propriétaire
public decimal Balance { get; set; } // Chaque compte a son propre solde
}Utilisez des données statiques pour les propriétés partagées par toutes les instances d'une classe :
public class BankAccount
{
public static decimal InterestRate = 0.05m; // Identique pour tous les comptes
public static int TotalAccounts = 0; // Suit tous les comptes
public string Owner { get; set; }
public decimal Balance { get; set; }
}Règle de décision : Si les données décrivent un objet spécifique, utilisez des données d'instance. Si elles décrivent la classe dans son ensemble ou doivent être partagées, utilisez des données statiques.
Essayez vous-même
using System;
namespace GameSession
{
class Program
{
public static void Main(string[] args)
{
// Lire les entrées
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: Définir le nom du jeu en utilisant la méthode statique
// TODO: Créer deux objets Player avec les données d'entrée
// TODO: Afficher la sortie au format requis
// Game: {GameName}
// Player: {Username}, Score: {Score}
// Player: {Username}, Score: {Score}
// Total Players: {TotalPlayers}
}
}
}
Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.
Toutes les leçons de Programmation Orientée Objet
1Fondamentaux de la POO
Fichiers externesEspaces de noms et directivesIntro aux classes et objetsLe mot-clé 'this'Méthodes et paramètresChamps vs PropriétésConstructeursInitialiseurs d'objetsRécapitulatif - Calculatrice simple4Héritage
Syntaxe de base de l'héritage (:)Le mot-clé 'base'Mots-clés Virtual & OverrideClasses scelléesLa classe de base 'object'Récapitulatif - Hiérarchie des employés7Fonctionnalités avancées
Surcharge d'opérateursIndexeurs (this[])Redéfinition de ToString()Méthodes d'extensionRécapitulatif - Liste personnalisée10Patrons de conception - Partie 1
Introduction aux patrons de conceptionSingleton Thread-SafePatron FabriquePatron Observateur (Événements)Patron Stratégie2Propriétés et membres statiques
Propriétés auto-implémentéesPropriétés en lecture/écriture seuleChamps et méthodes statiquesClasses statiquesMembres à corps d'expression5Polymorphisme & Interfaces
Polymorphisme : Compilation vs ExécutionInterface vs Classe AbstraiteInterfaces MultiplesInterfaces ExplicitesUpcasting & DowncastingRécapitulatif - Calculateur de Formes8Concepts avancés de la POO
Composition plutôt qu'héritageGénériques (Classes et Méthodes)Délégués et ÉvénementsAttributs et RéflexionIDisposable et l'instruction usingBases de l'Injection de Dépendances11Patrons de conception, Partie 2
Patron CommandePatron AdaptateurPatron DécorateurPatron Méthode TemplatePatron ÉtatPatron Composite3Architecture des classes
Données d'instance vs statiquesMots-clés 'readonly' & 'const'Champs de supportRécapitulatif - Gestionnaire de compte bancaire6Encapsulation
Modificateurs d'accèsPropriétés pour l'encapsulationImplémentation du masquage de donnéesPatterns d'immuabilitéRécapitulatif - Dossiers d'étudiants12Projet : Système de gestion de bibliothèque
Structure du projetModèles Livre et Utilisateur