Основы менеджмента кода в 1С

0. keleg 322 17.10.08 10:26 Сейчас в теме
Продолжаем тему рефакторинга, начатую на примере "Глокой Куздры"
Итак, каковы основные принципы поддержания кода в рабочем состоянии?

Перейти к публикации

Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
68. 18.10.08 01:41 Сейчас в теме
Можно распарсить код, выделить из него вызовы процедур и составить карту вызовов процедур - какая процедура какие вызывает.
Довольно полезная информация.
69. Шухер 23 18.10.08 13:24 Сейчас в теме
(68) Пустое, никакой пользы от той карты.
Хм, даже воображения не хватает, как она может выглядеть-то, чтобы стать "довольно полезной".
71. Трактор 1200 18.10.08 17:15 Сейчас в теме
Плюс. Напоминание о необходимости культурно кодить. Ещё бы 1С следовало этим и своим рекомендациям. Напоминание совсем не лишнее, но подходить нужно с головой.
Недавно судьба принудила меня разбираться в коде регламентного отчёта. 1С назвала переменную как-то так "НДСвходящий", а хранился в ней НДС реализации. Благо в этом модуле в принципе не может быть входящего НДС. Разобрался. Но осадочек остался.
75. Abadonna 3859 19.10.08 09:07 Сейчас в теме
(71)>1С назвала переменную как-то так "НДСвходящий", а хранился в ней НДС реализации.
Просто коды реализации (на самом языке 1С) пишут у них полуграмотные студенты.
Пример: справочник "ДоговорА" просуществовал несколько лет, пока кто-то нормальный не переделал
в "Договоры". А уж парсинг строки с запятыми у них ваще отпад
72. Шёпот теней 1768 18.10.08 23:14 Сейчас в теме
Повторюсь, как дополнение, в поддержку автора статьи:

10 строк кода может написать каждый
100 строк кода может написать упорный
1000 строк кода может написать талант
10 000 строк кода может написать гений
П.С. некоторым читать как "... строк неповторяющегося кода может написать гений

закон программирования - в 10 строках кода есть хотя бы одна ошибка...

вывод: оформляя каждые 10 строк в отдельную процедуру можно повысить не только читаемость программы но и сократить время поиска ошибки... хотя, конечно, не всё так однозначно но тем не менее

воо-ООО-оот тАкОе есть мнение...
73. Шёпот теней 1768 18.10.08 23:19 Сейчас в теме
keleg - вам книги писать надо ... вот бы дело было... читаемо, кратко, понятно, доходчиво... да, вы талант, однако...

Удачи во всем!

Вооот такое ... Вам пожелание....
76. keleg 322 19.10.08 18:39 Сейчас в теме
(73) Спасибо! Может быть, я до этого и дорасту :-) Но пока мечтаю написать книгу разве что по связи философии, религии и науки.
(75) 1С-конфигурации ОЧЕНЬ улучшились за последний год. Они научились!
Но вот рефакторинг стандарных конфигураций без объектного программирования (а конкретно - без полиморфизма, который позволяет переопределять код) очень трудоемок для нас с вами. Стоить рефакторить хорошенько версию, как обновление на нее хоть чуть переписанной франчами конфигурации становится невозможным :-( Такое было, например, в УТ 10.3.4.
(67) Я умею программировать. Не на 1с, вообще. Программирование - это описание предметной области на строго формализованном языке. 7ку я не обзываю, она очень и очень сильная среда, именно благодаря своей изученности, отработанности и расширяемости. Но она в ближайшее время умрет, т.к. 8ка сейчас достигла практически такой же степени отработанности и изученности (эх, расширяемость бы :-) но она масштабируется на два порядка лучше, а это для систем управления один из самых главных показателей.

А вообще моя позиция проста - 1с-никам хорошо бы оставить кесарю-кесарево, сделать порт языка 1С для .net и сосредоточиться на написании конфигураций, и методологии, где они действительно уже очень сильны. Сэкономили бы и время, и силы :-)
Причем это даже не очень сложно сделать :-)
80. Vitek 20.10.08 09:02 Сейчас в теме
(76)>сделать порт языка 1С для .net и сосредоточиться на написании конфигураций, и методологии, где они действительно уже очень сильны.

Есть ведь подобные штуки. Gepard с мисты вроде этим занимается.
74. AVARY 174 18.10.08 23:54 Сейчас в теме
Перечитал статью повнимательнее и задаюсь вопросом: "Почему, при наведении на слово "здесь" в последнем предложении третьего абзаца, оно не наливается красным цветом, не появляется подчеркивание и курсор мыша не меняет своей формы?".
77. CheBurator 19.10.08 20:54 Сейчас в теме
> Причем это даже не очень сложно сделать :-)
угумс.. кто же тебе будет методики продавать, которые бабло прносят? продавать будут РЕЗУЛЬТАТЫ использования методики...
79. artbear 1186 20.10.08 08:38 Сейчас в теме
(78+) Забыл КонецПроцедуры в п.3 дописать :)
90. Vitek 20.10.08 11:50 Сейчас в теме
Да кстати, можешь хоть заминусоваться, хоть на говно изойтись. Мне ты хуже не сделаешь.

З.Ы. у всех остальных, особенно автора, прошу прощения за срач.
99. Altair777 640 20.10.08 14:29 Сейчас в теме
И, кстати, снова по поводу количества строк

