en
Feedback
ToCode

ToCode

Open in Telegram

讟讬驻讬诐 拽爪专讬诐 诇诪转讻谞转讬诐 诪讗转 讬谞讜谉 驻专拽

Show more
1 419
Subscribers
No data24 hours
No data7 days
No data30 days
Posts Archive
ToCode
1 419
# 讛谞转讬讘 讛砖诪讞 讝讛 诇讗 住讜讚 砖讻讘专 诪注诇 注砖专 砖谞讬诐 讞讘专讜转 诪爪诪爪诪讜转 讘讗谞砖讬 讛 QA 砖诇讛谉. 砖讬谞讜讬 讝讛 讛讜讗 转讜爪讗讛 砖诇 讛诪讜谉 转讛诇讬讻讬诐 讜砖讬谞讜讬讬 转专讘讜转 讘注讜诇诐 讛驻讬转讜讞 - 讘注讬拽专 讛诪注讘专 诇讛住转诪讱 注诇 讘讚讬拽讜转 讗讜讟讜诪讟讬讜转, 讙讬砖讜转 驻讬转讜讞 TDD 讘讛谉 诪转讻谞转讬诐 讻讜转讘讬诐 讘讚讬拽讜转 诇拽讜讚 砖诇 注爪诪诐 讜 CI/CD 砖诪讜讘讬诇 诇专爪讜谉 讻诇 讛讝诪谉 诇讚讞讜祝 拽讜讚 讞讚砖 诇驻专讜讚拽砖谉 讻诪讛 砖讬讜转专 诪讛专. 讜讗讞转 讛讘注讬讜转 注诐 诪转讻谞转讬诐 砖讻讜转讘讬诐 讗转 讛讘讚讬拽讜转 诇拽讜讚 砖诇 注爪诪诐 讛讬讗 讛谞转讬讘 讛砖诪讞: 诪转讻谞转讬诐 转诪讬讚 讬讞驻砖讜 诇讘讚讜拽 砖讛讚讘专讬诐 讛谞讻讜谞讬诐 注讜讘讚讬诐 讜砖讛讚讘专讬诐 讛诇讗 谞讻讜谞讬诐 诇讗 注讜讘讚讬诐. 讗谞讞谞讜 讬讜讚注讬诐 诇讻转讜讘 讘讚讬拽讜转 诇拽讜讚 砖讻转讘谞讜 讻讬 讗谞讞谞讜 讻转讘谞讜 讗讜转讜, 讜讘讜讚拽讬诐 讗转 讻诇 讛讚讘专讬诐 砖讞砖讘谞讜 注诇讬讛诐 讘注转 讻转讬讘转 讛拽讜讚. 讗讘诇 - 讗谞讞谞讜 诇讗 讻诇 讻讱 讟讜讘讬诐 讘诇讘讚讜拽 讗转 讛讚讘专讬诐 砖诇讗 讞砖讘谞讜 注诇讬讛诐 讘拽讜讚 (讻讬, 谞讜, 讗谞讞谞讜 注讚讬讬谉 诇讗 讞讜砖讘讬诐 注诇讬讛诐 讻砖讻讜转讘讬诐 讗转 讛讘讚讬拽讜转). 谞讝讻专转讬 讘谞转讬讘 讛砖诪讞 讻砖拽专讗转讬 注诇 讛驻讬专爪讛 讛讗讞专讜谞讛 讘讗转专 讛讘讬讟讜讞 讛诇讗讜诪讬: 砖诐 讛讬讛 砖讚讛 讘讟讜驻住 砖诇 转讗专讬讱 讛谞驻拽转 转注讜讚转 讝讛讜转, 讗讘诇 讗祝 讗讞讚 诇讗 讘讚拽 砖转讗专讬讱 讛讛谞驻拽讛 砖诪砖转诪砖 讛拽诇讬讚 讘讗诪转 诪转讗讬诐 诇转注讜讚转 讛讝讛讜转 砖讛讜讗 讛讻谞讬住, 讜讘注爪诐 讛讬讛 讗驻砖专 诇讛讬讻谞住 注诐 讻诇 转注讜讚转 讝讛讜转 讙诐 讘诇讬 诇讚注转 诪讛 讛讬讛 转讗专讬讱 讛讛谞驻拽讛. 讗谞讬 诇讗 诪讻讬专 讗讬砖 QA 砖讛讬讛 诪驻住驻住 讗转 讝讛. 讗谞讬 讻谉 诪讻讬专 讛诪讜谉 诪转讻谞转讬诐 砖讻讜转讘讬诐 诇注爪诪诐 讗转 讛讘讚讬拽讜转 砖讬讻转讘讜 讘拽诇讜转 讘讚讬拽讜转 讗讜讟讜诪讟讬讜转 诇谞转讬讘 讛砖诪讞 讜讬砖讻讞讜 诇讘讚讜拽 诪爪讘 砖诇 转注讜讚转 讝讛讜转 讜转讗专讬讱 讛谞驻拽讛 诇讗 转讜讗诪讬诐. 讬砖 讛诪讜谉 爪讚讚讬诐 讟讜讘讬诐 诇转专讘讜转 讛住讟讗专讟-讗驻讬诐 讜讟讜讘 砖讘讬讟讜讞 诇讗讜诪讬 讜讙讜驻讬诐 诪诪砖诇转讬讬诐 讗讞专讬诐 诇讜诪讚讬诐 讗讬讱 诇专讜抓 诪讛专 讜诇讘谞讜转 驻讬转专讜谞讜转 拽讜讚 诪讛讬讜诐 诇诪讞专 讻诪讜 砖爪讜讜转讬 驻讬转讜讞 诪讜讚专谞讬讬诐 注讜砖讬诐. 讗讘诇 讘讗讜转讛 谞砖讬诪讛 讞砖讜讘 诇讝讻讜专 讗转 讛讛讘讚诇 讘讬谉 住讟讗专讟-讗驻 诇讙讜祝 诪诪砖诇转讬 讙讚讜诇: 讛讙讬砖讛 诇诪讬讚注 讛讗讬砖讬 讜讛讻讞 砖讬砖 诇讙讜驻讬诐 讛诪砖砖诇转讬讬诐 诪讻转讬讘讬诐 住讟谞讚专讟讬诐 讙讘讜讛讬诐 讬讜转专 诇讛讘讟讞转 讗讬讻讜转 讛转讜讻谞讛 砖讗转诐 诪驻专住诪讬诐.

