Манифестная типизация (которую, я полагаю, вы имеете в виду) является формой спецификации, модульное тестирование намного слабее, поскольку предоставляет только примеры. Важным отличием является то, что спецификация объявляет, что должно храниться в любом случае, тогда как тест охватывает только примеры. Вы никогда не можете быть уверены, что ваши тесты охватывают все граничные условия.
Люди также склонны забывать значение объявленных типов в качестве документации. Например, если метод Java возвращает List<String>
, тогда я сразу же узнаю, что я получаю, не нужно читать документацию, контрольные примеры или даже сам код метода. Аналогично для параметров: если тип объявлен, то я знаю, что ожидает метод.
Значение объявления типа локальных переменных намного ниже, поскольку в хорошо написанном коде область существования переменной должна быть небольшой. Вы все еще можете использовать статическую типизацию: вместо того, чтобы объявлять тип, вы позволяете компилятору выводить его. Такие языки, как Scala или даже C # , позволяют вам делать это.
Некоторые стили тестирования приближаются к спецификации, например, QuickCheck или его вариант Scala ScalaCheck генерирует тесты на основе спецификаций, пытаясь угадать важные границы.