Код
Процедура Права()
   Перем Зн;
   Если ПустоеЗначение(ТекущийЭлемент())=1 Тогда
      Предупреждение("Не выбран Пользователь");
      Возврат;
   КонецЕсли;
   Если спДействийПрава.ВыбратьЗначение(Зн,,,,1) = 0 Тогда      
      Возврат;
   КонецЕсли;
   Если Зн="ДляПользователя" Тогда
      Если _СпрПользователи.Выбрать("Выберите Пользователя","КД")=1 Тогда
         _КД_КопироватьПрава(ТекущийЭлемент(),_СпрПользователи.ТекущийЭлемент());
      КонецЕсли;
   ИначеЕсли Зн="ДляРоли" Тогда
      Если _СпрРоли.Выбрать("Выберите Роль","ФормаСписка")=1 Тогда
         _КД_КопироватьПрава(ТекущийЭлемент(),_СпрРоли.ТекущийЭлемент());
      КонецЕсли;
   ИначеЕсли Зн="ИзПользователя" Тогда
      Если _СпрПользователи.Выбрать("Выберите Пользователя","КД")=1 Тогда
         _КД_КопироватьПрава(_СпрПользователи.ТекущийЭлемент(),ТекущийЭлемент());
      КонецЕсли;
   ИначеЕсли Зн="ИзРоли" Тогда
      Если _СпрРоли.Выбрать("Выберите Роль","ФормаСписка")=1 Тогда
         _КД_КопироватьПрава(_СпрРоли.ТекущийЭлемент(),ТекущийЭлемент());
      КонецЕсли;
   КонецЕсли;
КонецПроцедуры   // Права
Показать полностью


На сколько процедур нужно разбить? На 2 или 3? Подскажите как :-)
101. Душелов 3916 20.10.08 15:06 Сейчас в теме
(99) Хотя бы так ;)
Код
Процедура Права()
   Перем Зн;
   Если ПустоеЗначение(ТекущийЭлемент())=1 Тогда
      Предупреждение("Не выбран Пользователь");
      Возврат;
   КонецЕсли;
   Если спДействийПрава.ВыбратьЗначение(Зн,,,,1) = 0 Тогда      
      Возврат;
   КонецЕсли;
            КопироватьПрава(Зн);
КонецПроцедуры   // Права

Процедура КопироватьПрава(Зн)
   Если Зн="ДляПользователя" Тогда
      Если _СпрПользователи.Выбрать("Выберите Пользователя","КД")=1 Тогда
         _КД_КопироватьПрава(ТекущийЭлемент(),_СпрПользователи.ТекущийЭлемент());
      КонецЕсли;
   ИначеЕсли Зн="ДляРоли" Тогда
      Если _СпрРоли.Выбрать("Выберите Роль","ФормаСписка")=1 Тогда
         _КД_КопироватьПрава(ТекущийЭлемент(),_СпрРоли.ТекущийЭлемент());
      КонецЕсли;
   ИначеЕсли Зн="ИзПользователя" Тогда
      Если _СпрПользователи.Выбрать("Выберите Пользователя","КД")=1 Тогда
         _КД_КопироватьПрава(_СпрПользователи.ТекущийЭлемент(),ТекущийЭлемент());
      КонецЕсли;
   ИначеЕсли Зн="ИзРоли" Тогда
      Если _СпрРоли.Выбрать("Выберите Роль","ФормаСписка")=1 Тогда
         _КД_КопироватьПрава(_СпрРоли.ТекущийЭлемент(),ТекущийЭлемент());
      КонецЕсли;
   КонецЕсли;
КонецПроцедуры
Показать полностью
103. Altair777 640 20.10.08 19:38 Сейчас в теме
(101) т.е. каждый элемент структуры языка выделять в отдельную процедуру или функцию? :-)
Тогда процедуру Права() из (101) нужно переделать
Код
Функция _ПроверкаНаПустоеЗначение(ЧтоПроверяем) Экспорт
   Если ПустоеЗначение(ЧтоПроверяем)=1 Тогда
      Возврат 1;
   Иначе
      Возврат 0;
   КонецЕсли;
КонецФункции //_ПроверкаНаПустоеЗначение

Функция _ПроверкаВыбораЗначения(ОткудаВыбираем, ЧтоВыбрали) Экспорт
   //Лень писать, т.к. конфигуратора нет под рукой, пишу на коленке :-)
КонецФункции //_ПроверкаВыбораЗначения

Функция ПроверкаВыбораЭлементовДляКопирования(спДействийПрава, Зн)
   Перем флагВозврата;
   флагВозврата=1;
   Если _ПроверкаНаПустоеЗначение(ТекущийЭлемент())=1 Тогда
      Предупреждение("Не выбран Пользователь");
      флагВозврата=0;
   КонецЕсли;
   Если _ПроверкаВыбораЗначения(спДействийПрава,Зн) = 0 Тогда      
      флагВозврата=0;
   КонецЕсли;
   Возврат флагВозврата;
КонецФункции   // ПроверкаВыбораЭлементовДляКопирования

Процедура Права()
   Перем Зн;
   Если ПроверкаВыбораЭлементовДляКопирования(Зн)=1
      КопироватьПрава(Зн);
   КонецЕсли;
