Явное задание типа. ХЕЕЕЕЛЛЛППП !!!!!
Здравствуйте уважаемые коллеги. Только-только начал изучать javascript. Задача - написать клиента для работы с некоторой довольно специфической базой данных. Если кому интересно, приблудина должна представлять собой что-то похожее на Total Commander, но с кучей особых фич. Итог месяца работы - около 1000 строк отлаженного кода с базовым функционалом. Да, конечно до того я ничего не знал ни о javascript, ни о html ни о css. К тому же пришлось изучать python, на котором я писал сервер, и курить доки по mongodb. Тем не менее на QT или ActionScript3, я написал бы подобный код за 2-3 дня.
Это вообще первый в моей жизни код, написанный на яваскрипте. Что могу сказать по итогу. Много я в жизни повидал всякоразного говна. Но ничего говеннее яваскрипта не видал. Даже ассемблер удобнее. В любом нормальном макроассемблере можно определить структуру. И компилятор будет следить за обращениями к ее полям. А если есть нормальная среда, она еще сделает и автокомплит. Здесь же абсолютная свобода ведет к абсолютной анархии. Я юзаю PyCharm от JetBrains. Среда просто гениальная. По тому, как она показывает код, я вижу, что юзаются какие-то частотные и вероятностные методы анализа в попытке определить тип переменной. Но все равно автокомплит толком не работает ! Вобщем по опыту этого проекта я понял, что 100% динамическая типизация есть 100%, т.е. АБСОЛЮТНОЕ ЗЛО, делающее язык непригодным для написания чего-либо серьезного. Раньше я иногда спорил, отстаивая эту точку зрения чисто теоретически, ибо никогда ранее на подобных языках не писал. Но сейчас на 100% в этом убедился. Итого, не хочу разводить тут флейма и холивара, хочу задать вопрос. Уважаемые коллеги, существует ли для javascript какая-нибудь приблудина со следующими свойствами ? 1) Позволяет ЯВНО (!!!) указывать типы объектов. Например так, как это сделано в ActionScript3 - var <имя>:<тип> 2) Является расширением javascript, а не новым языком типа Haxe, прозрачно преобразующей текст в обычный javascript, просто удаляя объявления типов. 3) Интегрирована в какую-то IDE, позволяя нормально работать автокомплиту. P.S. Народ, если кто знает, тот же вопрос и для python. Тоже такой же говноязык для "программистов", вычисляющих корни квадратного уравнения. Это пожалуй даже более для меня важно, ибо основная тяжесть проекта будет на сервере. С яваскриптом просто сейчас на первом этапе пришлось очень плотно работать. Дальше будет в основном python. |
Ругаетесь на javascript хотя толком его не знаете, да ещё и на форуме по javascript. И при всем этом хотите, чтобы вам помогли. Жесть :blink:
|
Я все-таки задаю вопрос о тулзе. Ругаюсь просто чтобы было понятно, для чего она мне нужна. Можете что-то ответить по существу ?
|
Используйте флеш, или typescript. Хотя лучше напишите свой транслятор, который будет использовать все нужные фичи. И конечно ide для него
|
zebra, всегда так делаю.
|
eugenk, используйте JSDoc и получайте автокомплит. Не знаю, как во всех продуктах JetBrains, но в IntelliJ IDEA поддерживается по-умолчанию.
|
Цитата:
|
Цитата:
Еще раз прошу прощения, но доки это немного не то. Пример. У меня есть массив panels, в котором я храню объекты типа Panel, в которых в свою очередь хранится описание физических свойств панелей моего менеджера базы данных. Например высота и ширина панели, число строк текста и т.п. Т.е. объект типа Panel является строго определенным. Он содержит четко определенные поля и ничего более. А глобальная переменная panels хранит только объекты типа Panel и ничего более. В программе я пишу: var panel=panels[pan]; panel.width=200; Никаие доки не помогут определить среде, что panel это объект типа Panel, который содержит поле width, но не содержит поля widht. Если бы тип Panel был известен, во-первых как только я написал бы panel. сразу появился бы автокомплит, который подсказал бы поле width. Во-вторых, если я все-таки напишу panel.widht, в нормальном языке компилятор бы выругался на несуществующее поле. В javascript panel.widht=200 будет понято как желание ввести в объект panel новое поле widht и присвоить ему значение 200. Поле width при этом разумеется не изменится и программа нормально запустится. После чего придется очень долго выяснять в отладчике, почему ширина панели не меняется. Я говорю исключительно об этих проблемах. Документирование на JSDoc тут не спасет. |
Цитата:
|
Zebra, огромный респект за наводку на typescript ! Сейчас поставил, правда для этого PyCharm обновлять пришлось, и не могу нарадоваться ! Это почти что ActionScript3 ! Вот что значит спросить совета у знающих людей ! Ну и тогда еще вопрос. Вы не подскажете, нет ли столь же полезной тулзы для python ? Он увы тоже страдает теми же проблемами, что javascript. Только с питоном, если что-то такое есть, нужно на версию 2.7. Третьей я не могу пользоваться ибо под ним на сервере надо nltk поднимать, а он только под двойку. Вобщем был бы дико благодарен, если бы знатоки подсказали и для питона решение. Сам я что-то ничего не смог в сети разыскать.
|
не понимаешь ты все прелести динамической типизации. в чем проблемы то в кривых руках?
|
В чем прелесть-то ??? В том что баги, которые обычно автоматом ловит компилятор, все до единого твои ? В том что автокомплит толком не работает даже у таких китов как JetBrains ? Я не спорю, могут быть случаи, когда динамическая типизация полезна. Да в том же моем проекте с сервера приходит объект в формате json, я делаю из него javascript-объект и работаю с ним. Но во-первых код, обрабатывающий связь с сервером у меня процентов 5 по объему. Во-вторых получаемый javascript-объект все равно приходится парсить, ибо что в нем пришло изначально неизвестно. А приходить могут вещи очень нетривиальные, я например на json описываю формы для ввода данных. Получается что язык не имеющий статической типизации ради 5% кода гробит остальные 95. Да и с этими 5% не решает задачу полностью. Ручками работать всё равно приходится. Так в чём смысл ???
Идеален в этом отношении по-моему ActionScript3 в strict-моде. Нужны тебе динамические объекты - объявляй явным образом и пользуйся. Всё остальное статически типизировано. По-моему изначально 100% динамические языки создавались для непрограммистов. Им и правда незачем заморачиваться какой где тип. Тот же javascript изначально предназначался чтобы пару алертов в браузере выкинуть и пару элементов подвигать. Задачи писать на нем что-то серьезное не было. А для этого типы действительно излишни и скорее вредны. Однако когда код достигает хотя бы нескольких сотен строк, положение резко меняется. |
какой-то долбоеб мне ставит минусы и пишет уи. как вычислить пидараса?
|
Цитата:
|
Да нет, приложение самое обычное. Есть база данных. Объекты в ней имеют иерархическую структуру. Например территории, которые сами включают территории. Логически все очень похоже на организацию файловой системы. Поэтому и приложение очень похоже на обычный двухпанельный файловый менеджер (Тотал командер, как наиболее известный, или фар, или mc...) Какие там особые задачи ? Двигать панельки, заполнять их текстом, обрабатывать F1...F12 с соответствующими действиями. Вобщем стандартно. Ну и типы соответствующие. Панелька, менюшка, окошко...Всё очень стандартно. Но как это написать на javascript не поломав при этом мозги - у меня не укладывается в голове. Точнее написать-то конечно написал, но количество мозгофакства и геморроя не идет ни в какое сравнение с таким же проектом на С++ или флеше.
По поводу флеша - увы. Заказчик потребовал именно на javascript ибо приложение предполагалось запускать еще и на айпадах. Если бы я знал во что это выльется, я бы лучше для айпада нативную версию на obj-с написал. Было бы точно быстрее. Вобщем сейчас поставил typescript, буду его копать. Наверняка дело пойдет веселее. |
Object.seal ??? Не слыхал никогда о таком звере ! Спасибо, буду смотреть.
|
Цитата:
|
Приветствую ещё раз, многоуважаемый all, всё теми же словами - "Сами мы не местные" :D
Короче господа. Проект мой разросся примерно до 5К строк. Сдал я его, получил денюшку и на том успокоился. Но вчера написал заказчик и попросил добавить довольно сложную фичу - возможность создавать в базе данных произвольные типы и произвольные связи между типами. Выльется это на клиенте в редактор произвольных форм, причем с довольно специальными свойствами. Но не в том беда, написать напишу. Беда в том, что глянул я на свой код и просто опустились руки. Стало ясным, что зря я с самого начала поленился, не послушался местных гуру и не перевел проект на typescript, пока там была 1000 строк. Теперь стало совершенно очевидным, что на javascript писать дальше нельзя. В связи с этим вопрос многоопытным гуру. Господа-таварисчи ! Никто не сталкивался с переносом существующих больших (несколько тысяч строк) проектов с javascript на typescript ? Если да, опишите примерно, в общих словах, как это делается ? И еще, посоветуйте, что бы такое по typescript почитать, желательно (но не обязательно) на русском ? А то что-то никаких достойных руководств я по нему не нашел. Так, чтобы начать, оно достаточно. Но всерьез работать - нет. P.S. Народ, тот же вопрос для питона. Подскажите, ежели кто на нём что-то серьезное писал. Есть ли для python некая приблудина, типа typescript ? Причем строго для версии 2.7.x ? Я слыхал что вроде для 3.Х доступна такая хрень как аннотации, фактически хоть фейковые, но типы. Но мне на нём в будущем придётся nlpack поднимать. А он увы пока только для 2.Х. |
проще распробовать прелесть динамической типизации,
вы просто не умеете её готовить |
Цитата:
|
по-моему это только твоя привычка, как выяснилось ещё с 80-х
|
Цитата:
5000 строк - это небольшой проект :) Цитата:
|
nerv_, можно с этого места подробнее ? Как по-Вашему нужно проектировать приложения ? Что Вам помогает отслеживать ошибки ? Точнее не ошибки даже, а скорее описки, когда вместо названия поля width Вы написали widht ? При статической типизации выругается компилятор. 100% динамический язык поймет ситуацию так, будто Вы вводите новое поле с названием widht в дополнение к существующему width. Поймите, я не подколки ради спрашиваю. Мне правда очень интересно, как народ работает там, где я чувствую себя со связанными руками. А 5К строк, таки да, согласен. Это немного. На С++ я пишу такое за месяц. Но на js почувствовал что это уже предел.
|
Цитата:
var width = 100; var g = 100 + widht; //Uncaught ReferenceError: widht is not defined |
Цитата:
Цитата:
и это ЗЛО не такое уж и АБСОЛЮТНОЕ, что доказывают миллиарды строк кода, большая популярность и серъезные проекты Цитата:
Цитата:
а вы тестируете свой код? чтобы оценить ваш авторитет, неплохо бы увидеть немного кода из обсуждаемого проекта, скажем строк 300 может это вы пишете на javascript как на fortran :) |
mta88, меня сейчас интересуют именно описки. Ибо если среди всего прочего будут присутствовать и они, вообще слабо себе представляю, как с этим можно работать. В статических языках всё это отсекает компилятор. Как я тестирую свой код ? Хороший вопрос. Ответ - как придется. Ошибки у меня главным образом алгоритмические. Глупые описки не позволяет делать компилятор. Архитектурные вещи как правило решаются на этапе проектирования. Алгоритмы - это да. Поэтому обычно пишу некий связный кусок в несколько методов (не обязательно даже цельный класс). А потом это тестирую на каких-то примерах. Кстати иногда бывает и так, что для тестов приходится писать некий инструментарий и тестировать его самого. Если знаете как тестировать проще - подскажите.
По поводу 300 строк из моего кода - не знаю что Вам это даст. Пишу на jquery+jqueryui. 300 строк решают какую-то достаточно частную задачу. Да, наверняка не оптимально, ибо в js я новичок. Мне бы куда больше хотелось увидеть какой-нибудь Ваш законченный проект на 3-10 тысяч строк. Ибо интересуют не частные задачи, а МЕТОДОЛОГИЯ и АРХИТЕКТУРА. Я в свою очередь обязуюсь выставить на суд публики свой проект, после того как переведу его на typescript. Если народ тут никогда не писал на статических языках, возможно кто-то поймет, насколько оно хорошо и удобно. |
Цитата:
и js у меня в большем авторитете :) и, чувак, ты игнорируешь мои посты ;) |
java vs javascript
и js у меня в большем авторитете и, чувак, ты игнорируешь мои посты =================================== Если не трудно ссылочку дайте плз. Я вобщем-то форум не особо смотрю. Мог и не увидеть. Без обид. Ок ? |
Цитата:
'use strict'; 2. используйте нормальную ide. Они даже цветом выделяют :) |
Цитата:
|
bes, я вот об этом - "java vs javascript".
Как я понял, то ли Вы написали статью, где вдумчиво и со знанием дела сравнивается js с явой, то ли таковая статья где-то существует. Так что если уж я волею судеб оказался на террирории js и судя по всему надолго, хотелось бы что-то на эту тему прочитать. Именно эту ссылочку я у Вас и попросил. |
Цитата:
Цитата:
Цитата:
Цитата:
Цитата:
диагноз понятен походу вы всю жизнь "программировали" в институте на одном языке, который так и не доучили, любите поговить о методологии и архитектуре, хотя их не знаете, а сейчас выбрались в реальный мир и пытаетесь людей учить |
Цитата:
Цитата:
Цитата:
и... можно ваш код посмотреть? |
Цитата:
http://javascript.ru/forum/misc/3793...tml#post260769 Цитата:
не более, мне нравятся оба языка, vs там вклинился только для тебя :) хотя, если подумать, то на х-ра там символьный тип и прочее :) |
Ладно ребят. Как я понял, говорить тут не с кем и не о чем. За совет переходить на typescript огромное спасибо. Действительно спасением оказалось. Пока народ тут флудил, кстати так и не ответив на мой вопрос о методике переноса существующих проектов, я сам такую методику отработал. И дальше продолжу сам. Если у кого-то возникнут вопросы по typescript вообще и по переносу на него существующих проектов в частности (а тонкости там выявились), милости прошу в личку. Чем смогу помогу.
|
Цитата:
|
Цитата:
|
Цитата:
|
Цитата:
jquery глядел конечно. А jqueryui даже немного допиливать для своих нужд пришлось. Что заметил, что во всяком случае визуально они выглядят очень похоже на файлы, порождаемые typescript. Даже подумалось сперва, не на нем ли исходники. Знаю что бред конечно, ибо библиотеки гораздо старше. Но как показатель качества компиляции typescript мне понравилось. |
Цитата:
|
Часовой пояс GMT +3, время: 20:59. |