You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
// Jupyter notebook é massa{varobj={a: 1,b: 3,}console.log(obj)}
{ a: 1, b: 3 }
// Aqui fora fica pro resto da apresentaçãovarpretty=object=>JSON.stringify(object,null,2)// Aqui dentro não{varobj={a: 1,b: 2,}console.log(pretty(obj))}
{
"a": 1,
"b": 2
}
// Números são ímutáveis{consta=3a=2}
evalmachine.<anonymous>:4
a = 2
^
TypeError: Assignment to constant variable.
at evalmachine.<anonymous>:4:5
at ContextifyScript.Script.runInThisContext (vm.js:44:33)
at Object.runInThisContext (vm.js:116:38)
at run ([eval]:617:19)
at onRunRequest ([eval]:388:22)
at onMessage ([eval]:356:17)
at emitTwo (events.js:125:13)
at process.emit (events.js:213:7)
at emit (internal/child_process.js:774:12)
at _combinedTickCallback (internal/process/next_tick.js:141:11)
// Strings também{consta="something"a+=' boop'}
evalmachine.<anonymous>:4
a += ' boop'
^
TypeError: Assignment to constant variable.
at evalmachine.<anonymous>:4:5
at ContextifyScript.Script.runInThisContext (vm.js:44:33)
at Object.runInThisContext (vm.js:116:38)
at run ([eval]:617:19)
at onRunRequest ([eval]:388:22)
at onMessage ([eval]:356:17)
at emitTwo (events.js:125:13)
at process.emit (events.js:213:7)
at emit (internal/child_process.js:774:12)
at _combinedTickCallback (internal/process/next_tick.js:141:11)
O valor de String, Number, e Booleans são imutáveis.
É impossível mudar o valor de uma const desses tipos.
// Com objetos temos uma situação triste :({consttransaction={amount: 1000,// $ 10.00customer: {name: 'Michael',},}transaction.amount=3000console.log(pretty(transaction))}
// Com arrays também :({consttransactions=[{amount: 1000},{amount: 2000},]transactions.push({amount: 3000})console.log(pretty(transactions))}// Mas pq isso é ruim?
constReact=require('react')classSomethingextendsReact.Component{constructor(props){super(props)this.state={// também conhecido como initialStatemessage: 'Hello',}this.changeMessage=this.changeMessage.bind(this)}changeMessage(){this.setState({message: 'World'})//}render(){return(<div><buttononClick={changeMessage}/><p>{this.state.message}</p></div>)}}
// Merge dentro de merge começa a complicar a leitura{conststate={session: 12345,user: {name: 'José'}}constnewState=merge(state,{user: merge(state.user,{country: 'Brasil'})})console.log(pretty(newState))}// Deep merge pode resolver mas é um overkill de performace
// Tem que estruturar tudo com a os tipos dele :({const{ Map }=require('immutable')conststate=Map({session: 12345,user: Map({name: 'José'})})constnewState=state.setIn(['user','country'],'Brasil')// this.setState(newState)console.log(pretty(newState))}
// o setState pode receber uma função ao invés de um novo estado!constnewState=over(dddLens,double,state)this.setState(newState)// same asthis.setState(state=>over(dddLens,double,state))
this.setState(state=>over(dddLens,double,state))// same as (Ramda bonus)this.setState(over(dddLens,double))
// uma nota sobre aplicação parcial de funções{const{ add }=require('ramda')console.log(add(2,3))constadd2=add(2)console.log(add2(3))}
5
5
// map, filter, e reduce: adeus 'for', 'push', e seus amigos mutáveis{consttransactions=[{amount: 1000,status: 'paid'},{amount: 2000,status: 'refused'},{amount: 3000,status: 'paid'},{amount: 4000,status: 'pending'},{amount: 5000,status: 'refused'},]constpaid=transactions.filter(transaction=>transaction.status==='paid')console.log(pretty(paid))}
// Imagine um banco de dados onde só podemos inserir// operações novas e nunca mexer nas que existem{constbalanceOperations=[{id: 0,amount: 10000},{id: 1,amount: -5000},{id: 2,amount: 2000},{id: 3,amount: -4500},]constbalance=balanceOperations.reduce((balance,bo)=>balance+bo.amount,0)console.log(balance)}
2500
// E aquela pitada de ramda{const{ prop, add }=require('ramda')constbalanceOperations=[{id: 0,amount: 10000},{id: 1,amount: -5000},{id: 2,amount: 2000},{id: 3,amount: -4500},]constbalance=balanceOperations.map(prop('amount'))// [ 10000, -5000, 2000, -4500 ].reduce(add,0)console.log(balance)}
Sempre acessar APENAS variáveis que foram enviadas para ela.
Sempre retornar alguma coisa.
Nunca alterar o valor das variáveis enviadas (imutabilidade).
Sempre para os mesmos valores de entrada você terá os mesmos valores de saída
// Reducers são funções puras que recebem// o estado e uma ação e retornam um novo estadovarreducers=(state={counter: 0},action)=>{if(!action){returnstate}switch(action.type){case'INCREMENT':
return{counter: state.counter+1}case'DECREMENT':
return{counter: state.counter-1}default:
returnstate}}console.log(reducers())console.log(reducers({counter: 1}))console.log(reducers({counter: 4},{type: 'INCREMENT'}))
{ counter: 0 }
{ counter: 1 }
{ counter: 5 }
// A store é criada usando os reducersvarcreateStore=reducers=>{varstate=reducers()conststore={dispatch: (action)=>{state=reducers(state,action)},getState: ()=>{returnstate}}returnstore}varstore=createStore(reducers)store.getState()// => { counter: 0 }// Despachamos ações para a store e deixamos// que ela faça o trabalho de alterar o estadostore.dispatch({type: 'INCREMENT'})store.getState()// => { counter: 1 }