КонецПроцедуры   // Права
Показать полностью
105. artbear 1186 21.10.08 08:59 Сейчас в теме
(103) Вот как раз ты сделал извращенно :(, в итоге все стало очень нечитабельно
.
1. Например, код ПроверкаВыбораЭлементовДляКопирования ты сделал очень запутанным
Есть простой рефакторинг избавления от результирующих переменных типа флагВозврата
[code]Функция ПроверкаВыбораЭлементовДляКопирования(спДействийПрава, Зн)
Если _ПроверкаНаПустоеЗначение(ТекущийЭлемент())=1 Тогда
Предупреждение("Не выбран Пользователь");
Возврат 0;
КонецЕсли;
Если _ПроверкаВыбораЗначения(спДействийПрава,Зн) = 0 Тогда
Возврат 0;
КонецЕсли;
Возврат 1;
КонецФункции[code]
.
2. Метод _ПроверкаНаПустоеЗначение здесь явно не нужен, т.к. он 100% аналогичен встроенному ПустоеЗначение. Этот метод был бы нужен, если бы был какой-то явный функционал или название встроенного метода не отображало его смысл :)
.
3. Метод _ПроверкаВыбораЗначения назван очень плохо, на самом деле он же не только проверяет, но сначала выбирает значение, а уж затем проверяет.
Если уж хочешь выделить его явно, называй правильно - ВыборЗначенияИзСписка или ВыборЗначенияИзСписка и определяй как функцию, возвращающую результат успеха/неуспеха.
Опять же, если он вырождается, как в п.2, во встроенный аналог, он фактически не нужен.
.
4. Вот единственное, что ты сделал верно :) - это выделение отдельной функции ПроверкаВыбораЭлементовДляКопирования, хотя ее название также не очень :) ИМХО лучше и проще функция ВыборЭлементовДляКопирования.
.
Вот и получается, что даже на этом простом примере можно увидеть несколько полезных приемом рефакторинга -
избавление от временной результирующей переменной;
избавление от ненужных, вырожденных функций;
задание правильных смысловых наименований для методов;
выделение функции;
104. Altair777 640 20.10.08 19:41 Сейчас в теме
+103 Читаемость кода выросла? :-)
106. artbear 1186 21.10.08 09:01 Сейчас в теме
(105+) Код из п.1 не получился :), исправляю
Код
Функция ВыборЭлементовДляКопирования(спДействийПрава, Зн)
  Если _ПроверкаНаПустоеЗначение(ТекущийЭлемент())=1 Тогда
    Предупреждение("Не выбран Пользователь");
    Возврат 0;
  КонецЕсли;
  Если _ПроверкаВыбораЗначения(спДействийПрава,Зн) = 0 Тогда 
    Возврат 0;
  КонецЕсли;

  Возврат 1;
КонецФункции
Показать полностью
107. Uscolegy 21.10.08 09:06 Сейчас в теме
не совсем согласен с автором. увелечение количества функций ведет к усложнению понимания кода. когда при отладке проваливаешься в ****цатую функцию уже забываешь зачем сюда шел. Функции должны быть разделены на логически самостоятельные блоки, а не крошить код на 10 строчек в функцию. И еще: код должен быть понятен на алгоритмическом языке, а не на человечьем.
Altair777; +1 Ответить
108. JohnyDeath 297 21.10.08 09:30 Сейчас в теме
(107) ИМХО, как раз-таки при отладке всё это дело очень упрощает жизнь: если видишь по названию ф-ии, что она делает, то ты либо входишь в неё, либо прагаешь дальше.
Vitek; artbear; +2 Ответить
109. Altair777 640 21.10.08 09:55 Сейчас в теме
(108) сначала входишь... потом выходишь... и еще прыгаешь как Фигаро туда-сюда :-)
И не забывайте о быстродействии. Если память мне не изменяет, вызов процедуры ощутимо сказывается на процессорном времени.
115. JohnyDeath 297 21.10.08 11:31 Сейчас в теме
(109) сначала входишь... потом выходишь... и еще прыгаешь как Фигаро туда-сюда :-)
Ну вот допустим ты знаешь, что у тебя какой-то косяк происходит при выводе результатов на печать.
Есть моя процедура:
Код
 Процедура Тест()
СборДанных();
СверткаДанныхПоПравилам();
ВыводНаПечать(); 
Показать полностью

Нахрена ты будешь влазить в "СборДанных" и "СверткаДанныхПоПравилам" ??
А в твоём случае всё было бы в одной процедуре и там надо было бы усиленно работать коёсиком, чтобы добраться до нужного тебе куска кода в процедуре "Тест"
117. Uscolegy 21.10.08 11:53 Сейчас в теме
(115) сначало придеться локализовать твою ошибку. в какой именно процедуре (это ты знаешь что такое может быть только в процедуре вывода на печать. я это впервые увижу и мне придеться залазить везде чтобы найти где касяк). в любом случае... любая функция это черный ящик, и пока его не откроешь не увидешь что там твориться.

(112) 2-е высказывание: написал код на мильон строк, потом на реальных даных понял что неоптимально...начал менять, оптимизировал одну общую функцию на два документа..в одном стало вызываться оптимизированно, а во втором в принципе тоже побыстрее..только результат стал отличаться от ожидаемого.
120. artbear 1186 21.10.08 12:15 Сейчас в теме
(117) Цитата:
>> в любом случае... любая функция это черный ящик,
>>и пока его не откроешь не увидешь что там твориться.
Вот как раз в этом твое заблуждение :)
В хорошем коде смысл/назначение функции понятен из ее наименования, и не нужно заходить внутрь, чтобы разобраться, как же она работает.
.
Да и вообще схема поиска ошибки в хорошем коде будет немного отличаться: ты уже не заходишь внутрь функции, а просто проверяешь/надеешься на ее результат ее работы. Если результат совпадает с требуемым, значит, все в порядке, и ты анализируешь другой код. Если же нет, значит, ошибка найдена.
Естественно, сначала желательно анализировать работу большой функции/большого куска кода, а уж потом спускаться по коду для точной локализации ошибки.
122. Altair777 640 21.10.08 12:18 Сейчас в теме
(120) > надеешься на ее результат ее работы
см. Законы Мерфи ;-)
127. artbear 1186 21.10.08 12:26 Сейчас в теме
(122) Законы Мерфи исключить легко, их просто не нужно учитывать в работе и проблем не будет :)
.
(124) Так твои куски кода и должны отвечать за свою работу. И если ты не знаешь, как проверить результаты их работы, значит, код у тебя недостаточно хорош :)
.
Я же говорю, возьми какую-нибудь книгу по рефакторингу + по тестированию, многие вопросы, которые мы обсуждаем, там проанализированы. Сам все поймешь :)
125. artbear 1186 21.10.08 12:21 Сейчас в теме
(117) по п.2 из 112.
1. На то и нужны анализ логики при рефакторинге + обязательное тестирование своей работы, желательно автоматизированное тестирование и много тестов.
.
2. Если у тебя каждая функция выполняет только явные блоки, и не выполняет неявные, тогда никаких проблем не будет. Т.е. каждый блок кода должен делать только то, за что он отвечает.
Если один блок кода выполняет разные действия, не связанные с друг другом, значит, это предпосылка к выделению доп. кусков кода, например, в виде функции и т.д.
121. artbear 1186 21.10.08 12:17 Сейчас в теме
По поиску ошибки из (115)
Найти очень легко - нужно просто проверить результаты работы каждого блока, т.е. три функции, не заходя внутрь. Причем этом можно сделать в любом порядке :)
Например, если данные сформированы верно, то, значит, ошибка внутри последнего блока "вывод на печать".
181. krv2k 369 06.12.08 22:42 Сейчас в теме
(109) поддержу
> И не забывайте о быстродействии. Если память мне не изменяет, вызов процедуры ощутимо сказывается на процессорном времени.