ToCode
1 419
# 诇专诪讜转 讗转 讛诪注专讻转 讙诇讬抓' 讛讬讗 驻诇讟驻讜专诪转 讬爪讬专转 拽讜讚 讞讬谞诪讬转 诪讘讬转 驻讜讙 拽专讬拽. 讛讬讗 谞诪爪讗转 讘砖讻讜谞讛 讻讘专 讚讬 讛专讘讛 讝诪谉 讜讬砖 诇讛诐 诪住诇讜诇 讞讬谞诪讬 讜诪住诇讜诇 讘转砖诇讜诐. 讻诪讜 讛专讘讛 诪讜爪专讬诐 讙诐 讙诇讬抓' 讘讞专讜 诇讬爪讜专 讘注讬讛 驻讬拽讟讬讘讬转 讘诪住诇讜诇 讛讞讬谞诪讬 (讜诇驻转讜专 讗讜转讛 讘讻住祝), 讜讻诪讜 讘诪拽专讬诐 专讘讬诐 讛转讞讬诇 注讻砖讬讜 诪砖讞拽 讞转讜诇 讜注讻讘专 讘讬谞诐 诇讘讬谉 讛诪砖转诪砖讬诐 砖诇讛诐. 讘讙诇讬抓' 讛讗驻诇讬拽爪讬讜转 砖讗转诐 讻讜转讘讬诐 谞住讙专讜转 讗讜讟讜诪讟讬转 讗讞专讬 5 讚拽讜转 砖诇 讞讜住专 驻注讬诇讜转 讜讗讝 讘驻注诐 讛讘讗讛 砖讬讙讬注 诪砖转诪砖 讗诪讬转讬 诇讗驻诇讬拽爪讬讛 讬讬拽讞 讝诪谉 诇讛转注讜专专 讜讝诪谉 讛讟注讬谞讛 讬讛讬讛 讙讚讜诇. 讚专讱 讗讞转 诇讘讟诇 讗转 讛诪讙讘诇讛 (诪讛 砖讙诇讬抓' 专讜爪讬诐) 讛讬讗 诇砖诇诐 诇讙诇讬抓' 10$ 讘讞讜讚砖. 讚专讱 讬讜转专 讝讜诇讛 讛讬讗 诇讛砖转诪砖 讘砖讬专讜转 讞讬谞诪讬 砖讬砖诇讞 讛讜讚注讛 讻诇 讻诪讛 讚拽讜转, 讜讻讱 讻诇 讛讝诪谉 讬砖 驻注讬诇讜转 讜讛讗驻诇讬拽爪讬讛 诇讗 谞住讙专转. 诇驻谞讬 讞讜讚砖 讙诇讬抓' 讛讜讚讬注讜 砖讛诐 讗讜住专讬诐 注诇 诪驻转讞讬诐 诇讛砖转诪砖 讘 Pinging Services 讘驻诇讟驻讜专诪讛 砖诇讛诐, 讜讻诪讜讘谉 砖讛讚讘专 注讜专专 讙诇 砖诇 驻讜住讟讬诐 讗爪诇诐 讘驻讜专讜诐 讛转诪讬讻讛 讻讜诇诇 讛诪诇爪讜转 诇注讘讜专 诇诪转讞专讬诐. 注讻砖讬讜 讗谞讬 诇讗 驻讛 讘砖讘讬诇 诇转转 注爪讜转 诇讙诇讬抓' 讗讘诇 谞拽讜讚讛 驻砖讜讟讛 砖讗谞讬 诇驻讞讜转 诇讜拽讞 诪讛住讬驻讜专 讛讝讛 讛讬讗 讛讛讘讚诇 讘讬谉 诇住驻拽 注专讱 讗诪讬转讬 诇诪砖转诪砖讬诐 诇讘讬谉 诇讬爪讜专 诪讙讘诇讜转 诇讗 讛讙讬讜谞讬讜转 专拽 讘砖讘讬诇 砖讗谞砖讬诐 讬爪讟专讻讜 诇砖诇诐 讘砖讘讬诇 诇讘讟诇 讗讜转谉. 诇爪讜专讱 讛砖讜讜讗讛, 砖讬专讜转 讚讜诪讛 砖诇 讛专讜拽讜 诪爪讬注 550 砖注讜转 注讘讜讚讛 诇讗驻诇讬拽爪讬讛 讘讞讬谞诐 讻诇 讞讜讚砖. 讗转诐 讬讻讜诇讬诐 诇砖诇诐 讻讚讬 诇讛注诇讜转 讗转 讛诪住驻专, 讗讜 诇讘讞讜专 讘注爪诪讻诐 诪转讬 讛讗驻诇讬拽爪讬讛 砖诇讻诐 转讛讬讛 讝诪讬谞讛 讜诪转讬 诇讗. 讛讘讞讬专讛 砖诇 讙诇讬抓' 诇转转 讬讜转专 诪砖讗讘讬 诪讬讞砖讜讘 诇讗驻诇讬拽爪讬讜转 砖讬砖 诇讛谉 讬讜转专 Traffic 谞专讗讬转 诪讜讝专讛 讜诇讗 讛讜讙谞转, 讜讛讬讗 砖讚讞驻讛 讗谞砖讬诐 诇讞驻砖 讗讬讱 诇讬讬爪专 Traffic 驻讬拽讟讬讘讬 专拽 讘砖讘讬诇 诇拽讘诇 讬讜转专 诪砖讗讘讬诐.

