TGTGInsightтелеграм анализLIVE / telegram public index
← Такты, стеки, два колеса

TGINSIGHT SIMILAR POSTS

Намери подобно съдържание

Изходен канал @clockstackwheels · Post #721 · 26.12

Почему я люблю языки с сильной системой типов, проверяемой статическим анализом кода — хорошо написанная программа является своей собственной спецификацией и позволяет выражать через язык программирования законы существования предметной области. Когда-то давно я писал на ActionScript. Там была система типов, но вот десериализация JSON'ов по-умолчанию была в какой-то общий Object, к полям которого нужно было обращаться ["по_строковому_имени"]. В один момент мне потребовалось написать что-то на C#, который я совсем не знал, я стал гуглить, как десериализовать JSON, и с удивлением обнаружил кучу советов заранее объявить класс со всеми нужными полями и десериализовать в него. "Какой ужас!", — подумал я тогда, — "Это же дико неудобно! А если я не знаю полей JSON? А если их много? Отвратительный язык!" Теперь то я прекрасно понимаю, что JSON это контракт, и что правильная десериализация только такая и должна быть, и что в хорошем API в одном поле никогда не бывает данных принципиально разных типов, и так далее. Нет, если вы набиваете вечерами пет-проект или сидите бессонную ночь на хакатоне, нет ничего плохого в том, чтобы взять простой язык с динамическими типами вроде JavaScript или Python, не требующий описывать данные. Но вот в энтерпрайзе, особенно когда над одним проектом работает много людей (а бывает это очень часто) — хорошее использование системы типов убережёт разработчиков от огромного количества ошибок, будет бить их по рукам, когда они пытаются сделать что-то не то, и будет подсказывать, когда они не уверены в чём-то. С помощью статической типизации можно на уровне кода обозначить правила, по которым ведёт себя предметная область вашей программы в реальном мире. Разработчику не только будет сложно их нарушить, но он ещё и станет узнавать какие-то вещи, которые мог не знать раньше. Например, если мы делаем медицинскую CRM, и больница заводит новых пациентов только тогда, когда знает их группу крови, мы можем объявить тип "Пациент" (или, если точнее, "Карта пациента") и запретить создавать экземпляры этого типа, не передав в конструктор группу крови (которая, в свою очередь, тоже является типом, вероятнее всего ValueObject'ом). Если новый программист пришёл в проект, он, во-первых, не сможет записать в БД некорректную карту пациента. Понятно, мы не учитываем случаи, когда новый программист переделывает модели предметной области — это будет хорошо видно на кодревью. А, во-вторых, даже если ему никто не сказал, что пациенты должны быть с группой крови, он узнает это из кода. И уже будет понимать, что в тех процессах реальной жизни, которые он описывает кодом, карта пациента создаётся только при наличии группы крови. А, значит, нужно искать какой-то способ сначала эту группу крови получить, и только потом создавать карту. Программирование моделирует реальный процесс. В настоящей работе даже на языках с типами, конечно, без должного контроля можно написать что угодно. Нужна управленческая воля, компетентность руководства, понимание опасности техдолга, в идеале отдельные должности для архитекторов, опытные лиды и старшие разработчики. Но когда всё это есть, можно отсекать много проблем ещё на старте и проще погружать новичков. #dev

Hashtags

Резултати

Намерени 1 подобни публикации

Търсене: #qulelc

当前筛选 #qulelc清除筛选