Насколько дольше будет выполняться код, подвергшийся такому жёсткому рефакторингу?
182. keleg 322 07.12.08 10:12 Сейчас в теме
(181) Что говорит на эту тему теория оптимизации программ?
То, что не нужно оптимизировать весь код, это приводит к очень большому росту трудоемкости при разработке (в 4-5 раз). Достаточно оптимизировать 20% кода, скорость выполнения которого действительно влияет на конечное быстродействие.
Т.к. все профайлеры ведут учет времени выполнения с точностью до процедуры, то хорошо рефакторенная программа сразу покажет процедуры, написанные неоптимально, над ними и стоит подумать и изменить код. А так как рефакторенная программа хорошо переносит изменения, то и общее быстродействие, и время разработки будет в общем случае меньше, чем у программы, не подвергавшейся рефакторингу.
А конкретно для 1С:
1) Основное время выполнения занимают неоптимальные запросы. Возможности их рефакторинга появились в последних редакциях 8.1, но их обзор выходит за пределы данной статьи.
2) Для 8.1 1С совместно с инженерами Intel довольно здорово оптимировала код, так что потери на вызов процедур минимальны.
Если конкретно - только что провел испытания. 100 000 вызовов функций на моем core2duo 1.8 занимают 2 сек. (Простейший однострочный код выполнялся в функции с передачей и возвратом значения и без нее, считалась разница, без функции 13 сек с функцией - 15сек).
Т.е даже если каждую строчку делать вызовом своей функции получим проигрыш в 15 %. Считайте сами :-)
183. tormozit 5906 07.12.08 11:22 Сейчас в теме
(182) По поводу п.2 все не так уж однозначно. Добавить в функцию еще 5 параметров с передачей по значению и увидишь разницу.
184. keleg 322 07.12.08 12:02 Сейчас в теме
(183)См статью. Функция с 5ю параметрами уже изврат, по правильному их не должно быть больше 3х, иначе - в структуру!
Далее - а зачем передавать по значению и растить стек? Да, так несколько надежнее, но можно быть реалистом, передавать по ссылке но этим не пользоваться и не изменять параметры процедур, предпочитая писать функции.
185. tormozit 5906 07.12.08 12:09 Сейчас в теме
(184) Давай не будем урезать модель интерпретатора и прибегать к опасным приемам программирования. По поводу - 3-х параметров - если серьезно, то я сдаюсь и прекращаю спор.
110. Uscolegy 21.10.08 09:56 Сейчас в теме
(108) Думаю это дело вкуса, но когда начинаешь искать чужие глюки...к примеру оптимизировать код.. чтоб собрать из кучи мелких функций единый алгоритм, достаточно геморно получается.
Но это не значит что надо весь код валить в одну большую функцию и обзывать там переменные типа А, Б, и А1... делить просто надо все логичнее.
111. Душелов 3916 21.10.08 10:02 Сейчас в теме
(110) Для начала надо обпределить, как часто эти процедуры и функции вызываются. Как минимум избавляешься от повторения кода, а дальше все приводится к нормальному удобочитаемому коду, и куча "мелких" функций совершенно не мешает.
112. artbear 1186 21.10.08 10:32 Сейчас в теме
1. Да, повторение кода - это один из главных наши врагов :) и от него нужно постоянно избавляться.
.
2. По оптимизиции/производительности
Основное правило - не нужно преждевременной, пессимистической оптимизации, т.е. пишем хороший код, не слишком пристально думая об его оптимизации. После получения работающего кода можно проанализировать его производительность и уже на основе данных профайлера выполнять работу по оптимизации.
.
3. Как раз когда код хорошо написан, смысл работы функции/процедуры понятен из ее названия, и поэтому не нужно каждый раз в нее заходить в отладчике, а только в том случае, если есть подозрения, что она и неработоспособна.
Как раз в хорошо структурированном коде намного проще искать глюки.
.
4. Тестирование, автоматическое, функциональное, юнит-тестирование очень помогает при различных рефакторингах кода.
При наличии большого числа тестов, проверяющих логику работы, намного спокойнее работать и добавлять/исправлять код.
Т.е. пишем немного кода - провели тестирование - если все работает, идем дальше.
А вот если не работает, причина ошибка сразу ясна - она в том коде, что добавили.
В итоге ошибки исправляются очень легко и быстро.
Т.е. разработка обязательно должна идти через тестирование, и тестирование нужно запускать как можно чаще.
.
В этой истине я сам убедился при работе над проектами ВК 1С++ и ФормЕкс, а также при собственной разработке в 1С.
Тестирование рулит :)
json; fez; Vitek; Душелов; JohnyDeath; +5 Ответить
113. artbear 1186 21.10.08 10:34 Сейчас в теме
(112) Серьезно, разработка становится очень простой при наличии системы тестирования.
Всем рекомендую.
Баги правятся очень легко и быстро.
114. Altair777 640 21.10.08 11:31 Сейчас в теме
Попытаюсь абстрагироваться от количества строк...