ToCode
1 419
# 讛讘讚讬拽讜转 诪诪砖 讛爪讬诇讜 讗讜转讬 讛驻注诐 讞诪砖 讛诪讬诇讬诐 诪讛讻讜转专转 讛谉 讛诪讟专讛 砖诇 讻诇 讞讘讬诇转 讘讚讬拽讜转 讘讻诇 诪注专讻转. 诇讗 诪注讟 注讜诇讛 讛讟注谞讛 讻讗讬诇讜 讘讚讬拽讜转 爪专讬讻讜转 讗讜 讬讻讜诇讜转 诇注讝讜专 诇谞讜 诇讛讙讬注 诇 Design 讟讜讘 讬讜转专, 讗讜 砖拽讜讚 砖拽诇 诇讘讚讜拽 讗讜转讜 讛讜讗 拽讜讚 讟讜讘 讬讜转专. 讝讛 诇驻注诪讬诐 谞讻讜谉 讗讘诇 讙诐 讛专讘讛 驻注诪讬诐 诇讗 谞讻讜谉, 讜讘讟讞 砖讗讬谉 驻讛 住讬讘转讬讜转. 状讛讘讚讬拽讜转 诪诪砖 讛爪讬诇讜 讗讜转讬 讛驻注诐状 讝讛 讛诪砖驻讟 砖讗转诐 专讜爪讬诐 诇砖诪讜注 讗转 注爪诪讻诐 讗讜 讗转 讛讗谞砖讬诐 砖注讜讘讚讬诐 讗转讻诐 讗讜诪专讬诐. 讝讛 讗讜诪专 砖讛讘讚讬拽讜转 砖讜讜转 讗转 讛诪讞讬专 砖诇 讻转讬讘转谉 讜砖讛诪注专讻转 砖诇讻诐 讬讻讜诇讛 诇爪诪讜讞 讻讬 讗驻砖专 诇注讚讻谉 拽讜讚 讬砖谉 讘诇讬 诇砖讘讜专 讗转 讛讛转谞讛讙讜转. 讜讗诐 讗转诐 诇讗 砖讜诪注讬诐 讗讜转讜 诪住驻讬拽 驻注诪讬诐 讝讛 讗讜诪专 讗讞讚 诪砖谞讬 讚讘专讬诐: 讗讜 砖讗转诐 诇讗 注讜砖讬诐 诪住驻讬拽 Refactoring, 讗讜 砖讛讘讚讬拽讜转 砖诇讻诐 诇讗 诪住驻讬拽 讟讜讘讜转.

ToCode
1 419
# 讻诪讛 讝讛 注讜诇讛 诇谞讜? 讗谞讞谞讜 讚讬 讟讜讘讬诐 讘讛注专讻转 注诇讜转 讜转诪讜专讛 讻砖拽讜谞讬诐 注讙讘谞讬讜转 讘住讜驻专, 讗讘诇 讻砖注讜讘专讬诐 诇转讜讻谞讜转 讛住讬驻讜专 诪住转讘讱. 讛讗诐 讜讜讘住讟讜专诐 砖讜讜讛 讬讜转专 诪 Sublime Text 讻讬 讛讜讗 注讜诇讛 59$ 讘砖谞讛 讜住讗讘诇讬讬诐 80$ 诇砖诇讜砖 砖谞讬诐? 讛讗诐 讘讬讬住拽诪驻 砖讜讜讛 讬讜转专 讗讜 驻讞讜转 诪讙'讬专讛? 讜讝讛 注讜讚 讛讞诇拽 讛拽诇 讻讬 讛诪讞讬专 讛讜讗 讘讚讜诇专讬诐. 讛讞诇拽 讛拽砖讛 讘讗诪转 讛讜讗 诇讛注专讬讱 讻诪讛 注讜诇讛 诇讬 诇讛讜住讬祝 住驻专讬讬转 拽讜讚 讗讜 诇讛砖转诪砖 讘转讜讻谞讛 讞讬谞诪讬转. 讗祝 讗讞讚 诇讗 讬住驻专 诇讻诐 讻诪讛 "注讜诇讛" 诇讛砖转诪砖 讘 Redux 诇注讜诪转 MobX, 讗讜 讘 vim 诇注讜诪转 emacs. 讗讬谉 诇谞讜 诪讜砖讙 讻诪讛 讝诪谉 讬讬拽讞 诇讱 讗讜 诇爪讜讜转 砖诇讱 诇讛讘讬谉 讗转 讛讻诇讬, 讛讗诐 转砖转诪砖讜 讘讜 谞讻讜谉 讗讜 讛讗诐 讛讜讗 专拽 讬住讘讱 讗转讻诐 讬讜转专. 讘砖讘讬诇 诇讛讘讬谉 讗诐 讻诇讬 诪住讜讬诐 砖讜讜讛 诇讬 讗谞讬 爪专讬讱 诇讛讬讜转 诪住讜讙诇 诇注谞讜转 讻诪讛 讛讜讗 讘讻诇诇 注讜诇讛, 讜讘住驻专讬讜转 拽讜讚 驻转讜讞 讛转砖讜讘讛 诪讗讜讚 诪讜专讻讘转. 砖转讬 讚讜讙诪讗讜转 诪讛讞讬讬诐- 爪讜讜转 砖讛转讞讬诇 诇讛砖转诪砖 讘 Redux 讻讚讬 诇讘谞讜转 讗驻诇讬拽爪讬讛 讗讘诇 诇讗 讛讘讬谉 诇讙诪专讬 讗讬讱 讛讚讘专讬诐 诪转讞讘专讬诐 讜讘谞讛 诪讜爪专 砖诪讚诇讙 注诇 讻诇 讗讜驻讟讬诪讬讝爪讬讜转 讛 Immutable 砖诇 讛住驻专讬讜转. 讛诪讜爪专 注讜讘讚 诇讗讟 讜注讻砖讬讜 爪专讬讱 诇讝专讜拽 讗转 讻诇 讛拽讜讚 讜诇讛转讞讬诇 诇砖讻转讘. 讗讜 爪讜讜转 讗讞专 砖讛讜住讬祝 住驻专讬讬转 JavaScript 拽讟谞讛 讘砖讘讬诇 诇讛爪讬讙 讟讘诇讗讜转 讬驻讜转 注诐 讗驻砖专讜转 诇诪讬讜谉, 讜讘诇讬 诇砖讬诐 诇讘 讙专诐 诇讻诇 讛讚驻讬诐 砖诇讛诐 诇讛讬讟注谉 诇讗讟 讬讜转专 讜讻讱 驻讙注 讘讬讞住 讛讛诪专讛 砖诇 讛讗转专. 讘砖谞讬 讛诪拽专讬诐 讗诐 讛讬讬谞讜 讬讜讚注讬诐 诪专讗砖 讗转 讛诪讞讬专 讗讬谉 住讬讻讜讬 砖讛讬讬谞讜 诪讜讻谞讬诐 诇砖诇诐 讗讜转讜 讘砖讘讬诇 讛转诪讜专讛 讛拽讟谞讛 砖拽讬讘诇谞讜. 讗讘诇 拽爪转 讻诪讜 讘拽谞讬讬转 诪讚驻住转, 诪讞讬专 讛拽讟诇讜讙 讛谞诪讜讱 砖讻谞注 讗讜转谞讜 诇拽谞讜转 诪讜爪专 砖讛诪讞讬专 讛讗诪讬转讬 砖诇讜 讛专讘讛 讬讜转专 讙讘讜讛. 讙诐 讛注专讻转 诪讞讬专 讝讜 诪讬讜诪谞讜转 讜讙诐 注诇 讝讛 讗驻砖专 诇讛转讗诪谉. 诇诪注讜谞讬讬谞讬诐 拽讞讜 诇注爪诪讻诐 转专讙讬诇 讜讻诇 驻注诐 砖讗转诐 诪讜住讬驻讬诐 住驻专讬讛 讞讚砖讛 谞住讜 诇专砖讜诐 讗转 讻诇 讛讛砖驻注讜转 砖讬讻讜诇讜转 诇讛讬讜转 诇住驻专讬讛 讝讜 注诇 讛诪讜爪专 砖诇讻诐, 讜讛注专讻讛 砖诇讻诐 诇讻诪讛 讝诪谉 讬讬拽讞 诇讻诐 诇讛讬讜转 驻专讜讚讜拽讟讬讘讬讬诐 注诐 讛住驻专讬讛. 讻砖讚讘专讬诐 注讜讘讚讬诐 讻诪讜 砖爪专讬讱 讞讬讝专讜 诇讚祝 讜住诪谞讜 讻诪讛 拽专讜讘讬诐 讛讬讬转诐 诇诪住驻专讬诐 讛讗诪讬转讬讬诐.

