Open sassanh opened 2 years ago
IMHO mobx.dart already has a flag enable/disable strict modes.
How can I enable it? Based on this thread I thought to enable strict mode you have to use ReactiveContext
which led me to https://github.com/mobxjs/mobx.dart/issues/206 which gives me the idea that you guys allow direct writes on observables even if write policy is set to ReactiveWritePolicy.always
.
Interesting. Originally I thought always
means any writes outside an action will throws. (I did use that flag long ago if I remember correctly)
I read this conversation https://github.com/mobxjs/mobx.dart/issues/206 I hope I'm not misunderstood but I think some context is missing about why it is needed for some developers to avoid directly writing on observables or why "strict-mode" was added to JavaScript version of the MobX library.
What you @pavanpodila mentioned here https://github.com/mobxjs/mobx.dart/issues/206#issuecomment-504813164 regarding performance concerns and avoiding a noisy/chatty reactive system is one of the reasons we need the "strict-mode". The other reason which has a history in immutable stores is to guarantee unidirectional data/control flow:
An event (user interaction, timely event, etc) triggers an action -> action modifies the store -> the ui will render the new store -> another event is triggered -> ...
Some software architects want to follow this pattern so that an event handler cannot directly change store and can do so only via a predefined action. It helps to keep all the logic that deals with the store in actions and others can only trigger it, so if you decide to have a
setValue
action to setvalue
observable, it may initially simply be athis.value = value
but in one iteration you may decide to have a different interpretation ofsetValue
,value
may become a computed/view in one iteration and you may want to keepsetValue
action for backward compatibility.So it is not safe to assume
x.value = v
is equivalent tox.setValue(v)
wheresetValue
is purposefully there by design, and it would be nice if we were able to enforce this policy so that a junior developer or someone not familiar with the design of the codebase cannot accidentally directly write to observables.So my question is "with the current design of MobX.dart, is it possible to have this kind of strict-mode?" (not letting developers directly write to observables) if the answer is no, can we add it as a feature? disabled by default probably, just like JavaScript library.