Рефакторинг кода с помощью паттерна Fluent-Builder и локальной инверсии контроля.

insert_comment 0
visibility 276
|
06.08.2020

Давайте подумаем над простым кодом: добавление элемента в список

В сишарпе мы бы записали это так

number.Add(2);

Но с помощь синтаксиса методов расширения можно сделать так

2.AddTo(numbers);

Инверсия контроля выражается идеей, что если A контролирует B то за счет некоторого программного интерфейса мы можем сделать инверсию и B начнет контролировать A. Под контролем я подразумеваю некоторые прописанные инварианты, пред, пост условия и инициатора. Т.е кто к кому обращается со специфичным контрактом.

С помощью методов расширения мы можем побороть синтаксис сишарпа.

Допустим такой пример.

Игра завершается если в триггер попал игрок, машина (в которой вероятно игрок) или мотоцикл. Все компоненты является наследниками IPlayerPresenter. Но если попал вертолет то игра не завершается так, как он мог просто пролетать мимо

Выглядеть это может так:

IPlayerPresenter enteredObject = collision.GetComponent<IPlayerPresenter>();

if(new[]{ typeof(Bicycle), typeof(Soldier), typeof(Car) }
.Contains(enteredObject.GetType()))
{
Console.WriteLine(true);
}

С точки зрения восприятия это уродство. Мы можем переделать это так:

if(enteredObject.Is(typeof(Bicycle), typeof(Soldier), typeof(Car)))
{
Console.WriteLine(true);
}

Сделать это можно с помощью такого метода расширения:

static class TypeCheckingExtensions
{
public static bool Is(this object obj, params Type[] types)
{
var type = obj.GetType();

return types.Contains(type);
}
}

Я бы хотел ещё удалить typeof как излишнее телодвижения.

В итоге получил следующее:

if (enteredObject.Is<Bicycle>().Or<Soldier>().Or<Car>())
{
Console.WriteLine(true);
}

Это удалось добиться с помощью применения паттерна FluentBuilder.

Полный листинг - https://gist.github.com/HolyMonkey/6e57d7e2d1ac26f2c6..

Если хотите регулярно видеть такие рефакторинги то становитесь донном нашего сообщества! Для платны подписчиков я пару раз в неделю публикую такие разбор.

Наша группа - https://vk.com/holymonkey_sandbox

7 курсов бесплатно

Начните карьеру разработчика игр бесплатно!


    Комментарии


    Отзывы