Очень меня смущают эти фразы
> Человек с нормальным вниманием (а мы совсем не сверхлюди, хоть и программисты с сертификатами) легко воспринимает 7 объектов или 3 их сочетания.
Уточните, какие именно сочетания? 7 в третьей степени? :-)
А лучше дайте ссылки на первоисточники.

> в двоичной системе сочетания 3 объектов как раз дадут 8 комбинаций, так что это, в общем-то, одна и та же цифра
"сэм-восэм... где-та так..." :-)
И это говорит программист? Который обязан учитывать все нюансы?
И, вообще, какой-то нумерологией веет....

> «Оперативная память» человека имеет объем примерно равный 8 ячейкам памяти
А что помещается в одну ячейку? Слово, фраза или целый роман?
"Факты! Больше фактов!" :-)
Вот, кстати, нашел http://www.4medic.ru/page-id-516.html
"Кратковременная память (КП) ограничена по объему, при однократном предъявлении в КП помещается в среднем 7±2. Это магическая формула памяти человека, т. е. в среднем с одного раза человек может запомнить от 5 до 9 слов, цифр, чисел, фигур, картинок, кусков информации."
Вы учли, что кроме кратковремнной памяти есть еще "долговременная, оперативная, промежуточная память"?
А автор перепутал КП и "оперативку" :-)

Лично у меня складываеся впечатление, что Вы вполуха смотрели передачу на Дискавери, а теперь по памяти (какой? :D)излагаете.. в своей интерпретации :-)
116. Altair777 640 21.10.08 11:49 Сейчас в теме
Какой именно "косяк"? Ошибка времени выполнения или не те данные выводит?
А, может, нужно везде полазить? :-)
А через год Вы не забудете что после свертки куда попадет и что именно сворачивается?
И не колесиком придется плавно перемещаться и восстанавливать в памяти логику, а метаться как головки на ИДЕшных винтах при работе с базами данных в многопользовательском приложении :-)

Еще раз повторяю - я не против использование процедур и функций. смотрите мой коммент 20...


20. Altair777 17.10.2008

Ставлю плюсик, хотя не со всеми утверждениями согласен.
Например, > Блок кода длиннее 7-10 строчек должен оформляться в отдельную процедуру или функцию
Это, наоборот, может привести к трудночитаемости кода и, как следствие, к ошибкам.
Я бы переформулировал бы.
Блок кода, выполняющий более N-ого количества действий, должен оформляться в отдельную процедуру или функцию
118. JohnyDeath 297 21.10.08 11:54 Сейчас в теме
(116) "косяк"=(в данном случае, например) подхватывает не ту таблицу-шаблон, не присоединяет ещё одну секцию, пишет в расшифровку что-то не то....

Вот ты вроде бы со всеми согласен, а всё равно споришь. ;)
119. Altair777 640 21.10.08 12:15 Сейчас в теме
(118)
> пишет в расшифровку что-то не то
это не то взялось после первых двух процедур? )))
123. JohnyDeath 297 21.10.08 12:20 Сейчас в теме
(119) ты уже к словам начинаешь придираться.
Нет, не из первых 2-х процедур. Я расшифровку устанавливаю/не устанавливаю для каждой ячейки непосредственно перед её выводом. Если в значении всё нормально, а в расшифровке косяк - это явно говорит о том, что сначала надо посмотреть место, где она устанавливается.
126. Altair777 640 21.10.08 12:25 Сейчас в теме
(123) Я не придираюсь, упаси Бог...
> Я расшифровку устанавливаю/не устанавливаю для каждой ячейки непосредственно перед её выводом
А что попадет в эту расшифровку? Где и как сформировались данные для рассшифровки?
В самой процедуре вывода на печать? В ее теле или еще в какой-то дополнительной процедуре/функции?
128. JohnyDeath 297 21.10.08 12:28 Сейчас в теме
(126) вот почему-то ты не прикопался к "не присоединяет ещё одну секцию"...
В ее теле или еще в какой-то дополнительной процедуре/функции?
Вполне возможно, что внутри ф-ии стоит вызов ф-ии "УстановитьРасшифровкуЯчейки(ОбластьЯчейки)". ИМХО, не трудно будет найти.
131. Altair777 640 21.10.08 12:36 Сейчас в теме
(128) А в ней еще одна, из 5 строк, причем в одной из них вызывается очередная процедурка...
Они плодятся!!!! ааааааааааааа!!!
:-)

(127) Если это мои куски кода, я их как-то помню
Я их писал, и возможно не один десяток раз использовал в разных конфах. А если чужие куски?
Проверять нужно всё! И прыгать :-)

> Я же говорю, возьми какую-нибудь книгу по рефакторингу + по тестированию, многие вопросы, которые мы обсуждаем, там проанализированы. Сам все поймешь :)

Вразумительного ответа я так и не получил... Тогда нафик эти блоги, комменты? Все дружно го читать книги и сами всё понимать
132. artbear 1186 21.10.08 14:11 Сейчас в теме
(131) Так ты над ответами-то задумывайся все-таки, даже если они тебя не очень устраивают :)
В хорошем коде нет нужды слишком пристально изучать внутреннее строение кода.
.
И вообще мы от построения хорошего кода отклонились в сторону поиска/исправления ошибок в программе, а это интересная, но совершенно другая тема :), которая лишь краем касается данной темы :)
.
Рекомендации насчет книг даю для того, чтобы сам, осознанно, прочитал классиков, поразмыслил над книгой. Все равно мы также хорошо, как они, не сможем преподнести материал :)
После прочтения книг некоторые вопросы для тебе станут яснее, насчет других можно будет уже вести более предметную полемику.
.
Пойми, что я не отсылаю тебя подальше :)
133. JohnyDeath 297 21.10.08 14:12 Сейчас в теме
(131) А в ней еще одна, из 5 строк, причем в одной из них вызывается очередная процедурка...
Они плодятся!!!! ааааааааааааа!!!
:-)

Не понял юмора.

