Osobně mám zkušenost, že Typy nutí uvažovat konkrétním způsobem
To mě zaujalo. Jakým? Případně jaké typy, primitivní, generické, závislostní...? Že odchytnou většinu chyb je jasné, ale to specifické uvažování mě zajímá.
To sem si zase naběh'.Nemám to tak promyšlené, takže prosím o shovívavost.
Když nemám typy, tak pracuju s chlívečkama. Sem dej tohle číslo, pak hoď sem, tam se s ním bude počítat. Vzniká kód ve stylu:
foo.title = "Mr"
if foo.sex:
foo.title = "Ms"
foo.title += ": "
foo.title += name
foo.title += " "
foo.title += surname
Když mám typy, alespoň takové ty hodně blbé aka Java, C#, tak bude tendence to někam uklízet. Ale moc to nefunguje.
Když se přitlačí s imutabilitou, tak začne víc dekompozice na stromeček:
Foo(buildName(src1, src2), buildSurname(src1, src4))
když nemohu přetěžovat funkce/metody, tak píšu hodně switch:
function renderAny(x):
switch (type(x)):
case "Application":
return renderApplication(x)
case "Window"
return renderWindow(x)
default:
error()
Pokud mám k dispozici imutabilitu, statické typování tak mám tendenci to stavět jako kompozici funkcí. (Pokud ne, tak taky, ale protože jsem už ovlivněnej.) Opírám se o to, že mi sem přijde typ Person. Zatímco když nemám typy, tak počítám s tím, že mi sem přijde struktura obsahující name, surname. S typem Person nemohu to co se strukturou.
Když mi přijde třída Renderable tak jí renderuju. Protože tak nějak uvažuju, že ty záruky se vztahují jen na Renderování. Zatímco když mám funkci render přijímající sturkturu, tak renderuju tu strukturu. A přirozeně i něco vypočítám navíc, něco si odložím, něco vytáhnu pokoutně...
Asi to nebude všechno, jen prvotní co mě napadlo.