ToCode
1 419
# 讗讬讝讛 讻讬祝 砖讬砖 讻讘专 Generators 讘 JavaScript 讛专讘讛 讗讜诪专讬诐 砖讗讜驻讟讬诪讬讜转 诪讜讘讬诇讛 诇讛爪诇讞讛 讘讞讬讬诐. 讘转讻谞讜转 讘讻诇 诪拽专讛 讛讗讜驻讟讬诪讬讜转 诪讘讬讗讛 讘讚专讱 讻诇诇 诇诪讘谞讛 拽讜讚 砖谞拽专讗 专拽讜专住讬讛. 讬砖 诇讝讛 讗驻讬诇讜 讘讬讟讜讬 讘讗谞讙诇讬转: Wishful Thinking. 讘讜讗讜 谞专讗讛 讗讬讱 讝讛 拽讜专讛 讜讗讬讱 讝讛 拽砖讜专 诇 Generators. ## 讛讗转讙专 谞讬拽讞 诇讚讜讙诪讗 讗转 讗转讙专 诪讙讚诇讬 讛讗谞讜讬. 讘讗转讙专 讬砖 诇谞讜 砖诇讜砖讛 注诪讜讚讬诐 讜注诇 讛注诪讜讚 讛专讗砖讜谉 诪讜砖讞诇讜转 讟讘注讜转 讘拽讜讟专 讛讜诇讱 讜拽讟谉, 讻诇讜诪专 讘转讞转讬转 讻诇 注诪讜讚 谞诪爪讗转 讛讟讘注转 讛讙讚讜诇讛 讘讬讜转专, 讗讞专讬讛 讟讘注转 拽爪转 讬讜转专 拽讟谞讛 讜讻讱 讛诇讗讛 注讚 讛讟讘注转 讛注诇讬讜谞讛 讘讬讜转专 砖讛讬讗 讛拽讟谞讛 讘讬讜转专. 讛诪砖讬诪讛 砖诇谞讜 讛讬讗 诇讛注讘讬专 讗转 讻诇 讛讟讘注讜转 诪讛注诪讜讚 讛专讗砖讜谉 诇注诪讜讚 讛砖诇讬砖讬 讻讱 砖讙诐 讘注诪讜讚 讛砖诇讬砖讬 讛讟讘注讜转 讬讛讬讜 诪住讜讚专讜转 诪讛讙讚讜诇讛 诇拽讟谞讛 - 讗讘诇 讜讝讛 讛讟专讬拽 - 诪讜转专 诇讛讝讬讝 专拽 讟讘注转 讗讞转 讻诇 驻注诐, 讜讗住讜专 诇讛谞讬讞 讗讜转讛 注诇 讟讘注转 砖拽讟谞讛 诪诪谞讛. ## 讛讙讬砖讛 讛讗讜驻讟讬诪讬转 诇转专讙讬诇 讛讝讛 讬砖 驻讬转专讜谉 专拽讜专住讬讘讬 诪诪砖 驻砖讜讟:
function hanoi(size, start, end, extra) {
  if (size > 0) {
    hanoi(size - 1, start, extra, end);
    console.log(`Move from ${start} to ${end}`);
    hanoi(size - 1, extra, end, start);
  }
}

