28.04.2008, 19:05 | #1 |
Участник
|
mfp: What's up with this semicolon?
Источник: http://blogs.msdn.com/mfp/archive/20...semicolon.aspx
============== The most visual idiosyncrasy in X++ is the dangling semicolon separating the variable declarations from the actual code. But why is it there and why is it needed? Best practices in X++ (as in most other modern languages) suggest using TitleCase when declaring (and referring to) types, and using camelCase when declaring variable types. Here is an example of what an X++ developer could write: AccountNum accountNum; ; accountNum = "4000"; As X++ (unlike most other modern languages) is case insensitive, this is what the compiler will see: accountnum accountnum; ; accountnum = "4000"; Suppose the dangling semicolon wasn't there. Then the "accountnum" statement in the second line is ambigious. It could either refer to the type or to the variable. The X++ compiler assumes it is the type, and thus generates a compilation error when encountering the equal (=) sign; as you cannot assign into a type. By inserting the dangling semicolon you instruct the compiler that there will be no more variable declarations; and thus "accoutnum" is a reference to the variable and not the type. If it was made a priority to get rid of dangling semicolons, what could be done?
This morning I have created a package with my findings and sent it to the X++ team for evaluation. This change will not make it into AX 2009; but I'm confident those of us writing X++ code at Microsoft will enjoy this very soon. The rest of you will have to wait for AX6.0. ============== Источник: http://blogs.msdn.com/mfp/archive/20...semicolon.aspx
__________________
Расскажите о новых и интересных блогах по Microsoft Dynamics, напишите личное сообщение администратору. |
|
28.04.2008, 19:49 | #2 |
Участник
|
Цитата:
По-моему, точка с запятой меньшее зло |
|
28.04.2008, 20:45 | #3 |
Axapta
|
Цитата:
А по мне, этот значок делает код более читабельным в любом случае. Особенно когда перед основным кодом идет длинное объявление переменных, да еще и с функциями. Пробегаешься глазами и сразу же видишь начало основного кода. |
|
29.04.2008, 12:09 | #4 |
Участник
|
Лишь бы "висячая" точка с запятой не вызывала ошибки, это действительно удобно (и привычно) для разделения объявлений и кода.
P. S. Более умный компилятор == более медленный?? |
|
29.04.2008, 12:54 | #5 |
Участник
|
можно сделать прагму или свойство объекта для нового case-sensitive синтаксиса
Как например в nemerle сделали с синтаксическими отступами. Тогда можно будет oбъявлять по месту: X++: for (Int i=1; i<=conLen(theContainer); i++) { ... } |
|
29.04.2008, 12:55 | #6 |
Участник
|
>>P. S. Более умный компилятор == более медленный??
Не думаю, что сильно намного |
|
29.04.2008, 15:26 | #7 |
Axapta
|
Пора начинать акцию "Спасем Semicolon!"?
|
|
29.04.2008, 15:57 | #8 |
Участник
|
Я думаю, если так нужен этот костыль, можно изобразить его в виде коммента
|
|
29.04.2008, 16:06 | #9 |
Axapta
|
И попросить всех остальных так делать? Иначе смысла нет. В том-то и прелесть текущей ситуации, что семиколон - почти "обязателен". Я бы официально оформил это как фичу языка X++ и все.
Вот я, например, если правлю какой-то чужой метод, то обычно заодно всегда добавляю туда этот семиколон, если его там нет. В написанным мной методе он всегда присутствет. |
|
05.05.2008, 18:05 | #10 |
Участник
|
Dynamics AX: Bye-Bye X++ Dangling semicolon
Источник: http://dynamics-ax.blogspot.com/2008...semicolon.html
============== Well, if you have done X++ development, and done it for at least over 6 months, at one point in your training or in your X++ development life you have wondered why or why must we use a dangling semicolon to denote the end of our Variable delcarations? And why can't we declare variables throughout the code as needed. Well for the longest we have just had to put up with it, but over at MFP's Two Cent's blog we have an answer and solution (in DAX 6.0 release) so that come DAX 6.0 we should no longer have to have the dangling ; (semicolon). Check out the direct link here: What's up with this semicolon? I know this is not a Major development, but it is for sure note worthy! Check back soon!Find a job at: DynamicsAXJobs.com, also post a job for only $99.00! ============== Источник: http://dynamics-ax.blogspot.com/2008...semicolon.html
__________________
Расскажите о новых и интересных блогах по Microsoft Dynamics, напишите личное сообщение администратору. |
|
05.05.2008, 18:59 | #11 |
Участник
|
Я вот что-то читаю и возмущаюсь.
Неужели это вообще проблема? Неужели объяснение, почему ее необходимо добавлять - такое сложное? Как будто это какое-то скрытое знание, дающееся только единицам |
|
05.05.2008, 19:12 | #12 |
Участник
|
Если честно, то да.
Тем, кто привык к другим языкам программирования очень трудно объяснить, что имя переменной может совпадать с именем класса. Это все равно как объяснять русскому бухгалтеру, что двойная запись и коресспонденция - разные вещи и что можно работать без корреспонденции... Это все равно что русскому объяснить про определенные и неопределенные артикли. В принципе понятно. Но... |
|
06.05.2008, 10:40 | #13 |
Участник
|
М-да.. Нашли серьёзную проблему для исправлений.
2 mazzy: Насчёт бухгалтера ты прав. Но программеры очень легко нюансы программирования понимают. И такие мелочи, как точка с запятой, совпадение имён типов и переменных, смешные ограничения Query.... достаточно один раз сказать, чтобы больше ошибок не повторялось. С бухгалтерами часто клиника |
|
06.05.2008, 11:18 | #14 |
Участник
|
Цитата:
Сообщение от Blog bot
The most visual idiosyncrasy in X++ is the dangling semicolon separating the variable declarations from the actual code. If it was made a priority to get rid of dangling semicolons, what could be done?
А по мне так лучше было бы сделать X++ регистрозависимым как та же Java, которая вроде как вдохновила некогда праотцов из Дамгаарда. Это еще почему? С точки зрения поддержки старого кода, косячно-корявого в плане регистрозависимости и соблюдения Best Practices? Дык, натравить на него один раз beautifier, а потом - руки отрубать (образно говоря, т.е. компилить код с ошибками) неряшливым кодерам, пришедшим из бейсика, которым по барабану и Best Practices, и рЕгисТР БУкв Собственно, Понтоппидан лукавит, говоря об автоматическом "причесывателе" кода как о неком мифическом существе. Смотрим в Best Practices (давнишний, еще от 3-шки), раздел «X++ layout», подраздел «Upper/lower case»: Цитата:
Так что в плане перевода Х++ в регистрозависимые языки нужна по большому счету лишь политическая воля - вместо желания "прославиться в AX-сообществе". Цитата:
Мне кажется, гораздо больше времени в ходе компиляции занимают проверки Best Practices, чем собственно создание байт-кода. Тем более, при нынешних мощностях серверов и рабочих станций разработчиков время компиляции того же кода приложения вряд ли может на что-то существенно повлиять. А по мне - лучше бы докрутили среду разработки до уровня VS, где редактор понимает, где тип, а где переменная типа, и подсвечивает их по-разному. Тогда и "костыли" в виде висячей точки с запятой не понадобятся... |
|
06.05.2008, 11:35 | #15 |
Участник
|
Присоединяюсь обеими лапами! Часто анализирую чужой код, так часто мозги сломаешь, пока поймёшь, что же хотел написать автор. А уж ошибки типа вместо метода переменная одноимённая (забыли скобки), или вместо параметра переменная (подчерк забыли) - искать замучаешься вручную, а с подсветкой это было бы на порядок легче.
|
|
06.05.2008, 11:56 | #16 |
Участник
|
Этим своим решением по поводу того, что типы и переменные могут совпадать, авторы X++ закрыли кучу возможностей:
- использование использование типов как значений (вместо tableNum FieldNum - просто названия таблиц) - объявления по месту первого использования - использвание имен функций как константы |
|
06.05.2008, 13:09 | #17 |
Участник
|
Цитата:
По мне - лучше бы выполнили свои обещания в следующих версиях и перевели среду разработки в VS. Тогда бы и отладчик был бы нормальный. Цитата:
Но мне кажется, что отказ от того что было пирведет к большему злу в виде несовместимости со старым кодом. |
|
06.05.2008, 13:11 | #18 |
Участник
|
Функции tablenum()/fieldnum() возвращают значения вполне определенного типа TableId/FieldId, соответственно. Если бы можно было использовать типы как значения, то все равно для возможности параметризации ряда выражений пришлось бы ввести какие-то типы для таблицы и поля, и все опять вернулось бы к использованию неких функций, возвращающих значения таких типов для таблиц и полей.
|
|
06.05.2008, 13:40 | #19 |
Участник
|
Цитата:
Ну еще условные точки останова не поддерживает (но это скорее заморочки того же ядра) да содержимое некоторых контейнерных типов показывает неинформативно. А в остальном - отладчик как отладчик... PS. К слову, о "нормальных" отладчиках... Недавно в своей программулине на C# боролся с косяком, связанным с маршаллингом параметров вызываемой unsafe-функции. Отладчик VS честно показывал исключение, мол, код обратился к такому-то адресу в памяти, который не может быть прочитан, но разобраться в причине не предоставлял никакой возможности. Пришлось прибегнуть к старому доброму OllyDbg, в котором причина выяснилась за 5 минут. Последний раз редактировалось gl00mie; 06.05.2008 в 13:44. |
|
06.05.2008, 14:01 | #20 |
Участник
|
Цитата:
Сказано "докрутить" - будут докручивать, вместо... Нет условных точек останова. Приходится выкручиваться http://forum.mazzy.ru/index.php?showtopic=1926 Цитата:
И не только контейнеров. Экземпляры системных классов никак не показываются. С длинными строками фиг разберешся. Постоянно вылетает при просмотре Memo полей. |
|