Устали от несемонтического тестирования, чтобы восполнить динамическое печатание - предложения?

StackOverflow https://stackoverflow.com/questions/4379439

Вопрос

Раньше я делал много веб -программирования в Rails (PHP до этого), прежде чем начал изучать компьютерную технику.

С тех пор я проделал много школьной работы в C, и некоторые личные вещи в Objective-C (Mac). Я научился любить статическую набор.

Но теперь мне приходится делать профессиональную веб -разработку (фриланс) и снова подобрал Rails. Я считаю, что это действительно раздражает писать несементные тесты по проверке типов. Я получал их бесплатно от компиляторов C и объектива C. Мне нравилось наносить удары по сборке, и система проверяла весь мой код, чтобы увидеть, что может вызовать B, B может вызвать неясную библиотеку C и т. Д. Все, что мне нужно было сделать, это проверить семантику. Но с рельсами я компилятор. :(

Кто -нибудь пошел на этот же путь? Являются ли мои единственные варианты для веб -разработки ASP.NET MVC с C# и Java + X Framework? Ищу некоторые предложения или даже какую -то симпатию ...: P

Кстати, я делаю особую ссылку на рельсы, а не рубин, потому что я не возражаю против динамической природы Руби для простых вещей, таких как сценарий или что нет. Но так как Rails зависит от многих драгоценных камней, и, поскольку один обычно добавляет ряд других драгоценных камней, динамическая набор становится проблемой.

Спасибо!

редактировать:

Я последовал за предложением PST и посмотрел в Scala. Читая книжное программирование в Скале, написанное создателем языка Мартином Одерским, я пришел на этот текст, который во многих отношениях выражает мои проблемы и немного больше. Очень интересное чтение.

Взято со страницы 52 программы Мартина Одерского в Scala:

Скала статически напечатана

Система статического типа классифицирует переменные и выражения в соответствии с видами значений, которые они держат и вычисляют. Scala выделяется как язык с очень продвинутой системой статического типа. Начиная с системы вложенных типов классов, очень похожая на Java, она позволяет параметризовать типы с дженериками, объединять типы с использованием пересечений и скрывать детали типов с использованием абстрактных типов. Они дают прочную основу для построения и сочинения ваших собственных типов, чтобы вы могли проектировать интерфейсы, которые одновременно безопасны и гибко в использовании.

Если вам нравятся динамические языки, такие как Perl, Python, Ruby или Groovy, вам может быть немного странно, что система статического типа Scala указана как одна из ее сильных точек. В конце концов, отсутствие системы статического типа было названо некоторыми в качестве основного преимущества динамических языков. Наиболее распространенные аргументы против статических типов заключаются в том, что они делают программы слишком многословными, не позволяют программистам выражать себя по своему усмотрению, и делают невозможные определенные модели динамических модификаций программных систем.

Однако часто эти аргументы противоречат идее статических типов в целом, а против конкретных систем типа, которые воспринимаются как слишком многословные или слишком негибкие. Например, Алан Кей, изобретатель языка SmallTalk, однажды отметил: «Я не против типов, но я не знаю ни одного типа систем, в которых не полная боль, поэтому мне все еще нравится динамическая набор».

Мы надеемся убедить вас в этой книге, что система типа Скалы далеко не «полная боль». Фактически, он хорошо рассматривает две из обычных опасений по поводу статической типики: словесность избегается за счет типового вывода, и гибкость получена благодаря сопоставлению рисунков и нескольким новым способам написания и составления типов. С этими препятствиями в стороне, классические преимущества систем статического типа могут быть лучше оценены. Среди наиболее важных из этих преимуществ - подтверждаемые свойства абстракций программ, безопасных рефакторинг и лучшую документацию.

Проверенные свойства

Системы статического типа могут доказать отсутствие определенных ошибок времени выполнения. Например, они могут доказать свойства, такие как: логики никогда не добавляются в целые числа; Частные переменные не доступны извне их классов; Функции применяются к правильному количеству аргументов; Только строки когда -либо добавляются к набору струн.

Другие виды ошибок не обнаруживаются современными системами статического типа. Например, они, как правило, не обнаруживают неконтролирующие функции, нарушения границ массива или подразделения по нулю. Они также не будут обнаружить, что ваша программа не соответствует ее спецификации (при условии, что есть спецификация, то есть!). Таким образом, системы статического типа были отклонены некоторыми как не очень полезные. Аргумент гласит, что, поскольку такие системы могут обнаружить только простые ошибки, тогда как модульные тесты обеспечивают более широкий охват, зачем вообще беспокоиться о статических типах?

Мы считаем, что эти аргументы упускают из виду. Хотя система статического типа, безусловно, не может заменить модульные тестирование, она может уменьшить количество модульных тестов, необходимых, заботясь о некоторых свойствах, которые в противном случае потребуются проверки. Аналогичным образом, модульное тестирование не может заменить статическое типирование. В конце концов, как сказал Эдсгер Дейкстра, тестирование может доказать только наличие ошибок, никогда не их отсутствие. Таким образом, гарантии того, что статическое набор типов может быть простым, но они являются реальными гарантиями формы, которую не может провести количество испытаний.

Безопасные рефакторинги

Система статического типа предоставляет сеть безопасности, которая позволяет вносить изменения в кодовую базу с высокой степенью уверенности. Рассмотрим, например, рефакторинг, который добавляет дополнительный параметр к методу. На статически напечатанном языке вы можете внести изменение, повторно выполнять свою систему и просто исправить все строки, которые вызывают ошибку типа. Как только вы закончите с этим, вы наверняка нашли все места, которые необходимо изменить. То же самое относится и к многим другим простым рефакториям, таким как изменение названия метода или перемещение методов из одного класса к другому. Во всех случаях проверка статического типа обеспечит достаточную уверенность в том, что новая система работает так же, как старая.

Документация

Статические типы - это программная документация, которая проверяется компилятором на правилу. В отличие от обычного комментария, аннотация типа никогда не может быть устаревшей (по крайней мере, если исходный файл, который содержит его недавно, передал компилятор). Кроме того, компиляторы и интегрированные среды разработки могут использовать аннотации типа, чтобы обеспечить лучшую помощь в контексте. Например, интегрированная среда разработки может отображать все элементы, доступные для выбора, определив статический тип выражения, на котором производится выбор, и поиска всех членов этого типа.

Это было полезно?

Решение

Это одна из моих «проблем» о динамических языках. Я хочу проверить на семантику, а не ошибки типа ;-), что, как говорится, хорошая структура тестирования/настройка действительно необходима во всех нетривиальных ситуациях, и хорошие и тестируемые требования являются/важны.

