В моем текущем проекте Android я изучаю использование Kotlin.Я переписываю 100% Java-приложение для Android на 100% Kotlin.Однако я застрял при попытке реализовать мои построители шагов Java.
Я использовал построители шагов Java, поскольку они заставляют пользователей моего кода предоставлять все необходимые данные и / или функции, прежде чем они смогут выполнить связанный процесс RxJava..
Эти процессы RxJava являются сложными, и я хотел максимально упростить их инициализацию и выполнение.
Использование компоновщиков Java Step позволяет разработчикам писать следующий код: -
Sequence.builder()
.stepOne(one)
.stepTwo(two)
.stepThree(three)
.build()
.execute();
Я ищу котлинскую версию этого подхода.Первоначально я думал, что Kotlin будет поддерживать Builders и Step Builders.
Я не «ценен» при использовании Builders в Kotlin, решение Kotlin должно заставить разработчиков, использующих мой код, предоставлять все необходимые данные и /или функции, прежде чем они смогут выполнить связанный «исполняемый» код.
Из исследования Kotlin я обнаружил внутренние DSL, которые сами по себе звучат как интересная тема, так и возможное решение этого конкретного вопроса.
У меня есть ряд Step Builder для реализации, ни один из них не имеет более 6 параметров.Однако я стараюсь придерживаться правила SOLID не более трех параметров.
Также, если это имеет какое-либо значение, некоторые из переданных параметров являются действиями и потребителями RxJava.Значения по умолчанию здесь не имеют значения, поскольку ни один из параметров не имеет допустимых значений по умолчанию.
ОБНОВЛЕНИЕ
Все мои построители шагов Java похожи на это: -
public class ExampleSequence extends Sequence {
private static final String TAG = "ExampleSequence";
private final Action onComplete;
private final Consumer<? super Throwable> onError;
/**
* @param builder
*/
private ExampleSequence(final Builder builder) {
super(builder.getDoLoginRefreshFail());
this.onError = builder.getOnError();
this.onComplete = builder.getOnComplete();
}
/**
*
*/
public static OnCompleteAction builder() {
return new Builder();
}
public interface OnCompleteAction {
onErrorAction onComplete(@NonNull final Action onComplete);
}
public interface onErrorAction {
DoLoginRefreshFail onError(@NonNull final Consumer<? super Throwable> onError);
}
public interface DoLoginRefreshFail {
Build doLoginRefreshFail(@NonNull final Action doLoginRefreshFail);
}
public interface Build {
ExampleSequence build();
}
@SuppressLint("CheckResult")
public void execute() {
final AtomicInteger retryCounter = new AtomicInteger(0);
final Observable<Response<GraphqlQueryResponse>> feedArticles = getPageAndNextInboxArticles(offset, limit)
.onErrorResumeNext(manufactureResumeNext())
.subscribeOn(Schedulers.io());
final Observable<Response<GraphqlQueryResponse>> readingListArticles = getPageAndReadingListArticles(readingListoffset, limit)
.onErrorResumeNext(manufactureResumeNext())
.subscribeOn(Schedulers.io());
login()
.flatMap(...)
.ignoreElement()
.andThen(...)
.andThen(...)
.ignoreElements()
.andThen(...)
.flattenAsObservable(x -> x)
.flatMapCompletable(...)
.retryWhen(errors -> errors.flatMap(e -> constructRetryHandler(retryCounter, e)))
.doOnComplete(onComplete)
.doOnError(onError)
.doAfterTerminate(doAfterTerminate())
.doOnSubscribe(compositeDisposable::add)
.blockingAwait();
}
/**********************************************************************************
*
* BUILDER
*
*/
public static class Builder implements OnCompleteAction, onErrorAction, DoLoginRefreshFail, Build {
private Action onComplete;
private Consumer<? super Throwable> onError;
private Action doLoginRefreshFail;
/***********************************************************************
*
*/
@Override
public ExampleSequence build() {
return new ExampleSequence(this);
}
@Override
public onErrorAction onComplete(@NonNull final Action onComplete) {
this.onComplete = onComplete;
return this;
}
@Override
public DoLoginRefreshFail onError(@NonNull final Consumer<? super Throwable> onError) {
this.onError = onError;
return this;
}
@Override
public Build doLoginRefreshFail(@NonNull final Action doLoginRefreshFail) {
this.doLoginRefreshFail = doLoginRefreshFail;
return this;
}
/**
* @return the onError
*/
Consumer<? super Throwable> getOnError() {
return onError;
}
/**
* @return the onComplete
*/
Action getOnComplete() {
return onComplete;
}
Action getDoLoginRefreshFail() {
return doLoginRefreshFail;
}
}
}