Рубрики
Uncategorized

Ветвь по абстракции, питается от Kotlin

Случай крупномасштабной рефакторинги. Допустим, однажды приходит ваш старший и рассказывает … Теги с Котлином, рефакторингом, CICD.

Случай крупномасштабной рефакторинги.

Давайте скажем, что однажды приходит ваш старший и говорит вам: «Привет, Кристина, я проверил эту новую классную библиотеку X, которая решает проблему Y, вы можете попытаться изменить некоторые звонки как доказательство концепции, а тем временем предоставляют нам Ваш отзыв о том, как это влияет на нас? «

Таким образом, вы взволнованы, вы получаете возможность грязи свои руки этой новой жаркостью, что все в сообществе говорят и доказывают себя команде. КЛАССНО!

Когда вы идете о документации, вы получаете ощущение, что эта библиотека действительно является спасением, и действительно должна быть интегрирована с остальной частью кодовой базы. На нижнем дне есть Большая Гочь. Миграция из текущей реализации новому не будет легко. Ваш единственный выбор — создать новую ветку с новой функцией и объединить его обратно в багажник (A.k.a. владелец). Или это не так? Вы не хотите быть тем, кто делает этот огромный запрос на тягу. Вам нужно только реализовать этот небольшой набор простых вызовов в новую библиотеку и оставить остальные быть. Как ты делаешь это?

Введите ветку по абстракции.

Принимая в виду, что вы не хотите находиться в ситуации огромного слияния, и что изменения должны быть опубликованы до остальной части команды как можно скорее, с некоторыми исследованиями вы можете наткнуться на технику, названную «Ветвь по абстракции» (BBA для остальной части поста). Первоначально он был представлен Пол-Хэммант и описано Джез скромный также.

Но Что именно BBA и как он отличается от классической функции разветвления в управлении версиями?

Цитируется непосредственно из Мартин Фаулер :

» Ветвь по абстракции «- это методика для создания широкомасштабных изменений в программную систему в постепенном способе, что позволяет регулярно выпустить систему, когда изменение все еще будет выполнено.

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

Допустим, начальная структура вашего кода это что-то подобное:

Начальная структура.

Шаги для BBA являются:

  1. Добавьте абстракцию над текущей старой реализацией.
  2. Refactor, чтобы все клиенты используют абстракцию выше, а не напрямую реализацию.

Шаги 1 и 2.

  1. Добавьте новую реализацию при этой абстракции и постепенно делегируйте на новую реализацию по мере необходимости.

Шаг 3.

  1. Как только старая реализация больше не используется, она может быть удалена.

Шаг 4.

  1. Как только рефакторинг закончится, удалите слой абстракции.

Шаг 5.

Хотя Martin Fowler описывает некоторые вариации, общая идея состоит в том, что вы создаете абстракцию над реализацией, которая нуждается в замене, найдите соответствующее поведение, которое абстракция должна реализовать, изменить код клиента, чтобы использовать эту абстракцию и постепенно добавить новый код.

Что больше вы можете использовать Функция переключается Итак, вы продолжаете доставлять программное обеспечение, даже если новая реализация незавершена.

Плюсы и минусы

Каждая техника имеет свои взлеты и падения, а BBA не хватает собственного:

Плюсы :

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

Минусы :

  • Процесс разработки может замедлиться, так как не всегда легко ввести необходимую абстрацию, или сделать два реализации, которые сосуществуют во время рефакторинга.
  • Трудно подать заявку, если код нуждается в внешнем аудитере.

Покажите мне код

Конечно, разговор дешевый и простой, но нетривиальный пример стоит тысячи слов. Давайте создадим простое приложение, которое экономит цитаты, а затем перечисляет их (названные дополнительной дозой воображения «QuotesApp»).

Для QuoteApp мы будем использовать шаблон MVP. Докладчики проведут квитанцию непосредственно вместо упреждеств, а quotesRepository будет иметь квитанцию, чтобы сохранить цитаты локально. В роли нашей устаревшей библиотеки мы будем использовать SQLBRITE2, и мы постараемся заменить его постепенно с новой библиотекой номер. Полный код примера является здесь Отказ

public interface QuotesDataSource {

    Observable> getSavedQuotes();

    Observable add(Quote quote);

}

public class SqlBriteQuotesDataSource implements QuotesDataSource {

    private final BriteDatabase briteDatabase;

    public SqlBriteQuotesDataSource(BriteDatabase briteDatabase) {
        this.briteDatabase = briteDatabase;
    }

    @Override
    public Observable> getSavedQuotes() {
        // get quotes with SqlBrite
    }

    @Override
    public Observable add(Quote quote) {
        // save a quote with SqlBrite
    }
}

Мы будем использовать интерфейс QuotesDataSource, чтобы представить абстракцию, необходимую для нашего рефакторинга BBA. В Java это будет выглядеть что-то вроде ниже. Мы бы сделали абстракцию реализовать QuotesDataSource, а затем вручную делегировать все вызовы методов старой реализации. Затем в нашем инжекторе зависимости мы будем обернуть реализацию SQLite с новым смешанным источником данных.

public class MixedSqliBriteRoomDataSource implements QuotesDataSource {

    private final QuotesDataSource oldDataSource;

    public MixedSqliBriteRoomDataSource(QuotesDataSource oldDataSource) {
        this.oldDataSource = oldDataSource;
    }

    @Override
    public Observable> getSavedQuotes() {
        return oldDataSource.getSavedQuotes();
    }

    @Override
    public Observable add(Quote quote) {
        return oldDataSource.add(quote);
    }

}

Извините, где мой котлин твист?

В этом примере у нас есть только два метода, но можно представить огромную API со ста или более методами. Разве это не будет утомительным и ошибкой, подверженным вручную делегированию старой реализации? До сих пор Kotlin не показал в посте, и теперь самое время сделать свой волшебный внешний вид. Мы могли бы использовать власть встроенного делегации Kotlin, и сделать делегат абстракции по умолчанию для старой реализации:

class MixedSqliteRoomDataSource(private val oldDataSource: QuotesDataSource)
: QuotesDataSource by oldDataSource

Это не только ценено и лаконично, но также спасает вас от ошибок, которые любой может легко сделать во время ручной делегации.

Вернуться к рефакторингу

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

class MixedSqliteRoomDataSource(private val oldDataSource: QuotesDataSource,
                                private val newDataSource: QuotesDataSource)
    : QuotesDataSource by oldDataSource {

    override fun getSavedQuotes(): Observable> {
        return newDataSource.savedQuotes
    }

}

Это намного проще подтолкнуть напрямую к магистральной линии, или если вы в пользу отзывы кода, сделайте короткую ветвь управления версией и откройте оттуда.

Когда вы добавляете все больше и больше методов в вашей новой реализации, старая и абстракция станет устаревшей, и, наконец, вы сможете удалить их.

Последние мысли

До сих пор BBA, кажется, довольно старший способ сделать масштабные изменения в вашей кодовой базе. Может не всегда легко сделать старые и новые реализации сосуществующими, но все вообще, похоже, стоят усилий. Более того, мы можем использовать силу делегации Котлина, чтобы быстро реализовать только набор поведений, чтобы обеспечить доказательство концепции, а затем продолжать остальную часть рефакторинга.

Оригинал: «https://dev.to/tsalikispk/branch-by-abstraction-powered-by-kotlin-2i6k»