hanoi(3, 'a', 'b', 'c');
讗讘诇 讛讘注讬讛 注诐 驻讬转专讜谞讜转 专拽讜专住讬讘讬讬诐 讛讬讗 砖拽砖讛 诇注讘讜讚 讗讬转诐. 谞住讜 诇讚诪讬讬谉 讗讬讱 讬专讗讛 拽讜讚 砖讘诇讞讬爪讛 注诇 讻驻转讜专 诪讝讬讝 专拽 讟讘注转 讗讞转 讘讬谉 砖谞讬 注诪讜讚讬诐. 讛驻讬转专讜谉 讛专拽讜专住讬讘讬 诇讜拽讞 讙讬砖讛 砖诇 "讛讻诇 讗讜 讻诇讜诐" 讜讘注爪诐 专拽 讘住讬讜诐 讛驻注诇转 讛驻讜谞拽爪讬讛 讗谞讞谞讜 诪拽讘诇讬诐 讗转 讻诇 讛转讜爪讗讜转, 讜讗讬谉 诇谞讜 砖讜诐 谞拽讜讚转 讛转注专讘讜转 讘讗诪爪注. ## 讙谞专讟讜专讬诐 讘 JavaScript 驻讬爪'专 讞诪讜讚 讜讬讞住讬转 诇讗 谞驻讜抓 砖诇 JavaScript 砖谞拽专讗 Generators 诪讗驻砖专 诇注拽讜祝 讘拽诇讜转 讗转 讛讘注讬讛. 讘注讝专转 Generators 谞讜讻诇 诇讛讜住讬祝 诇驻讜谞拽爪讬讛 讗讬谞住讜祝 谞拽讜讚讜转 讬爪讬讗讛 讘讗诪爪注 讛专讬爪讛 砖诇讛, 讻讱 砖拽讜讚 讞讬爪讜谞讬 讬讜讻诇 讻诇 驻注诐 诇讛转拽讚诐 专拽 拽爪转 注讚 谞拽讜讚转 讛讬爪讬讗讛 讛讘讗讛. 讝讛 谞拽专讗 Generator 讻讬 讘诪拽讜诐 驻讜谞拽爪讬讛 砖诪讞讝讬专讛 注专讱 讘讜讚讚 转讛讬讛 诇谞讜 驻讜谞拽爪讬讛 砖诪讞讝讬专讛 住讬讚专讛 砖诇 注专讻讬诐, 讜讻诇 驻注诐 讘注爪诐 讬讜讚注转 讗讬讱 诇讘谞讜转 讗转 讛注专讱 讛讘讗. 讻讱 讝讛 谞专讗讛 讗讞专讬 砖讻转讜讘 诇 Generators:
function* hanoi(size, start, end, extra) {
  if (size > 0) {
    yield* hanoi(size - 1, start, extra, end);
    yield [start, end];
    yield *hanoi(size - 1, extra, end, start);
  }
}

const solution = hanoi(3, 'a', 'b', 'c');
for (let step of solution) {
  const [start, end] = step;
  console.log(`Move from ${start} to ${end}`);
}
讗专讙讜谉 讛拽讜讚 诪讞讚砖 讗讬驻砖专 诇讬 诇讛讜爪讬讗 讛讞讜爪讛 讗转 讛诇讜诇讗讛 - 讻讱 砖注讻砖讬讜 讬砖 诇讬 砖诇讬讟讛 讛专讘讛 讬讜转专 诪讚讜讬拽转 注诇 诪讛 诪讜驻注诇 讜诪转讬. 讛拽讜讚 讬讻讜诇 诇讛讚驻讬住 专拽 诪住驻专 诪讛诇讻讬诐 专讗砖讜谞讬诐 讗讜 讗驻讬诇讜 讬讜转专 谞讞诪讚, 诇讛转拽讚诐 诪讛诇讱-诪讛诇讱 讻诇 驻注诐 砖诪砖转诪砖 诇讜讞抓 注诇 讻驻转讜专. 讜诇住拽专谞讬诐 讛讻谞转讬 讚讜讙诪讗 诪诇讗讛 注诇 拽讜讚驻谉 砖注讜砖讛 讘讚讬讜拽 讗转 讝讛: 诪转讞讬诇讬诐 注诐 5 讟讘注讜转 讘注诪讜讚 讛砖诪讗诇讬 讘讬讜转专, 讻诇 诇讞讬爪讛 注诇 讛讻驻转讜专 诪讝讬讝讛 讟讘注转 讗讞转 讜讘住讜祝 讻诇 讛讟讘注讜转 注讜讘专讜转 诇驻讬 讛讞讜拽讬诐 诇注诪讜讚 讛讬诪谞讬 讘讬讜转专. 讛拽讜讚 谞诪爪讗 讘拽讬砖讜专 讻讗谉: https://codepen.io/ynonp/pen/PoZgodw 讜讗驻砖专 诇砖讞拽 讗讬转讜 讙诐 诇讬讬讘 讘讛讟诪注讛 讛讘讗讛: <iframe height="334" style="width: 100%;" scrolling="no" title="Hanoi Towers" src="https://codepen.io/ynonp/embed/PoZgodw?height=334&theme-id=20374&default-tab=js,result" frameborder="no" allowtransparency="true" allowfullscreen="true"> See the Pen <a href='https://codepen.io/ynonp/pen/PoZgodw'>Hanoi Towers</a> by Ynon Perek (<a href='https://codepen.io/ynonp'>@ynonp</a>) on <a href='https://codepen.io'>CodePen</a>. </iframe> ## 讜讜讗讜 讗讬讝讛 诪讚诇讬拽! 讗讬驻讛 讗驻砖专 诇诇诪讜讚 讬讜转专 注诇 Generators 讘 JavaScript? 砖讗诇讛 诪爪讜讬谞转! 拽讜专住 JavaScript ES6/7/8 砖诇谞讜 讻讗谉 讘讟讜拽讜讚 讬诇诪讚 讗转讻诐 讻诇 诪讛 砖讞诇诪转诐 诇讚注转 (讜拽爪转 讬讜转专) 注诇 讛讬讻讜诇讜转 讛讞讚砖讜转 砖诇 JavaScript 诪讛砖谞讬诐 讛讗讞专讜谞讜转 讜注诇 讚专讻讬诐 讬爪讬专转讬讜转 诇讛砖转诪砖 讘讛谉. 讬砖 砖诐 注诇 Generators, async/await, 驻讜谞拽爪讬讜转 讞抓, 讻转讬讘 讛 import 讜讻诪讜讘谉 Destructuring 讜注讜讚 诪诇讗 谞讜砖讗讬诐 拽讟谞讬诐 砖讞砖讜讘 诇讛讻讬专. 住讬诇讘讜住, 砖讬注讜专讬诐 诇讚讜讙诪讗 讜讻诇 讛驻专讟讬诐 讘讚祝 讛拽讜专住: 拽讜专住 JavaScript ES6/7/8.