Тогда нафик эти блоги, комменты? Все дружно го читать книги и сами всё понимать
ну если б все читали, то конечно нафиг не нужны. А тут тебе дают на одной страничке всё. Не надо целую книгу читать! ;)
124. Altair777 640 21.10.08 12:21 Сейчас в теме
> Найти очень легко - нужно просто проверить результаты работы каждого блока, т.е. три функции, не заходя внутрь.
> Например, если данные сформированы верно,
А как узнать что они сформированы верно? На печать выводиться не то, внутрь мы не заглядываем....
129. artbear 1186 21.10.08 12:31 Сейчас в теме
По тестированию отличная базовая книга
Автор Кент Бек
"Экстремальное программирование: разработка через тестирование"
В электронном виде найди здесь http://www.proklondike.com
.
В ней описаны как назначение, плюсы и минусы тестирование, так и сами приемы тестирования + построение своей системы тестирования.
.
На базе этой книги нами, например, были созданы системы юнит-тестирования 1С на базе ВК 1С++ и ее классов.
130. artbear 1186 21.10.08 12:32 Сейчас в теме
(129) + системы юнит-тестирования самих ВК 1С++ и ФормЕкс.
140. Altair777 640 21.10.08 15:27 Сейчас в теме
+139
Предложение было разделено на 2 фразы и я взял не кусок из середины фразы, а фразу целиком.
143. Altair777 640 21.10.08 15:40 Сейчас в теме
Честно говоря, утомился...
Есть у кого-то свои мысли?

"Рефакторинг позволяет разрабатывать архитектуру программы постепенно, откладывая проектные решения до тех пор, пока не станет более ясной их необходимость." (http://ru.wikipedia.org/wiki/Рефакторинг)

Обратите внимание - пока не станет более ясной их необходимость
А тут предлагется сразу даже не думая, надо это или не надо, 20 строк на 5 процедур разбивать.
Складывается такое впечатление, что некоторые "спецы" по рефакторингу или вообще не читали или не поняли, что там написано.
147. Душелов 3916 21.10.08 15:45 Сейчас в теме
(143) Надо или нет решает сам разработчик. Если код для себя - то не можно и не делать, а если нет - то стоит все таки...
149. artbear 1186 21.10.08 15:56 Сейчас в теме
(143) 1. Если эти высказывания в мою сторону, то я же не зря несколько раз упоминал свое участие в проектах по разработке ВК 1С++ и ФормЕкс, а также разработке системы тестирования для них.
Так что опыта рефакторинга у меня хватает :), а не только знаний по нему.
.
2. Вике не нужно сильно доверять :), если уж хочешь разобраться, иди к классикам и первоисточникам.
Естественно, т.к. процесс проектирования/разработки - это творческий процесс, то в нем нет догм.
И рефакторинг - это только инструмент в умелых руках. Эти руки/голова должны самостоятельно решать, что и как нужно рефакторить.
.
ЗЫ Если все-таки в мою сторону :( - и опыт работы над скриптами/плагинами для Опенконф также большой имеется.
.
В любых своих работах, в т.ч. и для 1С, я активно применяю как рефакторинг, так и тестирование.
.
Те, кто меня знает, об этом уже наслышаны :)
.
И к словам автора ИМХО также не нужно слишком уж докапываться :) - в творчестве нет догм.
152. Altair777 640 21.10.08 16:02 Сейчас в теме
(149)
> И к словам автора ИМХО также не нужно слишком уж докапываться :) - в творчестве нет догм.
Для этого и нужно обсужать :-)

> Вике не нужно сильно доверять :)
Так дополните эту статью, исправьте и завершите.

> Те, кто меня знает, об этом уже наслышаны :)
И тогда не только они, а и мы будем не только наслышаны, а еще и начитаны :-))
150. artbear 1186 21.10.08 15:58 Сейчас в теме
(143) И еще :)
Сразу же после абзацев по поводу количества строк, параметров и т.д. автор не зря ставит следующий абзац:
Цитата:
>>Понятно, что перечисленные рекомендации не догма, а лишь повод к размышлению.
>>Можно нагородить и однострочный код так, что его невозможно будет понять.
>>Главный принцип здесь таков – если код нельзя понять с первого взгляда,
>>а особенно если захотелось написать комментарий, поясняющий его работу,
>>значит, этот код требует изменения.
.
Вот это главное, а не количество, к котором ты привязался :)
153. Altair777 640 21.10.08 16:08 Сейчас в теме
(150) > Вот это главное, а не количество, к котором ты привязался :)

> Блок кода длиннее 7-10 строчек должен оформляться в отдельную процедуру или функцию, с названием, которое описывает, что, собственно, этот блок делает.
Я привязался к слову "должен". Не "может", а именно должен. Вот это и есть догма :-)

П.С. Автор, исправьте, плиз, блог. Уберите "должен" и свои надуманные 7-10 строк. И тогда я успокоюсь. Наверно :-)
144. Душелов 3916 21.10.08 15:41 Сейчас в теме
Оффтоп - а вы работать пробовали? ;)
145. Altair777 640 21.10.08 15:42 Сейчас в теме
146. Altair777 640 21.10.08 15:43 Сейчас в теме
+143 сорри, если слишком резко
148. Altair777 640 21.10.08 15:49 Сейчас в теме
+143 Кстати, про количество строк оттуда же

"Также правило: один метод не должен занимать более чем один экран (25-50 строк, в зависимости от условий редактирования), в противном случае некоторые его фрагменты имеют самостоятельную ценность и подлежат выделению."

Как-то противоречит "Блок кода длиннее 7-10 строчек должен оформляться в отдельную процедуру или функцию"
Или у автора блога 4-дюймовый монитор?
151. artbear 1186 21.10.08 16:01 Сейчас в теме
(150+) Про фразу насчет комментария подпишусь обеими руками :)
154. Altair777 640 21.10.08 16:10 Сейчас в теме
(151) А фраза на Вике звучит убедительнее :-)

