Использование ReactiveX BehaviorSubject на уровне модели данных - хорошая идея? - PullRequest
0 голосов
/ 26 августа 2018

Сегодня, изучая API ReactiveX, я создал вспомогательный класс ObservedVariable, который выглядит следующим образом:

class ObservedVariable<T> {
    private T variable;
    private Subject<T> subject = new Subject<T>();
    public ObservedVariable(T variable) { this.variable = variable; }
    public IObservable<T> get() { return subject.AsObservable(); }
    public void get(Action<T> onChange) {
        get().Subscribe(onChange);
        onChange(variable);
    }
    public void set(T newValue) {
        variable = newValue;
        subject.OnNext(variable);
    }
}

class MyUserModel {
    public ObservedVariable<string> userName = new ObservedVariable<string>("Carl");
}

private void exampleOfAnObservedVar() {
    var viewThatIsAutomaticallyUpdated = GetComponent<Text>();

    var exampleUser = new MyUserModel();
    exampleUser.userName.get(userName => { viewThatIsAutomaticallyUpdated.text = userName; });
    exampleUser.userName.set("Caaaarl");
}

Затем я узнал, что BehaviorSubject уже делал именно то, что я хотел с моей реализацией ObservedVariable, и изменил пример на:

public static class BehaviorSubjectExtensions {
    public static void get<T>(this BehaviorSubject<T> self, Action<T> onChange) { self.Subscribe(onChange); }
    public static void set<T>(this BehaviorSubject<T> self, T newValue) { self.OnNext(newValue); }
}

class MyUserModel {
    public BehaviorSubject<string> userName = new BehaviorSubject<string>("Carl");
}

private void exampleOfAnObservedVar() {
    var viewThatIsAutomaticallyUpdated = GetComponent<Text>();

    var exampleUser = new MyUserModel();
    exampleUser.userName.get(userName => { viewThatIsAutomaticallyUpdated.text = userName; });
    exampleUser.userName.set("Caaaarl");
}

Мой главный вопрос: если я не помещаю BehaviorSubject непосредственно в модель данных, то у меня есть дублированное состояние, поэтому рекомендуется ли использовать BehaviorSubject (s) непосредственно в слое модели данных, если я хочу использовать такие реактивные поля?

...