В каждом проекте, который я запускал на языках без систем типа, я в конце концов начинаю изобретать систему типа времени выполнения. Возможно, термин "система типов" слишком силен; по крайней мере, я создаю набор валидаторов типов/значений, когда я работаю со сложными типами данных, а затем я чувствую необходимость быть параноидальным, когда типы данных могут быть созданы и изменены.
Я не думал об этом до сих пор. Будучи независимым разработчиком, мои методы работают на практике по нескольким небольшим проектам, и нет причин, по которым они перестанут работать сейчас.
Тем не менее, это должно быть неправильно. Мне кажется, что я не использую языки с динамически типизированными "правильно". Если я должен изобрести систему типов и применить ее самостоятельно, я также могу использовать язык, на котором есть типы, начинающиеся с.
Итак, мои вопросы:
- Существуют ли существующие парадигмы программирования (для языков без типов), которые исключают необходимость использования или изобретения систем типов?
- Существуют ли общие рекомендации по устранению проблем, которые статическая типизация решает на динамически типизированных языках (без застенчивого переосмысления типов)?
Вот конкретный пример для вас. Я работаю с datetime и timezones в erlang (динамический, сильно типизированный язык). Это общий тип данных, с которыми я работаю:
{{Y,M,D},{tztime, {time, HH,MM,SS}, Flag}}
... где {Y,M,D}
является кортежем, представляющим действительную дату (все записи являются целыми числами), tztime
и time
являются атомами, HH,MM,SS
являются целыми числами, представляющими 24-часовое время, и Flag
является одним из атомов u,d,z,s,w
.
Этот тип данных обычно анализируется с помощью ввода, поэтому для обеспечения правильного ввода и правильного анализатора значения должны быть проверены на правильность ввода и допустимые диапазоны. Позже экземпляры этого типа данных сравниваются друг с другом, делая тип их значений тем более важным, поскольку все термины сравниваются. Из справочного руководства erlang
number < atom < reference < fun < port < pid < tuple < list < bit string