MySQL Java JavaScript PHP Python HTML-CSS C-sharp

Pattern-ul pozițional

Pattern-ul pozițional se aplică unui tip care are definită o metodă deconstructor. De exemplu, să definim următoarea clasă:

class MessageDetails
{
   public string Language { get; set; } = "";    // limba utilizatorului
   public string DateTime { get; set; } = "";    // timpul zilei
   public string Status { get; set; } = "";     // statutul utilizatorului

   public void Deconstruct(out string lang, out string datetime, out string status)
   {
       lang = Language;
       datetime = DateTime;
       status = Status;
   }
}

Acum folosim pattern-ul pozițional și în funcție de valorile obiectului MessageDetails vom returna un anumit mesaj:

string GetWelcome(MessageDetails details) => details switch
{
   ("english", "morning", _) => "Good morning",
   ("english", "evening", _) => "Good evening",
   ("german", "morning", _) => "Guten Morgen",
   ("german", "evening", _) => "Guten Abend",
   (_, _, "admin") => "Hello, Admin",
   _ => "Bună"
};

De fapt, acest pattern este similar cu exemplul cu tupluri de mai sus, doar că acum în construcția switch este transmis un obiect MessageDetails. Prin metoda deconstructor putem obține un set de parametri de ieșire sub formă de tuplu și, din nou, să-i comparăm cu anumite valori în construcția switch.

Aplicare:

MessageDetails details1 = new MessageDetails { Language = "english", DateTime = "evening", Status = "user" };
string message = GetWelcome(details1);
Console.WriteLine(message);  // Good evening

MessageDetails details2 = new MessageDetails { Language = "french", DateTime = "morning", Status = "admin" };
message = GetWelcome(details2);
Console.WriteLine(message);  // Hello, Admin

De asemenea, putem lua valorile obiectului MessageDetails și să le folosim la crearea rezultatului metodei:

string GetWelcome(MessageDetails details) => details switch
{
   ("english", "morning", _) => "Good morning",
   ("english", "evening", _) => "Good evening",
   ("german", "morning", _) => "Guten Morgen",
   ("german", "evening", _) => "Guten Abend",
   (_, _, "admin") => "Hello, Admin",
   (var lang, var datetime, var status) => $"{lang} not found, {datetime} unknown, {status} undefined",
   _ => "Bună"
};

În penultima instrucțiune din construcția switch obținem pe poziție valorile din MessageDetails în variabilele lang, datetime și status și le folosim pentru a crea mesajul:

MessageDetails details1 = new MessageDetails
{
   Language = "chinese",
   DateTime = "night",
   Status = "moderator"
};
string message = GetWelcome(details1);
Console.WriteLine(message);  // chinese not found, night unknown, moderator undefined
← Lecția anterioară Lecția următoare →