ToCode
1 419
# 讗专讙讝 讻诇讬诐 讻砖专讜讗讬诐 讗专讙讝 讻诇讬诐 讬砖 驻讬转讜讬 讙讚讜诇 诇讞驻砖 讗转 讛讻诇讬 讛讻讬 讞讝拽 讘讗专讙讝 讜诇诇诪讜讚 讗讜转讜. 讛谞讞转 讛注讘讜讚讛 讛讬讗 砖诪诪讬诇讗 讻诇 诪讛 砖讗驻砖专 诇注砖讜转 注诐 讛讻诇讬诐 讛驻砖讜讟讬诐 讬讜转专 讗驻砖专 讬讛讬讛 诇注砖讜转 讙诐 注诐 讛讻诇讬 讛诪转讜讞讻诐. 讗讘诇 讛驻讬转讜讬 讛讝讛 诪讜讘讬诇 诇讙讬砖讜转 诇讗 谞讻讜谞讜转 讘转讻谞讜转- 状讗讬谉 讟注诐 诇诇诪讜讚 讜讬诐, 讗谞讬 讻讘专 讬讜讚注 讟讜讘 诇讛砖转诪砖 讘 Webstorm 砖注讜讘讚 讟讜讘 讬讜转专状 状讗讬谉 讟注诐 诇讛砖拽讬注 讘 Redux, 讗谞讬 讻讘专 讬讜讚注 MobX 砖注讜砖讛 讛讻诇 讟讜讘 讬讜转专状 状讗谞讬 诪诪讬诇讗 注讜讘讚 专拽 注诐 诪诪砖拽 讛 git 砖诪砖讜诇讘 讘 IDE 砖诇讬, 讗讝 讗讬谉 讟注诐 诇诇诪讜讚 诇注讘讜讚 讗讬转讜 诪砖讜专转 讛驻拽讜讚讛状 讘砖讘讬诇 诇诇诪讜讚 讘砖诪讞讛 讻诇讬诐 讞讚砖讬诐 讻讚讗讬 诇谞讜 诇讘讞讜专 住讬驻讜专 讗讞专 诇住驻专 诇注爪诪谞讜. 诪砖讛讜 讻诪讜 状讻诇 讻诇讬 讞讚砖 砖讗谞讬 诇讜诪讚 驻讜转讞 诇讬 讗转 讛诪讞砖讘讛 诇讚专讱 讞砖讬讘讛 讞讚砖讛状, 讗讜 讘讚讜讙诪讗讜转: 状讗谞讬 讻讘专 讬讜讚注 Webstorm, 讗讝 讘讟讞 讬讛讬讛 诪注谞讬讬谉 诇专讗讜转 讗讬讱 注讜砖讬诐 驻注讜诇讛 讚讜诪讛 讘 vim状 状讻转讘转讬 讻讘专 砖谞讬 驻专讜讬拽讟讬诐 讘 MobX, 讗讝 谞专讗讛 诇讬 砖注讻砖讬讜 讗谞讬 诪讜讻谉 诇讛转诪讜讚讚 注诐 Redux 诇驻专讜讬拽讟 讛讘讗状 状讛讞讜讚砖 讗谞讬 讛讜诇讱 诇讛砖转诪砖 讘 git 诪砖讜专转 讛驻拽讜讚讛 讘诇讘讚 - 诪注谞讬讬谉 诪讛 讝讛 讬诇诪讚 讗讜转讬 注诇 讛讻诇讬 砖注讚讬讬谉 诇讗 讬讚注转讬状 讻砖讗谞讞谞讜 诪讝讬讝讬诐 讛爪讬讚讛 讗转 讛专爪讜谉 诇住讬讬诐 诪砖讬诪讜转 讜诪砖讗讬专讬诐 诪拽讜诐 诇住拽专谞讜转 讗谞讞谞讜 驻讜转讞讬诐 讗转 讛讚诇转 诇诇诪讬讚讛 讜诇讙讬诇讜讬 砖讬讟讜转 讞讚砖讜转 诇驻转讜专 讘注讬讜转 - 砖讬讟讜转 砖诇驻注诪讬诐 讬讛讬讜 讟讜讘讜转 讬讜转专 讗驻讬诇讜 诪讛讚讘专讬诐 讛诪讜爪诇讞讬诐 砖讗谞讞谞讜 讻讘专 讬讜讚注讬诐.

