2016-02-05 2 views
1

Я до сих пор не делал много кодирования на динамически типизированных языках, таких как JavaScript, и теперь, когда я начинаю понимать, что возможно, я начинаю задаваться вопросом, какая хорошая идея, а что нет. В частности, я не уверен, что пересмотр типа переменной как функции, проходящей через последовательность операций, считается хорошей практикой.Динамическая типизация в JavaScript: Это хорошая идея?

Например, у меня есть куча файлов, содержащих даты в виде строк. Я использую front-matter для извлечения атрибутов даты и их хранения в объекте, представляющем исходный файл. Строки сами по себе не очень согласованы, поэтому я использую Moment.js для их анализа и сохранения результата обратно в том же атрибуте в том же объекте article.date. Это кажется более или менее правильным для меня, поскольку article.date является только строкой для одной операции, прежде чем ее разобрать и сохранить в виде типа Дата/«Момент».

Часть, которую я немного не уверен в следующем. Это часть приложения ExpressJS, поэтому массив этих объектов передается как данные в вызове render(), где он переходит к шаблону Jade для рендеринга. Но что, если я хочу использовать метод отображения в Moment.js для управления тем, как дата выглядит как String? Было бы разумным изменить тип атрибута даты обратно на String еще раз, прежде чем передавать его?

Пример:

articles[i] = processArticle(content); 
// creates an article object from YAML, object has a property article.attributes.date 
articles[i].attributes.date = moment(articles[i].attributes.date); 
// attribute is now a Date/Moment 
articles[i].attributes.date = articles[i].attributes.date.format("dddd, MMMM Do YYYY, h:mm:ss a"); 
// attribute is now "Sunday, February 14th 2010, 3:25:50 pm" 
+1

Мой прив бы не делать этого. Если вы напишете какой-либо другой промежуточный метод, откуда вы знаете, является ли 'attributes.date' строкой или нет? Я не люблю венгерскую нотацию, но в этом случае я бы назвал «dateString» и другую «дату» или «момент». – user949300

+0

Некоторые подборки nit :-) Переменные и свойства не имеют типа, значения имеют значение. Здесь вы имеете дело с свойствами объекта, а не с переменными. Вы можете рассмотреть дополнительное свойство, например * dateString *, это ваша форматированная строка. Самые большие проблемы с преобразованием из строки в дату и обратно последовательно - это производительность (потраченные впустую циклы) и независимо от того, вы последовательно анализируете и форматируете строку без изменения значения, которое она представляет. Только вы знаете ответы. ;-) – RobG

+0

@RobG Извините, noob counter-nitpick/question: Это потому, что мы говорим о динамически типизированном языке? т. е. свойство variable/не имеет типа, поскольку оно может содержать * значение * любого типа? Или это фундаментальная концепция? Я думаю о том, как в статически типизированном языке 'int foo = 100' объявляет' foo' как int, а затем присваивает ему значение (которое лучше было бы int, или еще) – Toadfish

ответ

1

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

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

Итак, чтобы ответить на ваш вопрос: нет, это не очень хорошая практика, чтобы изменить тип переменной по мере продвижения функции.

Чтобы использовать Moment.js в шаблоне Джейд: How do I display todays date in Node.js Jade?

+0

Просто чтобы подтвердить, это означает, что # {articles.attribute.date.format ("dddd, MMMM Do YYYY, h: mm a")} переформатирует дату момента для отображения во время рендеринга из шаблона нефрита?Я придерживаюсь всей своей логики на стороне JS и просто передаю строки для нефрита в слот в шаблон, потому что я более уверен в JS, чем в нефрите, и это казалось самым разумным разделением труда. – Toadfish

+1

Да. Я бы подумал о том, чтобы сделать форматирование в шаблоне лучше: в JS вас интересуют объекты (например, объект момента), а не их представление для отображения/вывода. Тем не менее, в шаблоне Jade вы находитесь и, следовательно, там есть форматирование. – Sonata

+0

Нужно ли мне делать что-нибудь особенное, чтобы иметь возможность доступа к moment.js из шаблона нефрита? Или он выглядит в app.locals с четкой стороны вещей без какого-либо вмешательства с моей стороны? Ваша ссылка подразумевает последнее, но я не думал, что Джейд будет настолько тесно интегрирован, я учусь дать Джейду гораздо больше кредитов, я думаю. – Toadfish

Смежные вопросы