Если вы действительно хотите пойти по пути статического типа на JVM (у меня есть), я настоятельно рекомендую посмотреть Скала. Анкет Приезжая от Руби, это гораздо менее болезненно (и на самом деле очень весело по -разному), чем ходить на Java. Вы получаете «сохранять» то, что вы считаете само собой разумеющимся-синтаксис, основанный на выражении, закрытие, возможность опускать типы во многих местах (не так открыто, как Ruby, но вы получаете проверку типа времени компиляции ;-), Все (*)-is-an-object oo, единые методы доступа, способность легко строить DSLS и сахар-и получить преимущества статически напечатанного языка с выводом локального типа, сопоставлением образцов, относительно богатой структурой сбора и Приличная интеграция с Java (включая многочисленные веб-фрейм-завод, есть некоторые специфичные для Scala структуры, которые используют язык Scala).

C#3.0/4.0 (и .net3.5+) не Слишком потертый Либо (но избегайте C#2.0, который, надеюсь, теперь является реликвией), с введением LINQ/закрытия, базового вывода типа и других функций хорошего языка, я нахожу это «приемлемым» для большинства задач (погагивайте, как я бы оценил Java как язык ;-). Тем не менее, C#-это язык CLR-мишень (есть/был порт .NET Scala, но я не уверен в статусе-хотя это не основная целевая платформа).

Поскольку я упомянул Scala, я также должен упомянуть F# (ныне «официальный» .NET Language), который использует подход «функциональный с OO», похожий на OCAML - Scala больше обратного, и я бы назвал его «OO с функциональным ". Я слышал аргументы для/против F# по сравнению с C# WRT The Type System, но не имею практического опыта с F#. Вам может понравиться или не понравиться сдвиг парадигмы.

Счастливого кодирования.

Другие советы

Когда вы упоминаете Rails и, учитывая, что вы заинтересовались Scala, вы обязательно должны проверить Поднимать. Анкет Вот 2008 Интервью со своим создателем и Презентация 2009 года (Видео), которое я связываю, потому что, хотя и старые, они сравнивают подъем с альтернативами на других языках.

Если подъем не ваша вещь, будьте уверены, что есть Другие веб -фреймворки Scala.

Этот тип тестирования обычно не выполняется в рельсах. Вместо того, чтобы раздражать его делать, подумайте о том, чтобы не беспокоиться об этом. Или, возможно, лучше объяснить, почему вы думаете, что это проблема, так как большинство программистов Rails не делают.

Обновлять

Человек, который написал test_include_with_order_works Убедитесь, что Rails будет интерпретировать символ, так же, как веревка в данном конкретном случае. Это не похоже на то, что вам нужно проверить, так как Rails уже предоставил и проверил эту функциональность для вас. Честно говоря, я немного удивлен, что кто -то даже беспокоится о том, будет ли символ функционировать как строка. Мы все знаем, что это может и часто это делает.

В общем, я думаю, что рамки Rails должны обеспечить, чтобы вы не делали, чтобы ее реализация соответствовала его дизайну. Я считаю, что рабочая философия в динамически напечатанных языках заключается в том, что клиент -код не будет проходить в параметрах, которые нарушат методы, которые они призывают. Если они это сделают, они не получают использования из вызова методов. Вам не нужно тратить свое время, чтобы убедиться, что ваши методы будут делать исключения, когда они предоставляются слишком много параметров, когда ваш метод может так же легко (и должен) игнорировать дополнительные параметры.

Итак, я не уверен, действительно ли приведенные вами примеры демонстрируют необходимость в несемантическом тестировании на рельсах.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top