Как правило, избегайте динамически типизированных языков. Потеря проверки времени компиляции и самодокументирующая природа строгой статической типизации вполне оправдывают необходимость включения информации о типе в ваш исходный код. Если при написании кода требуется слишком много лишней типизации, то язык с выводом типа (Scala, Haskell) может представлять интерес.
Наличие информации о типе делает код намного более читабельным, и удобочитаемость должна быть вашими критериями # 1 в кодировании. Человеку дорого читать код, все, что мешает ясному и точному пониманию читателем, - плохо. В ОО-языках это еще хуже, потому что вы всегда делаете новые типы. Читатель, только знакомясь, будет колебаться, потому что он не знает типы, которые передаются и изменяются. Например, в Groovy допустимо следующее def accountHistoryReport(in, out)
Читая это, я понятия не имею, что такое in
и out
. Когда вы смотрите на 20 различных методов отчета, которые выглядят одинаково, вы можете быстро перейти к полному убийству.
Если вы действительно считаете, что вам нужна нестатическая типизация, то такой язык, как Clojure, является хорошим компромиссом. Лисп-подобные языки построены на небольшом наборе ключевых абстракций и огромном количестве возможностей для каждой из абстракций. Поэтому в Clojure я создам карту (хэш), которая имеет атрибуты моего объекта. Это немного редукционист, но мне не нужно будет просматривать всю кодовую базу для реализации какого-то безымянного класса.
Мое эмпирическое правило заключается в том, что я пишу сценарии на динамических языках, а системы - на компилируемых статически типизированных языках.