Случай крупномасштабной рефакторинги.
Давайте скажем, что однажды приходит ваш старший и говорит вам: «Привет, Кристина, я проверил эту новую классную библиотеку X, которая решает проблему Y, вы можете попытаться изменить некоторые звонки как доказательство концепции, а тем временем предоставляют нам Ваш отзыв о том, как это влияет на нас? «
Таким образом, вы взволнованы, вы получаете возможность грязи свои руки этой новой жаркостью, что все в сообществе говорят и доказывают себя команде. КЛАССНО!
Когда вы идете о документации, вы получаете ощущение, что эта библиотека действительно является спасением, и действительно должна быть интегрирована с остальной частью кодовой базы. На нижнем дне есть Большая Гочь. Миграция из текущей реализации новому не будет легко. Ваш единственный выбор — создать новую ветку с новой функцией и объединить его обратно в багажник (A.k.a. владелец). Или это не так? Вы не хотите быть тем, кто делает этот огромный запрос на тягу. Вам нужно только реализовать этот небольшой набор простых вызовов в новую библиотеку и оставить остальные быть. Как ты делаешь это?
Введите ветку по абстракции.
Принимая в виду, что вы не хотите находиться в ситуации огромного слияния, и что изменения должны быть опубликованы до остальной части команды как можно скорее, с некоторыми исследованиями вы можете наткнуться на технику, названную «Ветвь по абстракции» (BBA для остальной части поста). Первоначально он был представлен Пол-Хэммант и описано Джез скромный также.
Но Что именно BBA и как он отличается от классической функции разветвления в управлении версиями?
Цитируется непосредственно из Мартин Фаулер :
» Ветвь по абстракции «- это методика для создания широкомасштабных изменений в программную систему в постепенном способе, что позволяет регулярно выпустить систему, когда изменение все еще будет выполнено.
Название техники немного вводит в заблуждение, так как он содержит термин «ветвь» в своем определении, который почти сразу намекает на то, что мы говорим о разветвлении, что и в создании новой отрасли в контроле источника. Напротив, методика отстаивается Развитие на основе багажника , модель ветвления исходного контроля, где все разработчики подтолкнутся напрямую в основной линии. Вместо того, чтобы разветвляться в контроле источника, «Разветвление» происходит в коде напрямую.
Допустим, начальная структура вашего кода это что-то подобное:
Начальная структура.
Шаги для BBA являются:
- Добавьте абстракцию над текущей старой реализацией.
- Refactor, чтобы все клиенты используют абстракцию выше, а не напрямую реализацию.
Шаги 1 и 2.
- Добавьте новую реализацию при этой абстракции и постепенно делегируйте на новую реализацию по мере необходимости.
Шаг 3.
- Как только старая реализация больше не используется, она может быть удалена.
Шаг 4.
- Как только рефакторинг закончится, удалите слой абстракции.
Шаг 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»