"если фрагмент кода требует комментария о том, что он делает, то он должен быть выделен в отдельный метод и назван так, чтобы исключить комментарий как таковой".
155. fastwriter 22.10.08 16:42 Сейчас в теме
Все по тому же поводу выделения блока кода длиной 7-10 строк в отдельный метод.
Сначала формулируется правило, потом, когда начинаются возражения, следует уход с доводами о том, что это "не догма, а руководство к действию".
Хотелось бы более или менее четких правил, каким образом действовать, если модуль достаточно большой (например, несколько тысяч строк).
Если работа над данной статьей была недолгой, есть большая вероятность, что можно додумать еще много чего полезного.
160. artbear 1186 24.10.08 16:04 Сейчас в теме
(155) При рефакторинге больших непрерывных кусков кода нужно аккуратно делать след. действия в любом порядке:
- выделить независимые или слабозависимые куски кода и оформить в виде отдельных методов;
- выделить повторяющиеся куски кода и оформить в виде отдельных методов;
- избавляться от переменных, которые используются несколько раз с разным назначением;
- выделить данные, которыми оперируем, и постараться выделить методы, которые специфичны для этих данных.
и многое другое.
156. tango 484 22.10.08 16:46 Сейчас в теме
менеджмент, блин. менеджеры все, работать некому. вот кусок запроса из кассовой книги от уважаемой фирмы:
Код
   ИЗ
      Документ.ПриходныйКассовыйОрдер КАК ПриходныйКассовыйОрдер
   ГДЕ
      [b]ПриходныйКассовыйОрдер.ПометкаУдаления = ЛОЖЬ[/b]
      И ПриходныйКассовыйОрдер.Дата МЕЖДУ &НачИтоги И &ДатаКон
      И ПриходныйКассовыйОрдер.Организация = &Организация
      И ПриходныйКассовыйОрдер.ОтражатьВБухгалтерскомУчете = ИСТИНА
      И ПриходныйКассовыйОрдер.Проведен
      И [b]ПриходныйКассовыйОрдер.ПометкаУдаления = ЛОЖЬ[b]
      И (ПриходныйКассовыйОрдер.Оплачено ИЛИ НЕ ПриходныйКассовыйОрдер.ОтражатьВУправленческомУчете)

Показать полностью
157. Altair777 640 23.10.08 09:07 Сейчас в теме
(156) а нам необязательно уподобляться :-)
158. drx211 24.10.08 12:59 Сейчас в теме
(156) Что именно не нравится в этом куске?
159. Altair777 640 24.10.08 14:05 Сейчас в теме
(158) наверна, многа буквов :-)

если серьезно, это можно было бы и в функции сделать, если не все условие, то хотя бы часть, часто встречающуюся

- избыточный код (проверка на проведенность и непометку на удаление :-) )
дважды проверку на неудаленность :-))
161. keleg 322 26.10.08 05:29 Сейчас в теме
(159) это запрос, его так просто в функцию не вынесешь, только в последних редакциях 8.1 появились средства для разбиения на части запросов.
Именно после этого появления я считаю 8ка сравнилась по отработанности языка с 7.7, потому как раньше были иногда запросы по 1500 строк с повторяющимися кусками кода, которые было невозможно написать оптимальнее.
164. vkr 101 30.10.08 13:19 Сейчас в теме
Что же до "мэйнстрима программирования", то посмотрите на последние продукты Микрософта, Симантека, Касперского и иже с ними...
И никакое ХР и рефакторинг их не спасут, впрочем, как и 1С... Вот уж точно - "Сатана там правит бал!" :)
165. Душелов 3916 30.10.08 13:21 Сейчас в теме
(164) текучка программистов, нереальные сроки рождают подобные шедевры.
166. vkr 101 30.10.08 13:35 Сейчас в теме
Вы, наверное, хотели сказать - текучка "программистов" ? :)
Хотя, да - закон Мэрфи "Два из трех" еще никто не отменял...
А как Вам вот такой опус :
-----
<gram|work> про индийский код
<gram|work> Какой самый извращенный способ проверить в условии if () булевскую переменную ?
<gram|work> bool b;
<gram|work> b = false;
<gram|work> if (b == true){...}
<gram|work> Это децкий лепет
<gram|work> ИТАК, ПЕРВОЕ МЕСТО
<gram|work> Знакомый говорит, что нашел только что в коде:
<gram|work> if (b.ToString().length < 5){...}
-----
По-моему, как раз в стиле 1С... :)
И уже "на закуску" (чтобы не сильно отвлекаться от темы рефакторинга) - интересная статейка :
"Русский код - бессмысленный и беспощадный"
http://relyef.livejournal.com/132521.html?thread=678313#t678313
168. Душелов 3916 30.10.08 13:41 Сейчас в теме
(166) именно "программистов", соглашусь...
Когда деньги платят за количество строк кода, извратиться можно всячески...
169. JohnyDeath 297 30.10.08 14:01 Сейчас в теме
(168) Когда деньги платят за количество строк кода, извратиться можно всячески...
ага, помним ещё Маяковского - эдакого пионера в этих делах! :)))
167. vkr 101 30.10.08 13:39 Сейчас в теме
З.Ы. После трех десятков лет программерства на PL/1, C и Assembler :), ваяние на 1С вызывает ну просто душевный трепет... :)))
170. vkr 101 30.10.08 14:38 Сейчас в теме
А слабО написать форматтер/верификатор исходников 1С - наподобие дельфийской Кастальи, например ? :)
Вот тогда и доходы 1С-программеров заметно возрастут...
(Хотя, может я и заблуждаюсь - и такое чудо мысли уже существует ???)
171. Душелов 3916 30.10.08 15:24 Сейчас в теме
(170) А что именно форматировать и проверять? Я писал такой для анализа вызова несуществующих процедур и функций из общих модулей - встроенная проверка почему-то не проверяла.
176. keleg 322 07.11.08 11:02 Сейчас в теме
(170) Форматтер в 1С есть. Alt+Shift+F
177. vkr 101 12.11.08 10:09 Сейчас в теме
(176) Ctrl-Shift-F :)
Но просто вставлять табуляции - фи, как ето скуШно... :)))
172. vkr 101 30.10.08 17:16 Сейчас в теме
Ну, форматируют обычно языковые конструкции (отступы там красивые и т.п.), можно создавать стандартные заголовки процедур/функций (для заполнения их описаний) и т.п.
Можно в начале модуля делать сводную таблицу используемых процедур и переменных, можно делать таблицу кросс-ссылок, можно проверять на возможное несоответствие
числа параметров вызова Фн/Пр, да мало ли что еще можно наизвращать... :)
173. Душелов 3916 30.10.08 17:24 Сейчас в теме
Регулярные выражения - и вперед :)
174. vkr 101 31.10.08 08:24 Сейчас в теме
Да мне лично, в общем-то, сия фича больно-то и не нужна - пишу сразу разборчивым почерком и с комментами... Приучился за много лет... :)
175. artbear 1186 31.10.08 10:34 Сейчас в теме
(174) Одно из главных плюсов хорошего кода - он не требует комментариев или требует очень малого их количества.
Все его назначение и цели видны прямо из кода :)
178. DionX 99 24.11.08 11:08 Сейчас в теме
Мой началник делает все точно так как написано в статье. Только наоборот: процедуры на сотни строк, одинаковые куски кода в теже сотни строк в одном модуле, названия переменных по типа "ФормаБля", "Фичка", "временная" и тп, куча параметров, НИ ОДНОЙ ФУНКЦИИ во всей его самописанной конфигурации с общим количеством строк кода на многие десятки тысчев! Короче, сказка, а не код!)))))
Ну, а по поводу статьи - всё правильно, просто и понятно. Сам читал несколько книг по рефакторингу и мне нравится его осуществлять. Автор - молодец!
180. YVolohov 695 05.12.08 15:42 Сейчас в теме
Очень правильная и нужная тема. Сам не раз задумывался над этими вопросами. Одно могу сказать точно сложная программа - плохая программа. Не большая, заметьте а именно сложная. Когда влазишь в код и видишь простыню на 20 страниц всякой фигни подряд, хочется матернутся и переписать все заново.
186. keleg 322 07.12.08 12:23 Сейчас в теме
Да ладно, я ж не в споре хочу победить, мне интересно спорить для проверки собственных выводов, чтоб истину знать :-)
Только что попробовал - функция с двумя параметрами-строками, по значению, длина строк от 3 до 30000 в цикле. Те же 15 %, как ни странно.
Три раза проверил - все правильно.
Приятно удивлен. (8.1.12.101)
Наверное, тормозить начинает, если туда ТаблицуЗначений по значению передавать, но это уже совсем издевательство над бедным интерпретером.

