Pericode

Данный раздел находится в работе и пока здесь хозяйствует Муза.

В мире ИТ мы привыкли к разным областям использования кода, но рассмотрение команды людей через его призму может показаться весьма непривычным и где-то даже абсурдным. Но именно за подобными характеристиками могут скрываться самые потрясающие возможности.

Поскольку одной из ключевых задач Pericode было связать индустрию и академию, начнём с образовательного аспекта и используем его для объяснения интерфейсов. Для этого стоит подготовить себе рабочее место для написания кода на .NET.

Давайте представим, что у вас в команде есть инженер-разработчик (Stan). Его можно попросить реализовать какую-то функциональную возможность (feature) и он создаст (Code) соответствующий код (string). На языке C# такой процесс написания кода будет схематично выглядеть так:

Stan stan = new();
var code = stan.Code("Team-as-Code");
Console.WriteLine(code)

class Stan
{
    public string Code(string feature) => $"Код для {feature}";
}
            

Stan в процессе работы использует компьютер. И ему критически важно, чтобы он работал, поскольку без этого он не сможет выполнять свою основную функцию Code. В начале у него нормальный работающий компьютер.

Computer computer = new(true);
Stan stan = new(computer);
var code = stan.Code("Team-as-Code");
Console.WriteLine(code)

class Computer(bool working) 
{
    public bool IsWorking => working;
}

class Stan(Computer computer)
{
    public string Code(string feature) => computer.IsWorking switch {
        true => $"Код для {feature}",
        false => throw new("Что делать, компьютер сломался?")
    };
}
            

Всё выглядит хорошо ровно до момента пока компьютер не сломается. Но если мы в первой строке "сломаем" компьютер заменив true на false, то получим исключительную ситуацию, к которой мы не готовы. Для этого мы пригласим в команду системного администратора (John). Он либо починит существующий компьютер, либо предоставит новый.

class John 
{
    public Computer Fix(Computer computer) => new(true);
}
            

Теперь наш инженер-разработчик может спокойно работать, пока рядом есть Джон.

class Stan(Computer computer, John john) {
    public string Code(string feature)
    {
        if (!computer.IsWorking)
        {
            computer = john.Fix(computer);
        }

        return $"Код для {feature}";
    }
}
            

Команда растёт, количество инженеров уже перевалило за десять. Джон бы хотел в отпуск, но нельзя оставить команду без поддержки. И решили нанять Джека. Но как быть, все хорошо знают Джона, у все его контакты в буквальном... TODO: var team = new ServiceCollection(); Manager + plan + ...

И первой командой для кодификации я выберу... вою семью. Почему бы и нет? На языке C# моя дочь Таисия, сын Артемий, жена Юлия и ваш покорный слуга могли бы выглядеть так:

class Tasya {}
class DrArt {}
class Julia {}
class StanRed {}
            

Выглядит очень скудно, но сейчас мы это исправим. В команде у каждого есть обязанности. Например, девочки умеют готовить, мальчики - чинить. Так у возникают определённые интерфейсы взаимодействия друг с другом. Мы можем попросить другого что-то приготовить, указав название того, чтобы нам хотелось и получив в результате этот кулинарный объект.

interface ICooker 
{
    object Cook(string name);
}
            

Аналогичным образом попросить что-то отремонтировать. Но вместо названия блюда, мы будем указывать, что сломалось. И получим в результате уже отремонтированный объект.

interface IFixer 
{
    object Fix(string name);
}
            

Помимо прочего дети умеют рисовать.

interface IPainter 
{
    object Paint(string description);
}                
            

И теперь уже команда предстаёт в новом свете:

class Tasya : ICooker, IPainter
{
    object ICooker.Cook(string name) => "Чтобы ты не заказал, получилась яичница";
    object IPainter.Paint(string description) => $"Многоцветный рисунок {description} с большой экспрессией";
}

class DrArt : IFixer, IPainter
{
    object IFixer.Fix(string name) => $"Держи отремонтированный {name}";
    object IPainter.Paint(string description) => $"Карандашный рисунок {description} вниманием к стандартам";
}

class Julia : ICooker
{
    object ICooker.Cook(string name) => $"Приготовила {name} с любовью";
}

class StanRed : IFixer
{
    object IFixer.Fix(string name) => $"Отремонтировать {name} не смог, скорее всего подсунул новый";
}
            

Каждый член команды взял на себя определённые обязанности. Не у всех получается одинаково хорошо, но это не приговор.

Муза

  • Продемонстрировать индустриальную реализацию используя Specs.
  • Раскрыть суть принципа ISP.
An unhandled error has occurred. Reload 🗙