ToCode
1 419
# 讗讘诇 讝讛 专拽 驻住讬拽 拽讟谉 拽讘诇讜 砖讗诇转 专讗讬讜谞讜转 注讘讜讚讛 讝专讬讝讛 注诇 专讬讗拽讟 砖注诇转讛 讘拽讜专住 讛讬讜诐 - 诪讛 讛讛讘讚诇 讘讬谉 砖转讬 讛拽讜诪驻讜谞谞讟讜转 讛讗诇讛, 讜讘讗讬讝讛 谞注讚讬祝 诇讛砖转诪砖:
// Component 1
function App() {
  const [value, setValue] = React.useState(_.random(1, 100));
    
  return (
    <div>
      <button onClick={() => setValue(c => c + 1)}>{value}</button>
    </div>
  );
}
// Component 2
function App() {
  const [value, setValue] = React.useState(() => _.random(1, 100));
    
  return (
    <div>
      <button onClick={() => setValue(c => c + 1)}>{value}</button>
    </div>
  );
}
谞专讗讛 诪诪砖 讚讜诪讛 诇讗? 讛讛讘讚诇 讛讬讞讬讚 讛讜讗 讘拽专讬讗讛 诇 useState. 讘拽讜诪驻讜谞谞讟讛 讛专讗砖讜谞讛 讗谞讬 诪讙专讬诇 诪住驻专 讗拽专讗讬 讜诪注讘讬专 讗讜转讜 诇 useState, 讜讘拽讜诪驻讜谞谞讟讛 讛砖谞讬讛 讗谞讬 诪注讘讬专 驻讜谞拽爪讬讛 砖诪讙专讬诇讛 诪住驻专 讗拽专讗讬 讜诪讞讝讬专讛 讗讜转讜. 讜诇诪讛 讛讛讘讚诇 讞砖讜讘? 讘讙讬专住转 讛拽讜诪驻讜谞谞讟讛 讛专讗砖讜谞讛 讻诇 驻注诐 砖讗谞讞谞讜 诪注诇讬诐 讗转 讛注专讱 讘讗诪爪注讜转 诇讞讬爪讛 注诇 讛讻驻转讜专 专讬讗拽讟 讬拽专讗 砖讜讘 诇驻讜谞拽爪讬讬转 讛拽讜诪驻讜谞谞讟讛 讻讚讬 诇拽讘诇 讗转 讛 Virtual DOM Tree 讛诪注讜讚讻谉 砖诇讛. 拽专讬讗讛 讻讝讜 转驻注讬诇 讙诐 讗转 _.random, 转讬拽讞 讗转 讛转讜爪讗讛 讜转注讘讬专 讗讜转讛 诇 useState. 注讻砖讬讜 讘讙诇诇 砖讛拽讜诪驻讜谞谞讟讛 讻讘专 谞讜爪专讛 讗讝 useState 驻砖讜讟 讬讝专讜拽 诇驻讞 讗转 讛驻专诪讟专 砖拽讬讘诇 讘讙诇诇 砖讻讘专 讬砖 诇讜 注专讱 讘住讟讬讬讟 讜讬讜爪讗 砖住转诐 讛转讗诪爪谞讜 诇讛讙专讬诇 诪住驻专 讗拽专讗讬. 讘讙讬专住讗 讛砖谞讬讛 讛诪爪讘 讛专讘讛 讬讜转专 讟讜讘: 讘诪拽讜诐 诇讞砖讘 注专讱 讻诇 驻注诐 讜讗讝 诇讛注讘讬专 讗讜转讜 诇 useState 讻讚讬 砖讬讞诇讬讟 讗诐 讛讜讗 爪专讬讱 讗讜转讜 讗讜 诇讗, 讗谞讞谞讜 诪注讘讬专讬诐 诇 useState 驻讜谞拽爪讬讛 砖讬讜讚注转 诇讞砖讘 讗转 讛注专讱. 讗诐 useState 爪专讬讱 注专讱 专讗砖讜谞讬 讛讜讗 讬驻注讬诇 讗转 讛驻讜谞拽爪讬讛, 讜讗诐 诇讗 讗讝 诇讗. 讘爪讜专讛 讻讝讗转 讻诇 讛驻注诇讛 讞讜讝专转 砖诇 驻讜谞拽爪讬讬转 讛驻拽讚 转讚诇讙 注诇 讛讙专诇转 讛诪住驻专 讛讗拽专讗讬 讻讬 讻讘专 讬砖 注专讱 讘住讟讬讬讟. 讛转讘谞讬转 砖诇 讛注讘专转 Callback Function 讜讗讬转讛 讛注讘专转 讛砖诇讬讟讛 诇驻讜谞拽爪讬讛 驻谞讬诪讬转 (讘诪拽讜诐 诇讛注讘讬专 讗转 讛注专讱 诪诪砖 诇驻讜谞拽爪讬讛 讛驻谞讬诪讬转) 讛讬讗 诪讗讜讚 谞驻讜爪讛 讘专讬讗拽讟 讜讗谞讞谞讜 诪讻讬专讬诐 讗讜转讛 讙诐 诪 useMemo 讜 useCallback. 讛讬讗 砖讬诪讜砖讬转 讙诐 讘讗讜驻谉 讻诇诇讬 讘转讻谞讜转 讜诇讻谉 讻讚讗讬 诇讛讬讜转 注专谞讬讬诐 讻砖谞转拽诇讬诐 讘讻转讬讘 讛讝讛 - 讝讛 诇讗 住转诐 砖讗谞砖讬诐 讛转诇讛讘讜 诇讻转讜讘 驻讜谞拽爪讬讜转 讞抓 讘讻诇 诪拽讜诐, 讗诇讗 砖讘讗诪转 讬砖 驻讛 诪砖诪注讜转 诪讘讞讬谞转 讘讬爪讜注讬诐.

ToCode
1 419
# 爪专讬讻讛 诇讛讬讜转 讚专讱 讘专讜专讛 讗讞转 (讜注讚讬祝 砖转讛讬讛 讛讬讞讬讚讛) 诇注砖讜转 讗转 讝讛 讛诪砖驻讟 讘讻讜转专转 讛讜讗 转专讙讜诐 砖诇 讛诪砖驻讟 讛讘讗 诪转讜讱 讛 Zen 砖诇 驻讬讬转讜谉. 讝讛 讛诪拽讜专: > There should be one-- and preferably only one --obvious way to do it. 讜讛讜讗 谞讻讜谉 诇讻诇 讛砖驻讜转. 谞讝讻专转讬 讘讜 讘诪拽专讛 讻砖讚驻讚驻转讬 讘拽讜讚 讛讘讗, 讚讜讜拽讗 讘砖驻转 专讜讘讬:
class ShoppingCart < ActiveRecord::Base
  has_many :products, :class_name => 'CartProduct', :dependent => :delete_all
  
    def <<(product)
        line = CartProduct.find_or_initialize_by(:product => product, :cart => self)
        # comment out to allow quantity
        # line.increment(:qty) unless line.new_record?
        line.save!
        @finalized = false

        self
    rescue ActiveRecord::RecordNotUnique
        retry
    end

    def add_with_options(product, options)
        line = CartProduct.find_or_initialize_by(:product => product, :cart => self)
        line.price = options[:price]
        line.options = options
        line.save!
        @finalized = false

        self
    rescue ActiveRecord::RecordNotUnique
        retry
    end
