|
26.09.2012, 12:11 | #1 |
Administrator
|
Удобство чтения кода - залог и определенная гарантия его работоспособности
Сообщения выделены из темы добавить поле в dialog класса //oip
Мысль интересная, но обычно все пытаются облегчить написание кода или процесс его вливания в общее приложение, но никто обычно не задумывается про удобство чтения кода (тут конечно нет, но когда макросами заменяют целые выражения типа метода find или еще как-то - то вопрос возникает). А между прочим - удобство чтения кода - залог и определенная гарантия его работоспособности.
__________________
Возможно сделать все. Вопрос времени |
|
|
За это сообщение автора поблагодарили: mazzy (2). |
26.09.2012, 12:59 | #2 |
Axapta
|
Цитата:
Сообщение от sukhanchik
Мысль интересная, но обычно все пытаются облегчить написание кода или процесс его вливания в общее приложение, но никто обычно не задумывается про удобство чтения кода (тут конечно нет, но когда макросами заменяют целые выражения типа метода find или еще как-то - то вопрос возникает).
А между прочим - удобство чтения кода - залог и определенная гарантия его работоспособности. X++: ... #localmacro.attrFilter %1 #endMacro ... #localmacro.table tableMapping=new IntegrTableMapping_Master(tableNum(#tableName), '%1'); ret.add(tableMapping,'%2'); #endmacro #localmacro.field tableMapping.add( new IntegrFieldMapping( #attrFilter(IntegrTableFieldAttribute::construct( tableNum(#tableName), fieldNum(#tableName, %1) )) ) ); #endmacro #localmacro.GUIDField tableMapping.add( new IntegrFieldMapping_Guid( #attrFilter(IntegrTableFieldAttribute::construct( tableNum(#tableName), fieldNum(#tableName, %1) )) , tableNum(%2), fieldNum(%2, %3) #ifnot.empty(%4), %4 #endif ) ); #endmacro // ... // еще десяток подобных макросов на все случаи жизни, но зато дальше весь код был "простой и удобный" :) // ... #define.tableName(InventJournalTable) #table(inventJournalTable) #field(GUID) #field(journalId) #field(JournalType) #field(JournalNameId) #field(JournalDate) #GUIDField(fromInventLocation, InventLocation, inventLocationID) #GUIDField(toInventLocation, InventLocation, inventLocationID) #method(department) //... |
|
|
За это сообщение автора поблагодарили: BOAL (2), sukhanchik (2), lev (2), ViV (1). |
26.09.2012, 15:16 | #3 |
Участник
|
Цитата:
Я как-то еще раз поэксперименторовал с массивным применением макросов (такая была задача) в принципе помню, что один раз была труднопонимаемая ошибка компиляции, но зато код было легко модифицировать. Правда, в продакшен ушла безмакросовая версия (у меня был лексер X++ макросов на регекспах, сделанный для другой задачи - я его чуть чуть допилил). В следующий раз подумаю о кодогенерации с сохранением результата в виде исходников. |
|
26.09.2012, 15:27 | #4 |
Administrator
|
Тут такая ситуация. Главная проблема любой замены кода макросом является тот факт, что это сделано не повсеместно в системе. Не секрет, что чем больше разных "стилей" программирования встречается - тем сложнее читать код.
Т.е. приходит новый человек, строит перекрестные ссылки и видит .... такую конструкцию с макросами. Как минимум - ему к этой конструкции привыкать придется и к идеологии, которую заложил автор. Причем - далеко не факт, что: - автор везде ей следовал - автор переписал (как минимум) весь код в окрестностях исследуемого кода, чтобы глаз "наметался" на использование макросов. Кто против использования макросов? Я против? Я только за - но при этом за принцип - "пусть безобразно, но единообразно". Пусть автоматизация написания кода будет заключаться в том, что после написания макросов - работает лексер на Х++. Но после чтения кода - у нового специалиста (который может быть совсем не новым, но просто "свежепришедшем") будет возможность читать привычный код, написанный боле-менее едином стиле. И отладчик будет стоять на строке кода, какая бы она не была, а не понятно на чем в случае макроса (согласен на допилку отладчика )
__________________
Возможно сделать все. Вопрос времени |
|
26.09.2012, 15:30 | #5 |
Участник
|
Цитата:
Сообщение от sukhanchik
Т.е. приходит новый человек, строит перекрестные ссылки и видит .... такую конструкцию с макросами. Как минимум - ему к этой конструкции привыкать придется и к идеологии, которую заложил автор. Причем - далеко не факт, что:
- автор везде ей следовал - автор переписал (как минимум) весь код в окрестностях исследуемого кода, чтобы глаз "наметался" на использование макросов. |
|
26.09.2012, 15:37 | #6 |
Administrator
|
А какую фразу проще прочитать:
"Вч. я н. чит. аксф." или "Вчера я начал читать аксфорум"? Та, которая короткая, или та, которая длинная? А теперь представим себе книгу (код подобен книге). Если все предложения в книге представлены в сокращенном виде и, соответственно, в полном. Те, кто привык к сокращениям / аббревиатурам (н = начать, Вч = вчера) - уже совершенно спокойно могут читать книгу. А остальные нет. В каком-то смысле можно провести такую же параллель между языками. Кто-то свободно читает на английском и русском, а кого-то чтение на английском языке сильно напрягает (я уж не сравниваю аналогичным образом другие языки) Опять-таки - вопрос отладки. В тех случаях - когда замена макросом усложняет процесс отладки (=проверки орфографии) - очень сложно отлаживать
__________________
Возможно сделать все. Вопрос времени Последний раз редактировалось sukhanchik; 26.09.2012 в 15:39. |
|
|
За это сообщение автора поблагодарили: macklakov (2). |
26.09.2012, 15:43 | #7 |
Ищущий знания...
|
При всем моем уважении, сам факт наличия метода с 1000+ строк - это уже "удовольствие для прочтения"....
З.Ы. а вообще конечно что бы понять идею, которую предполагал разработчик, и причины, по которым было так сделано, нужно посмотреть целиком метод (а лучше весь объект, где написан этот код). Очень похоже, что просто много раз выполняется инициализация одного и того же объекта, и что бы много раз не писать один и тот же код, были использованы макросы...
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с) С Уважением, Елизаров Артем |
|
26.09.2012, 15:50 | #8 |
Axapta
|
Цитата:
Вернуть this из класса Ты красиво макросами запрограммировал механизм интеграции. Добавить новую таблицу в механизм - да, просто и удобно. А вот поменять при необходимости сам "движок"... Я видел, как каждый новый разработчик на проекте тратил время чтобы понять, что тут и как работает. Брейкпоинты и перекрестные ссылки - тоже были проблемой. И точно помню, что после того, как алгоритм интеграции немного поменялся, модифицировать его было совсем не хорошо. Не, я конечно допускаю, что мне тогда просто квалификации не хватало (а это было 6+ лет назад), чтобы быстро разобраться, но мне и сейчас не нравится разбираться в способе написания кода, а не в самом коде. Я хочу чтобы код в системе был по возможности написан в едином стиле. lev, 1000+ строк - это по большей части перечисление таблиц и полей для выгрузки. P.S. Наверное зря я все это начал. Максим, извини. |
|
26.09.2012, 16:14 | #9 |
Участник
|
Макросами, насколько я помню, был сделан только один меппинг между таблицами аксапты и таблицами промежуточной базы.
Цитата:
Цитата:
И точно помню, что после того, как алгоритм интеграции немного поменялся, модифицировать его было совсем не хорошо.
Цитата:
Было ли это из за макросов или из-за классов? Какое изменение и почему не влезло? |
|
26.09.2012, 16:34 | #10 |
Axapta
|
Цитата:
Цитата:
Цитата:
Может ну его, это обсуждение? А то о чем речь до конца понимаем только мы с тобой. Я уже сто раз пожалел, что начал. |
|
28.09.2012, 09:41 | #11 |
Участник
|
>>>если код "мутный", а модифицировать его нужно, то код такой трут
Что-ж там такого мутного во флюэнт интерфейсах, например - основная идея проста как три копейки - это вам не монадический комбинатор какой-нибудь. По мне, так код мутный, когда есть три куска котогрые на первый взгляд не отличаются, а там на самом деле в одном плюс в другом минус, а в третьем поле пропущено (причем это и есть ошибка, так как при обновлении первых двух кусков забыли обносить третий). У меня раз в нескольо месяцев посещает мысль, что неплохо бы сделать плагин, который по двум выделенным кускам кода показывает, чем же они различаются все таки. |
|
28.09.2012, 10:11 | #12 |
Сам.AX
|
По поводу поиска отличия в исходниках, пробовали Araxis Merge?
Если да, то чем он не устроил?
__________________
"Считать метафору доказательством, поток праздных слов источником истины, а себя оракулом - это заблуждение, свойственное всем нам." Поль Валери |
|
28.09.2012, 10:15 | #13 |
Участник
|
Цитата:
Сообщение от driller
По поводу поиска отличия в исходниках, пробовали Araxis Merge?
Если да, то чем он не устроил? Ну я имел ввиду чтобы вместо - создать два файла - добавить туда два уска кода - вызвать мёрож просто выделить два куска и вызвать пункт меню |
|
30.09.2012, 21:58 | #14 |
Участник
|
А я против макросов, и всем их запрещаю, просто потому что отлаживать неудобно, есть разница между просто программированием и бизнес-программированием, в аксе нет понятия "это мой код", он должен читаться как книга.
|
|
|
За это сообщение автора поблагодарили: macklakov (3), lev (2), oip (1). |
01.10.2012, 07:37 | #15 |
северный Будда
|
Цитата:
нужно соблюдать принцип разумной достаточности, а не бросаться в крайности
__________________
С уважением, Вячеслав |
|
|
За это сообщение автора поблагодарили: lev (2). |
01.10.2012, 09:45 | #16 |
Сенбернар
|
Пять копеек:
- налицо уход от темы, КМК. Макросы - это, конечно, здорово, "принцип разумной достаточности" при их применении - безусловно, должен соблюдаться. И InventDimJoin и код, построенный целиком на макросах, приведенный выше, безусловно, все же разные вещи , но речь изначально была не о том. - "Программы пишутся для людей" (откуда? ). В этом смысле код, написанный "в стиле системы", безусловно, предпочтителен. Как в армии - "безобразно, но единообразно". Иначе (в пределе) получается вариант бессмертных "лебедя, рака и щуки". - В принципе, все уже сказано в заголовке темы. Думаю, мало кому захочется это оспаривать, и еще меньше тех, у кого это получится.
__________________
Best Regards, Roman |
|
01.10.2012, 10:19 | #17 |
Участник
|
Его легко переделать на query, динамически собираемый в коде, просто кто-то один раз связался с этой конструкцией и тащится она с 2.5-й версии
|
|
|
За это сообщение автора поблагодарили: sukhanchik (2). |
01.10.2012, 11:35 | #18 |
северный Будда
|
Цитата:
да и нет смысла писать отдельный Query для ситуации, в которой тридцать раз до тебя уже использовали макрос (это к слову о единообразии).
__________________
С уважением, Вячеслав |
|
01.10.2012, 12:32 | #19 |
Участник
|
Если в этом запросе должна была быть другая табличная переменная для InventDim, а InventDim тоже есть но используется в другом месте, а кто-то по привычке зафигачил в запрос #InventDimJoin, то результат представить не трудно. Причем замучаетесь искать, в чем проблема. Так что макросы лучше только для констант использовать.
|
|
01.10.2012, 13:25 | #20 |
Участник
|
Цитата:
Сообщение от Zabr
Если в этом запросе должна была быть другая табличная переменная для InventDim, а InventDim тоже есть но используется в другом месте, а кто-то по привычке зафигачил в запрос #InventDimJoin, то результат представить не трудно. Причем замучаетесь искать, в чем проблема. Так что макросы лучше только для констант использовать.
|
|
|
|