ãã®å·ãéããŠãèå³æ·±ãTwitterãã£ã¹ã«ãã·ã§ã³ãç¶ããŸããåŸäžã®ããã«ã以äžã«ã³ããŒããŸãã
Edygarã»ãã»ãªã@edygarDeLimaæ°
@acdlite @dan_abramov Fluxãã³ãã³ãã¯ãšãªåé¢è²¬ä»»ã«éåžžã«é¡äŒŒããŠããã®ã«ãçšèªãéåžžã«ç°ãªãã®ã¯ãªãã§ããïŒ
ãã³ã»ã¢ãã©ã¢ãç£ç£ã®@dan_abramovã¯èšããŸãïŒ
ç§ãèå³ããããŸããå€å@ fisherwebdev ã @ jingcã¯ããã€ãã®å ã@edygardelima @acdlite
ãã«ãã£ãã·ã£ãŒ@fisherwebdevã¯èšããŸãïŒ
@dan_abramov @edygarDeLima @ acdlite- @ jingcã«ã¯ããå€ãã®ã³ã³ããã¹ãããããŸãããFluxã®èµ·æºã¯ãCQRSãæ¡çšããã«ç¶æ 管çã解決ããããšã§ããã
ããŒãYandellã®@notahatã¯èšããŸãïŒ
@fisherwebdev @dan_abramov @edygarDeLima @acdlite @jingcé©åïŒReduxãšCQRSã®ã¢ã€ãã¢ãããã·ã¥ã¢ããããŠã¿ãŸããïŒ https ïŒ
ãã³ã»ã¢ãã©ã¢ãç£ç£ã®@dan_abramovã¯èšããŸãïŒ
@notahat @fisherwebdev @edygardelima @acdlite @jingcç§ã«ãšã£ãŠæ倧ã®åé¡ã¯ãã¢ã¯ã·ã§ã³ïŒãäºå®ãïŒã®æ¬ åŠã§ãã ããŒã¿ãã¡ã€ã³ãåé¢ããã®ã¯é£ããã
ããŒãYandellã®@notahatã¯èšããŸãïŒ
@dan_abramov @fisherwebdev @edygarDeLima @acdlite @jingcããããã¢ã¯ã·ã§ã³ãã¯ã€ãã³ããœãŒã·ã³ã°ã®äžçããã®ãã€ãã³ããã®ãããªãã®ã§ã...
ããŒãYandellã®@notahatã¯èšããŸãïŒ
@dan_abramov @fisherwebdev @edygarDeLima @acdlite @jingcããããã€ãã³ããœãŒã·ã³ã°ãšCQRSã¯ãå¯æ¥ã«é¢é£ããŠããå¯èœæ§ããããŸãã
ãããã£ãŠãã€ãã³ããœãŒã·ã³ã°ã¯ããããŸã§ã«ééããããšããªãå Žåããã¡ã€ã³ã§çºçãããã¹ãŠã®ãã®ããã€ãã³ãããšããŠæ±ãããã¹ãŠã®ã€ãã³ããèšé²ãããã®ã€ãã³ããä¿¡é Œã§ããæ å ±æºãšèŠãªããŸãã ä»ã®ãã¹ãŠã®ããŒã¿ã¯æŽŸçç¶æ ãšããŠè¡šç€ºãããã ãã§ãããã€ãã³ããåçããããšã§åçæã§ããã¯ãã§ãã
ããã«ã¯Reduxãšéåžžã«åŒ·ãé¡äŒŒæ§ããããšæããŸãã ã¢ã¯ã·ã§ã³ã¯ã€ãã³ãã§ãããçŽç²ãªã¬ãã¥ãŒãµãŒé¢æ°ã䜿çšããŠç¶æ ãå€æŽãããšãã¢ã¯ã·ã§ã³ãåçãããšåãç¶æ ã«æ»ãããšãä¿èšŒãããŸãã
ã€ãã³ããœãŒã·ã³ã°ãšCQRSã¯å¯æ¥ã«é¢é£ããŠããŸãããã©ã¡ããäžæ¹ãä»æ¹ãªãã§å®è¡ããããšã¯å¯èœã§ãã ïŒã€ãã³ããœãŒã·ã³ã°ã®äž»èŠãªæ¯æè å šå¡ããã®å£°æã«åæããããã§ã¯ãããŸããããããã¯å¥ã®è°è«ã§ããïŒ
ãã®é·æãšçæã¯æ¬¡ã®ãšããã§ããCQRSãšã€ãã³ããœãŒã·ã³ã°ã®äž¡æ¹ããåŠã¶ã¹ãèå³æ·±ãããšãããããããã¯Reduxã®ããã€ãã®ã¢ã€ãã¢ãæ確ã«ããã®ã«åœ¹ç«ã€å¯èœæ§ããããŸãã
CQRSã®èšèªã¯ãFluxãReduxã®èšèªãããæ確ã ãšæããŸãããããã¯ãããã奜ã¿ã®åé¡ã§ãã 確ãã«ããã¹ãã¢ããšããèšèã¯ããã©ãã¯ã¹ã®äžçã§ã¯éåžžã«éè² è·ã«ãªã£ãŠãããšæããŸãã
PSå°ãæéãããã°ãããã¡ãã®äŸãåãäžããŠãã·ãªã¢ã«åå¯èœãªã¢ã¯ã·ã§ã³ã䜿çšããããã«å€æã§ãããã©ããã確èªãããããããŸããã ããã¯é£ããããšã§ã¯ãªããå éšã®ã¡ã¿ããã°ã©ãã³ã°ã®é»éè¡ã®ããã€ããåãé€ãã®ã«åœ¹ç«ã¡ãŸãã
+1
CQRS + Event-Sourceã«æ
£ããŠããªãæ¹ã®ããã«ãããã«åŠç¿ã®ããã®åªãããªãœãŒã¹ããããŸãã
http://cqrs.nu/tutorial/cs/01-design
@notahat ãç§ã¯ããªãã«åæããŸãïŒ
CQRSãšã€ãã³ããœãŒã·ã³ã°ã®äž¡æ¹ããåŠã¶ã¹ãèå³æ·±ãããšããããŸã[âŠ]
CQRSã®èšèªã¯ãFluxãReduxã®èšèªãããæ確ã ãšæããŸã[âŠ]
IMHOãCQRSãããã³Fluxã¯éåžžã«äŒŒãŠãããçšèªã®ã¿ãç°ãªããŸãããEvent-Sourceã¯ãŸãã«ReduxDevToolsãå®è£ ãããã®ã§ãã
ããã¡ãã®CQRSã®äŸã§è¡ã£ãŠããããšãå°ãæ確ã«ããå³ãè¿œå ããŸããïŒ https ïŒ
æå³çã§ã¯ãªããããããŸããããreduxã®ãã·ã³ã°ã«ã¹ãã¢ãã¯ã @ gregoryyoungã«ãããã¬ãŒã³ããŒã·ã§ã³ãæãåºãããŸãã圌ã¯ãçŸåšã®ç¶æ ã¯ä»¥åã®åäœã®å·Šæãã§ãããšèª¬æããŠããŸãã
@gaearon Reduxã¹ãã¢ãšEventStoreã®èåŸã«ããã¢ã€ãã¢ã®éã«ã¯çŽæ¥çãªçžé¢é¢ä¿ããããšæããŸããïŒ
ããã€ãã®Fluxå®è£
ã䜿çšããç§ã®çµéšã§ã¯ã actions
ã¯åãªãïŒã€ãã³ã|ã·ã°ãã«|ã¡ãã»ãŒãžïŒã§ããããšã«åæããŸãã action
ãšããååã¯ãäœãä»ã®ããšïŒäœããããããšïŒãæå³ããã®ã§ãæªãéžæã ãšæããŸãã
éåžžãæµåçã«äœããè¡ãããšã¯ãéåæã¢ã¯ã·ã§ã³ã§çºçããŸãã ãããã¯ããããã³ãã³ããšåŒã°ããæ¹ãè¯ãã§ãããã
ããã¯å®çšçã§ã¯ãªãããã§ãã®ã§ãç· ãããããŸãã
ã¢ã¯ã·ã§ã³ã¯ãªãšãŒã¿ãŒã¯åºæ¬çã«ã³ãã³ãã§ã
ã¢ã¯ã·ã§ã³ã¯åºæ¬çã«ã€ãã³ãã§ã
DispatchïŒïŒã¯äºå®äžã³ãã³ããã¹ã§ã
åºèã¯å€ããå°ãªãããã¥ãŒã®æ圱ã§ã
FluxïŒReduxã¯ãäžè¬çãªCQRSãã¿ãŒã³/ååã®IMOå®è£ ã§ãã
以åã®è°è«ãããæ°ããçšèªã®çç±ã¯ã©ã¡ããã ãšæããŸãã
ããªããèšã£ãããã«ãCQRSã®ååã¯ãã°ãã°DDD /ã€ãã³ããœãŒã·ã³ã°ãªã©ãšæ··åãããŸã-ããã¯åçŽãªã³ã¢ã¢ã€ãã¢ãæãªãå¯èœæ§ããããšæããŸãã
@glenjamin for meã¢ã¯ã·ã§ã³ã¯ãªãšãŒã¿ãŒã¯ãã³ãã³ãã§ãã£ãŠã¯ãªããŸããã ããã³ããšã³ãã«æ®ãã®ã§ãåºæ¬çã«ã³ãã³ãã¯ãããŸããããŠãŒã¶ãŒãUIã§äœããã®ã¢ã¯ã·ã§ã³ãå®è¡ããå Žåãããã¯ãããã€ãã³ãã§ããå¿ èŠããããŸãã
ããã¯ãšã³ãã®æŠå¿µã¯å¿ ãããããã³ããšã³ãã®æŠå¿µã«å³å¯ã«é¢é£ããŠãããšã¯éããŸãããããã¯ãšã³ãã¯ãŠãŒã¶ãŒã®æå³ãéåæçã«åä¿¡ããããã³ãã¯åæçã«åä¿¡ãããããå®éã«ã¯åžžã«éå»ã«çºçããŸãã
ç¹ã«redux-sagaã䜿ãå§ããå Žåã¯ãã¢ã¯ã·ã§ã³ã¯ãªãšãŒã¿ãŒã¯ãŸã£ããå¿ èŠãªããšæããŸãã ããã§ã¢ã¯ã·ã§ã³ã¯ãªãšãŒã¿ãŒã眮ãæããæ¹æ³ãåç §ããŠãã ããïŒ http ïŒ
redux-thunkïŒ
<div onClick={e => dispatch(actions.loadUserProfile(123)}>Robert</div>
function loadUserProfile(userId) {
return dispatch => fetch(`http://data.com/${userId}`)
.then(res => res.json())
.then(
data => dispatch({ type: 'USER_PROFILE_LOADED', data }),
err => dispatch({ type: 'USER_PROFILE_LOAD_FAILED', err })
);
}
redux-sagaïŒ
<div onClick={e => dispatch({ type: 'USER_NAME_CLICKED', 123 })}>Robert</div>
function* loadUserProfileSaga() {
while(true) {
const action = yield take("USER_NAME_CLICKED")
const userId = action.payload;
try {
const userProfile = yield fetch('http://data.com/${userId}')
yield put({ type: 'USER_PROFILE_LOADED', userProfile })
}
catch(err) {
yield put({ type: 'USER_PROFILE_LOAD_FAILED', err })
}
}
}
ãŸãããã¡ã€ã³é§åèšèšïŒã€ãã³ããœãŒã·ã³ã°ã䜿çšããããã¯ãšã³ãã§ãã䜿çšãããïŒãããã³ããšã³ãã§äœ¿çšããæ¹æ³ã«ã€ããŠãå°ã説æããŸããã https://github.com/rackt/redux/issues/1315#issuecomment-179164091ãåç §ããŠ
ããã«ã¡ã¯ãããã¯éåžžã«èå³æ·±ããããã¯ã ãšæããŸãïŒ ç§ã®ãããžã§ã¯ãã§ã¯ãreact-reduxãšthunksã䜿çšããŠããã³ããšã³ãã®åºæ¬ãäœæããŸããã ç§ã¯é·ãéããµãŒããŒã§ã€ãã³ããœãŒã·ã³ã°/ CQRSã䜿çšããŠããŒã¿ãåŠçãåŠçãæé©åããããšãèšç»ããŠããŸããã ReduxãåŠã³ãæããäžã§ãããããµãŒããŒåŽã®ã³ãã³ããåŠçããã¯ã©ã€ã¢ã³ãã«è¡šç€ºããããã§ãã¯ãã€ã³ããçæããã®ã«æé©ãªç°å¢ã§ããå¯èœæ§ãé«ãããšã«æ°ä»ããŸããã ã¹ãã¢ã¯ãã»ãšãã©ã®å ŽåãããŒã¿ã¹ãã¢ã®è€éãªãã£ãã·ã¥ã®ããã«ãªãããªã³ããã³ãã§ããŒããããŸãã ã³ãã³ããçä¿¡ãããšãredux-sagasïŒãŸãã¯ãµã³ã¯ïŒãã³ãã³ããåŠçããæ°žç¶æ§ïŒãã§ãã¯ãã€ã³ãïŒãšã¬ãã¥ãŒãµãŒã®äž¡æ¹ã«ã¢ã¯ã·ã§ã³ãéä¿¡ããŸãã ã¯ã©ã€ã¢ã³ãã¯ãRTæŽæ°ãåä¿¡ããåŸããã®çµæãèªã¿åããããã«å¿ããŠreduxç¶æ ãæŽæ°ããŸãã
誰ããããã«ã€ããŠäœãçµéšããããŸããããŸãã¯ããã«å¯Ÿããæšå¥šäºé ã¯ãããŸããïŒ
@tvedtoramaåæããŸã
ç§ã¯redux-boot ã redux-boot-webserverã®ãããªããã€ãã®ãããžã§ã¯ãã«åãçµãã§ãããäŸãšããŠã ReduxAPIã«åºã¥ããŠããã¯ãšã³ãã¢ãžã¥ãŒã«ãæ§ç¯ããæ¹æ³ã瀺ã
ãããããã¯ãšã³ãã«Reduxã䜿çšãããå Žåã¯ãReduxã¯æŠå¿µçã«ããã70locã®éåžžã«å°ããªã©ã€ãã©ãªã§ãããReduxã®æŠå¿µã¯äž»ã«æ¢åã®ããã¯ãšã³ãã¹ããªãŒã åŠçã·ã¹ãã ããçæ³ãåŸãŠããããšãå¿ããªãã§ãã ããã
çã®Reduxãããã¯ãšã³ãã«ç§»æ€ãã代ããã«ãã»ãšãã©ã®ããŒã«ïŒdevtools / react-redux / reselect ...ïŒã䜿çšã§ãããå¿ èŠãªããŒã«ã®å€ããæ¬ èœããŠããŸãïŒãã°ã®æ°žç¶æ§ãç¶æ ã®ã€ã³ããã¯ã¹äœæãã¹ãããã·ã§ãããæ°žç¶åããããã°ïŒ replayïŒããããã®æ¢åã®70locãåå©çšããããã«ãReduxãæåã«ååšããåã§ãåé¡ã解決ããæ¢åã®ããã¯ãšã³ãããŒã«ã掻çšããŠã¿ãŸãããïŒ
ç§ã¯ã EventStoreã®ãããªéåžžã«åçŽãªããŒã«ãèããŠããŸããããã«ãããåæ£ã€ãã³ããã°ãé·æéä¿æãããã°ãããžã§ã¯ã·ã§ã³ïŒReduxã¢ã¯ã·ã§ã³ãªãã¥ãŒãµãŒãšåçïŒãæ§ç¯ã§ããŸãã å°åœ±ã¯æ°ããã€ãã³ããçºããããšãã§ããã®ã§ãããã¯ãŸãç©èªã®ããã«æ¯ãèãããšãã§ããŸãã
ããé«åºŠãªãŠãŒã¹ã±ãŒã¹ã«ã€ããŠã¯ãKafkaãSamzaãStormãªã©ã®å€ãã®ããŒã«ããã§ã«ååšããŸã...
ã»ãšãã©ã®å Žåãã€ãã³ãã䜿çšããŠã¢ããªãã¢ãã«åããã ãã§ã¯äžååã§ããå¯èœæ§ãããããããã¡ã€ã³é§åèšèšãšããŠèŠãããšãå¿ããªãã§ãã ããããããããå¶éä»ãã³ã³ããã¹ããšã¯äœããããã³éçŽã«ãŒããç解ããå¿ èŠããããŸãã
å®éã«devtoolsããœã±ããçµç±ã§ããã¯ãšã³ãã§äœ¿çšã§ããããšãè¿œå ããã ãã§ãããã«äŸããããŸãã
çŽ æŽããã@zalmoxisus :)
ãããããããããã¯ãšã³ãã«éåžžã«åœ¹ç«ã€ãã©ããã¯ããããŸãããçŽåŸããã«ã¯ãå®éã®äœ¿çšæ³ã確èªããã®ãåŸ ã€å¿ èŠããããŸãïŒpã ã€ãã³ããœãŒã¹ã®ã¢ããªãäœæãã人ã¯éåžžãã¬ãã¥ãŒãµãŒ/ãããžã§ã¯ã·ã§ã³ã®å€æŽåŸã«ãã°å šäœãåçããŸããç§ã®æèŠã§ã¯ããŠãŒã¶ãŒãã¿ã€ã ãã©ãã«ã䜿çšããå¯èœæ§ã¯äœããªããŸãã æçµçã«ã¯ããã°ã®ã³ã³ããã¹ããåçŸããããã«ç¹å®ã®ç¶æ ããªã»ããããã®ã«åœ¹ç«ã€å¯èœæ§ããããŸãããããã¯ãšã«ããã¹ãããã·ã§ãããæäŸãããã®ã§ã:)
@slorberçŽ æŽããããã£ãŒãããã¯ãããããšãïŒ ããªããèšåãããµãŒããŒã察象ãšããããŒã«ã調ã¹ãŸãã ãã ããããã³ããšã³ããšãµãŒããŒã®äž¡æ¹ã§åããã¬ãŒã ã¯ãŒã¯ã䜿çšã§ããããšã¯ãããŒã«ã¹ã¿ãã¯ã®åŠç¿æ²ç·ãå°ãªããªããããããèªäœãå©ç¹ã«ãªãå¯èœæ§ããããšæããŸãã ã¬ã€ã€ãŒéã§ã¬ãã¥ãŒãµãŒã®äžéšãåå©çšããããšæã£ãŠããŸãã DDDã®åé¡ã確ãã«æå¹ãªæžå¿µäºé ã§ãããããã³ããšã³ãã®æ§é ãåã«ã³ããŒããªãããã«æ³šæããå¿ èŠããããŸãã ç§ã¯ãã¹ãã¢å ã®äžŠåæ§é ãåã«å®çŸ©ããããšã«ãã£ãŠããŸãã¯å®å šã«ç°ãªããµã¬/ã¬ãã¥ãŒãµãŒãæã€äžŠåã¹ãã¢ã®ããããã«ãã£ãŠãå¶éãããã³ã³ããã¹ããåŠçããããšãèããŠããŸããã ãããã®äžŠåæ§é ã¯ãåãã€ãã³ãã«éšåçã«å¿çããŸãããç¶æ ã®èšç®æ¹æ³ã¯ç°ãªããŸãã
@ sebas5384éåžžã«èå³æ·±ããããžã§ã¯ãã§ããæéãèš±ãã°ããã£ãšæ·±ã調ã¹ãŠã¿ãŸãã
@notahatã©ããããããšãããããŸããïŒ ã©ããã«äœæãããã®å³ã®å¥ã®ã³ããŒããããŸããïŒ ãã®ãªã³ã¯ã¯æ»ãã§ããããã§ãã
æãåèã«ãªãã³ã¡ã³ã
ãããã£ãŠãã€ãã³ããœãŒã·ã³ã°ã¯ããããŸã§ã«ééããããšããªãå Žåããã¡ã€ã³ã§çºçãããã¹ãŠã®ãã®ããã€ãã³ãããšããŠæ±ãããã¹ãŠã®ã€ãã³ããèšé²ãããã®ã€ãã³ããä¿¡é Œã§ããæ å ±æºãšèŠãªããŸãã ä»ã®ãã¹ãŠã®ããŒã¿ã¯æŽŸçç¶æ ãšããŠè¡šç€ºãããã ãã§ãããã€ãã³ããåçããããšã§åçæã§ããã¯ãã§ãã
ããã«ã¯Reduxãšéåžžã«åŒ·ãé¡äŒŒæ§ããããšæããŸãã ã¢ã¯ã·ã§ã³ã¯ã€ãã³ãã§ãããçŽç²ãªã¬ãã¥ãŒãµãŒé¢æ°ã䜿çšããŠç¶æ ãå€æŽãããšãã¢ã¯ã·ã§ã³ãåçãããšåãç¶æ ã«æ»ãããšãä¿èšŒãããŸãã
ã€ãã³ããœãŒã·ã³ã°ãšCQRSã¯å¯æ¥ã«é¢é£ããŠããŸãããã©ã¡ããäžæ¹ãä»æ¹ãªãã§å®è¡ããããšã¯å¯èœã§ãã ïŒã€ãã³ããœãŒã·ã³ã°ã®äž»èŠãªæ¯æè å šå¡ããã®å£°æã«åæããããã§ã¯ãããŸããããããã¯å¥ã®è°è«ã§ããïŒ
ãã®é·æãšçæã¯æ¬¡ã®ãšããã§ããCQRSãšã€ãã³ããœãŒã·ã³ã°ã®äž¡æ¹ããåŠã¶ã¹ãèå³æ·±ãããšãããããããã¯Reduxã®ããã€ãã®ã¢ã€ãã¢ãæ確ã«ããã®ã«åœ¹ç«ã€å¯èœæ§ããããŸãã
CQRSã®èšèªã¯ãFluxãReduxã®èšèªãããæ確ã ãšæããŸãããããã¯ãããã奜ã¿ã®åé¡ã§ãã 確ãã«ããã¹ãã¢ããšããèšèã¯ããã©ãã¯ã¹ã®äžçã§ã¯éåžžã«éè² è·ã«ãªã£ãŠãããšæããŸãã