Объясните про pattern matching в C#
От: dmitry_npi Россия  
Дата: 25.05.18 06:29
Оценка: +1 -1
В новых версиях языка ввели расширенный оператор switch, обозвали его "pattern matching", и рекламируют примерно так:

static string M(Person person)
{
    switch (person)
    {
        case Professor p:
            return $"Dr. {p.LastName}";
        case Studen s:
            return $"{s.FirstName} {s.LastName} ({s.Level})";
        default:
            return $"{person.FirstName} {person.LastName}";
    }
}

(взято отсюда)

Вопрос первый: в чем принципиальная новизна, которая заслуживает специального термина "pattern matching", ведь это можно было проделать и раньше, используя is/as и if/else, хоть и более громоздко?
То есть, это просто синтаксический оверхед сахар?

Вопрос второй: зачем это вообще нужно в ООП-языке? Я понимаю, что сейчас шарп дрифтует в сторону функциональщины, но ведь основой всё равно остаётся ООП. С моей точки зрения, в стиле ООП надо было сделать как-то так:
abstract class Person
{
   public string FirstName {get;set;}
   public string LastName {get;set;}

   public virtual string GetDisplayString()
   {
      return $"{FirstName} {LastName}";
   }
}

class Professor: Person
{
   public override string GetDisplayString()
   {
      return $"Dr. {LastName}";
   }
}
class Student: Person
{
   public int Level {get;set;}

   public override string GetDisplayString()
   {
      return $"{FirstName} {LastName} ({Level})";
   }
}
...
static string M(Person person)
{
    return person.GetDisplayString();
}


Здесь и модульность (можно отдельно добавлять классы), и удобство поддержки многих точек выбора (ветвление неявно осуществляет компилятор).
Новый способ банально провоцирует писать плохой код, да еще и с большим удобством
Атмосферная музыка — www.aventuel.net
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.