Статическая печать все еще важна.
Хотя это обсуждается снова и снова, и сторонники динамического подхода говорят, что проблемы, которые приносит динамическая типизация, могут быть уменьшены (или даже устранены) с помощью достаточного количества модульных тестов.
Я не хочу спорить, является ли этот аргумент правильным, поэтому я предполагаю, что это так, для этого ответа.
В этом случае есть еще одна проблема: многие магазины не имеют процедур / ноу-хау / правил / руководства для производства достаточного количества высококачественных модульных тестов.
И если мне придется выбирать между динамически типизированным кодом без модульных тестов и статически типизированным кодом без модульных тестов, я буду выбирать статически типизированный код каждый день.
Аналогичная проблема существует с двойная отправка :
В Groovy вызовы методов отправляются на основе фактических типов аргументов во время выполнения (что почти необходимо, поскольку статический тип неизвестен и / или Object
большую часть времени). Это означает, что нет надежного способа узнать, какой метод вызывается в любой заданной точке кода, когда он сталкивается с расширяемой иерархией классов.
Любой код, который в большинстве случаев вызывает метод с подписью foo(String)
, может внезапно вызвать foo(Integer)
или foo(SomethingElseEntirely)
, в зависимости только от фактического типа аргумента во время выполнения . На языке Java это никогда не произойдет, потому что точная сигнатура вызываемого метода определяется во время компиляции.
Так же, как и другие «динамические» языковые функции, двойная диспетчеризация иногда является очень полезным инструментом, и ее отсутствие может привести к появлению уродливых конструкций в Java, но имеет свою цену в том, что делает ее еще труднее читать, понимать и причина о коде.