187. tormozit 5906 07.12.08 12:31 Сейчас в теме
(186) Давай более предметно. Где EFP? Вопрос в том, какой вес будут иметь системные операции по передаче параметров относительно самого кода, выносимого в метод. Про таблицу значений не волнуйся. Это агрегатный объект и он всегда передается по ссылке (или по ссылке на ссылку).
188. keleg 322 07.12.08 12:49 Сейчас в теме
Ну, про EFP я не понял. Про ТЗ так и подозревалось, но не проверялось, спасибо за информацию.

Вот код обработки, которой я проверял быстродействие.

Функция Тестовая(знач Параметр1, знач Параметр2)
Возврат Параметр1+Параметр2;
КонецФункции


Процедура КнопкаВыполнитьНажатие(Кнопка)
Параметр1 = "111";
Параметр2 = "222";
Сообщить("Без процедуры начало "+ТекущаяДата());
Для Счетчик=1 по 100000 Цикл
Параметр1 = Параметр1+Параметр2;
КонецЦикла;
Сообщить("Без процедуры конец "+ТекущаяДата());
Параметр1 = "111";
Параметр2 = "222";
Сообщить("С процедурой начало "+ТекущаяДата());
Для Счетчик=1 по 100000 Цикл
Параметр1 = Тестовая(Параметр1, Параметр2);
КонецЦикла;
Сообщить("С процедурой конец "+ТекущаяДата());
КонецПроцедуры


Если сделать код без роста строчек (максимально простым, например Результат=Параметр1+Параметр2) то можно добиться 140% роста затрат.
Но это, уже, кажется, максимально замедление, которого можно добиться, оно реальность уже совсем не отражает. И, кстати, даже при этом по значению и по ссылке время не различается.
189. shilovev 08.09.09 14:17 Сейчас в теме
Я конечно может и ошибаюсь, но у структуры нет метода Добавить(), а есть Вставить(). Так что имхо в статье ошибка...
190. shilovev 08.09.09 14:18 Сейчас в теме
PS но статья все равно отличная!!!
191. TODD22 19 05.11.09 11:39 Сейчас в теме
спасибо! отличная статья.....

1) Основное время выполнения занимают неоптимальные запросы. Возможности их рефакторинга появились в последних редакциях 8.1, но их обзор выходит за пределы данной статьи.


а подскажите где про это почитать? а то очень интерсно...
ну или может автор на эту тему статью напишет?
192. Душелов 05.11.09 11:58 Сейчас в теме
(191) Стоит сходить к примеру на курсы http://www.specialist.ru/programs/course.asp?idc=858

Для 1С там многое применимо.
193. TODD22 19 05.11.09 12:11 Сейчас в теме
(192)
я бы с удовольствием, но есть ряд причин.....
мне бы по проще то есть может статьи на эту тему есть или какой нибудь учебничек от 1С.... на первое время было бы в самый раз....
Оставьте свое сообщение
Вопросы с вознаграждением