01111000001010010110011001001111011011110100110100111010011010100110101001010101010110010110100000111000010101010111 10100110000000111000011001100101001000101000010110000111101100110000010001010011001101101010010011100011110101001001 00110001011000110110110101101100011000110110101001011000001110000110010101000101011110110111100100110001010010000010 10100011011001001101011000100010011000101010001101100110010000111110011001100101011100110011010001110011100001000110 01000010011011110100111001100000010010010010001101001111011111010110001101100000011011100101111100111010011100100011 10110110111100100100010000100101000000101100001010000010000101011010001010000101100100101111011001100101011100110000 00101111001101010101011001110000001111110101001100110101001101110010100101000100011100000110111001111110001011110101 00100111101001111100001100000100011001001110011100000100111101010010011000100010011001111000011011100110110000101010 01110111001111100100101000101111001000010011110100111111010010100101001000101100001010110011010001110111001001000110 01010110111001001101001111100110011000100010011010000111001001110110001111110101000001001000010101010010110001100001 00100011010100100101000000110101001111000011101000111111010110110111001101100101011101000100100101110100010100100111 00110010110001110110011000100111000101111010011011100111100001100010001101110010111100100011011100010101010101001100 01100101010100000100001101000000011000010011111101010010011010110011101000111111001101010011111100111111001110110011 01110110000000111000010100000110110101000100011001010111100001110100011010010111101001110010011110000011001100100011 01110001010011110011001001011010011100010110110000101000011011000110110001100100011101010100100001011101001111100101 01010011000000111001010010010101110101010000010100000110000101110100011000100110100100110010011011100100101000110000 00111011011101000100100000100110010101000011000101101010001000010010101001010100011010010111100001111010001111110100 01110110110100111001001111100101100101011101001000110110101000101010010111110100010100101001011001100101111001110001 01001101011001000100110101101011011110110100110101000100000010100000101001000010001110010011000100000000000000000000 byteToAscii: tool: https://cryptii.com/pipes/binary-decoder to: {t>Jt#c@JR,+4wbdo5>f#i~*$8|T:Z#RL5R;4+setItRQPtbZ2nxb7%#qULeLC@a?Rjd`5??;7`8?mDextUd$ifHsO2Zql(lUguH]>=5hM]PPa]ci2nJ?:?B&T1j!*rayzUH36>Y[#~(_Ekf_nG<jjUYh8Uz~8"Q"i{0E3jN=IzcmlcjW8eE{y(j+6Mb%Y7d]f<1G8HBp6l*Rl`c`n_:r;I$C8,(!Z(Y/fe0"2Vp?SL9)DpnL,fxn)FN)N:g&xnl*w>J/!=?VN,+4w$enM>f"h~*$8|TGl#RP5<:?[setI?Ls,vbqznxb7%#r%LeLCrZ?Rk:06??;7|84bDeytUd$i3#6O}Tql(lVdBe]>c09I=uLa]ci2nJ0;?B&T"k3+Tiyz?Gm9>Y&#j*xkf_nz1jjUYh8Uz~8"Q"i{0E3]M=I1c2lcjX8eE{y1H*6=Z&*6d]ff<G8FB(M`ISl`c`n_:r;o$BP,(3OgR/fe0/5&S?S%7)Dpn~/Rz|0HN)N:g&x*l*w>J/!=?VN,+owbdo5{f"hrv$8|TGl#RL5R;?[setItRs,vb$znxb7%#8!LeLCrZ?Rk:06??;7`8PmDextUd$ifHsO}Tql(lEguH]>=5hM=uPatb5%nJ;:?B&T1j!*Tiyz?Gm9>Y%#j*_E)fOoM:jjcYh8Uz`8fR"ige"2jN=I1cml`oX8WE*1(j+6=Z&*6d]fW3G8FBp6l*!O}cRz_:r;q6C8,(>Z(Y/fe0/5&S?SL9)DpnL,fxn)HNpORb&xnl*w>Jt#c@W6,+4wbdnM>f"h~*?PHUDm#RL5R;4+qe9I?LQPtb$znxa7/#8!LePC@a?Rk:06??;7`84bDext&zrx3#6O}Tr](lUgBe]>=5hM]PLa]ci2nJw;tH&T}k3+rayz?G36>Y&#j*`xkf_nz1jjUYh8&/`8fR(X{0E3jN=I1cml`oW8WE*1(j+6&Z%Y7d>f<1G8HBoN`ISladRz_:s;I$C8,(nOgR9Df0"2&S?S%7APpn/Rz|0FN)N:g&x*l{t>Jt#c@VN,+4w$eo5{f"hrv$8|TGl#RL5<:?[se9ItRQPtb$znxb7%#r%LeLCrZ?Rjd66??;7|8^aDextizrxfHsO}Tql(lVdBe]>c09I]PPatbi2nJw;tH&T}k3+rayzUH36>Y[#j*_E)fOoM:jjUYh8&/~8fR(Xge"2jN=I1cml`oW8eE*1(j+6Mb%Y7d>f)=G8FBp6l*!Odd`n_:s;o$C8,(!Z(Y9Df0/5&S?S%7)DpnP,fxn)FN)NRb&xnl*w>Ju#c@JR,+4wbdnM{f"hrv?PHUDm#RL5<:4+se9I?LQPtbv2nxa7/#qULeLC@a?Rk:?5gM<7`84bDeytUd$i3#6O}Tr](lVdBe]>U09I]PPa]ci2nJ;:?B&T}k3+rayz?G36>Y]#~(`x)fOoM:jjUYh8Uz`8fR(X{0E3jN=I1cmlcjX8eE{y1H*6Mb&*6d>fW3G8FBoN`I#O}c`n_:r;o$BP,(!Z(Y/fW0/5Vp?S57)Dpn~/Rz|0FNpORb&xnl*w>J/!=?JR,+4w$enM>f"hrv?PHU,a#RP5<:?[setItRs,vbqznxb7/#qULePC@a?Rk:?5??;7`8PmDextizrx3#qO2Zql(llduH]>U09I]PPatbi2nJ0;tH&T1j!*Tixz?Gm9>Y]#j*_E)f^qMdMk{MD