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.