end
讛讛讙讬讜谉 讘专讜专: 讛驻讜谞拽爪讬讛 讛专讗砖讜谞讛 讛讬转讛 讛讚专讱 讛诪拽讜专讬转 讘讛 讛讜住讬驻讜 驻专讬讟讬诐 诇注讙诇转 讛拽谞讬讜转, 讜讗讝 诪讬砖讛讜 专爪讛 诇讗驻砖专 讛讜住驻转 驻专讬讟讬诐 讬讞讚 注诐 讻诇 诪讬谞讬 诪转讙讬诐 讗讝 讘诪拽讜诐 诇砖谞讜转 讗转 讛诪诪砖拽 (诪讛 砖讬砖讘讜专 拽讜讚 拽讬讬诐 讜讬爪专讬讱 Refactoring) 讛讜讗 驻砖讜讟 讛讜住讬祝 注讜讚 驻讜谞拽爪讬讛. 讛讘注讬讛? 注讻砖讬讜 讬砖 诇谞讜 砖转讬 讚专讻讬诐 诇讛讜住讬祝 诪讜爪专 诇注讙诇转 讛拽谞讬讜转 - 讜拽诇 诪讗讜讚 诇讟注讜转 讜诇砖讻讜讞 讗转 讝讛 诇诪砖诇 讻砖讻讜转讘讬诐 讘讚讬拽讛:
  test 'cart price is the sum of all product prices' do
    @cart = create(:cart)
    @cart.products << create(:item, price: 20)
    @cart.products << create(:item, price: 50)

    assert_equal(70, @cart.price)
  end
讛讘讚讬拽讛 谞专讗讬转 讬驻讛 讗讘诇 诇讗 砖讜讜讛 讻诇讜诐 讗诐 专讜讘 讛拽讜讚 讘诪注专讻转 诪砖转诪砖 讘砖讬讟讛 讛砖谞讬讛 讻讚讬 诇讛讜住讬祝 诪讜爪专讬诐. 爪专讬讻讛 诇讛讬讜转 讚专讱 讘专讜专讛 讗讞转 (讜注讚讬祝 砖转讛讬讛 讛讬讞讬讚讛) 诇讛讜住讬祝 诪讜爪专讬诐 诇注讙诇转 拽谞讬讜转. 专拽 讻讱 讗谞讞谞讜 诪讜讜讚讗讬诐 砖诪讬 砖拽讜专讗 讗转 讛拽讜讚 讬讜讚注 诇讞讘专 讘讬谉 讛讘讚讬拽讛 诇讘讬谉 讛讚讘专 砖讛讬讗 讘讗诪转 讘讜讚拽转, 砖讻诇 讛拽讜讚 讘诪注专讻转 诪转讜讞讝拽 讜砖讬砖 诇谞讜 讗讞讬讚讜转 讘诪诪砖拽. 转讬讗讜专讟讬转 驻讬转专讜谉 拽诇 诪讗讜讚 讘诪拽专讛 讻讝讛 讬讛讬讛 驻砖讜讟 砖讛驻讜谞拽爪讬讛 讛专讗砖讜谞讛 转拽专讗 诇驻讜谞拽爪讬讛 讛砖谞讬讛, 讻诇讜诪专:
    def <<(product)
        add_with_options(product, {})
    end
讜讝讛 讘讗诪转 诪转拽谉 讗转 讻驻讬诇讜转 讛拽讜讚 讘诪讬诪讜砖 诪讞诇拽转 注讙诇转 讛拽谞讬讜转 讗讘诇 注讚讬讬谉 诇讗 驻讜转专 诇谞讜 讗转 讛讘注讬讛. 讛诪诪砖拽 注讚讬讬谉 诪住讜专讘诇 讜讻讜诇诇 砖转讬 讗驻砖专讜讬讜转 讘诇讬 讛讘讚诇 讘专讜专 讘讬谞讬讛谉. 讬讜转专 讞砖讜讘 诇讛讘讬谉 讗讬驻讛 讘诪注专讻转 诪驻注讬诇讬诐 讗转 add_with_options 讜诇讘讞讜专 诇驻讜谞拽爪讬讛 砖诐 砖讬讜转专 诪转讗讬诐 诇 Use Case 讛住驻爪讬驻讬 砖诇讛, 讜讘讗讜转讛 谞砖讬诪讛 讛讬讬转讬 诪砖谞讛 讙诐 讗转 讛砖诐 砖诇 驻讜谞拽爪讬讬转 讛讜住驻转 诪讜爪专 讛讬砖谞讛 诇诪砖讛讜 砖讬转讗专 讟讜讘 讬讜转专 讗转 讛 Use Case 讛住驻爪讬驻讬 砖诇讛. 讘诪拽专讛 砖诇谞讜 讗驻砖专 诇讞砖讜讘 注诇:
class ShoppingCart < ActiveRecord::Base
    def add_product_sold_by_partner(product, partner_price, partner_options)
    end
    
    def add_product_from_website(product)
    end
end
讘爪讜专讛 讻讝讗转 讛砖诐 add_product_from_website 讻讘专 专讜诪讝 诇谞讜 砖讬砖 讚专讻讬诐 谞讜住驻讜转 诇讛讜住讬祝 诪讜爪专讬诐 诇注讙诇讛 讜诪注讜讚讚 讗讜转谞讜 诇诇讻转 诇诪讞诇拽讛 诇讘讚讜拽 诪讛谉.