Имя: Пароль:
IT
 
Как называется, когда в модуле много лишних процедур?
,
0 komanch75
 
06.05.14
15:25
Встречаются такие самописные модули, где процедуры создаются лишние. Т.е. например кусок кода используется только один раз во всей программе, но он для чего-то вынесен отдельной процедурой. Или кусочек из двух - трех строчек используется всего два раза, но тоже вызывается отдельной процедурой. И это, часто, мешает читать программу. Вместо того, чтобы просто прочитать код, нужно перескакивать с одного места кода на другое, возвращаться назад,  запоминать, как автор обозвал свою процедуру и что она делает. А если таких лишних процедур еще и много... Просто поражает, неужели сейчас не учат хорошему тону в программировании?
Я думал, что это называется заструктурированность кода, но погуглив, такого определения не нашел. Так как называется такое явление?
122 xReason
 
06.05.14
22:13
Советую всем умникам, которые говорят, что это плохой код почитать - Чистый код. Создание, анализ и рефакторинг
Автор: Роберт К. Мартин

Даже если процедура вызывается один раз, но это помогает лучше читать код, это оправдано и приветствуется!

Опять же хорошая инкапсуляция всегда делает код гибче
123 ilpar
 
06.05.14
22:27
Хороший код - это читабельный код. Автор (0) не дорос.
124 ilpar
 
06.05.14
22:28
Неужели умные книги читать не учат в университетах?
125 oleg_km
 
06.05.14
22:30
Разбиение большой процедуры на маленькие позволяет также лучше контролировать локальные переменные. В длиной процедуре легко попортить какую-нибудь локальную переменную повторным использованием, тем более при нетипизированности 1С
126 ShoGUN
 
06.05.14
22:45
Самая жуть, что я видел - обработка, написанная так:
В модуле объявлено m переменных модуля.
В модуле написано n процедур без параметров, которые как-то внутри себя меняют вышеуказанные переменные. То есть никакого интерфейса ни у чего нет вообще, весь модуль невозможно разобрать на составные части, "убираешь столб - умирает Пьер Безухов".
А то, что в (0) - нормально, если конечно имена у процедур понятные, а не А1(о, _м).
127 ShoGUN
 
06.05.14
22:48
А, ещё хохма - целая процедура "получить номер без разделителей", которая убирает неразрывные пробелы из длинных номеров-чисел. Кто-то не умел использовать Формат(), ну и наваял. И даже в общий модуль засунул.
128 quest
 
06.05.14
22:49
(0) автор, ты код на джава не читал - на каждый чих - класс, или на С не видел как пишут - на каждые полчиха - свое определение типа. И что удивительно - не видно нигде вопросов - зачем так много функций, а почему все не собрать в одну простыню и читать станет проще?
А вот в 1С - это повод спросить...
Не умеешь читать - не берись, или (как любят тут говоить на форуме ) - "пригласите специалиста"
129 ИС-2
 
naïve
07.05.14
07:01
(0) разработчик молодец - правильно написал.
А автор из (0) проверил ли все места - внешние обработки, базы которые подлючаются через COM, отчеты СКД. Если код используется уже в 2 местах, то надо выносить в отдельные процедуры и функции.
Кроме того, можно сэконить на комментариях
130 ИС-2
 
naïve
07.05.14
07:09
(5) если 2 строчки используеются нескольк раз, то надо.
(53) это если название процедуры не понятное
131 ИС-2
 
naïve
07.05.14
07:13
(101) например, когда тебе надо модифицировать движения по РАУЗ - они формируются в общем модуле, который используется кучей других объектов и вероятность сломать, что либо очень высока. В этом случае лучше прочитать сформированный набор записей и подкорректировать его
132 Chai Nic
 
07.05.14
07:13
(22) "если появляется желание что либо прокомментировать в коде, то этот кусок необходимо выделить в отдельный метод"
Годно. Лучшие комментарии к коду - отсутствие комментариев!
133 Chai Nic
 
07.05.14
07:16
(116) "Запрос = Новый Запрос(ПолучитьБольшойТекстЗапроса()) "
Лучше большие запросы хранить в макетах:
Запрос = Новый Запрос(ПолучитьМакет("НуОченьБольшойТекстЗапроса").ПолучитьТекст())
134 вым
 
07.05.14
07:45
а чтобы окончательно снесло крышу у ТС, 1с внедряет новые механизмы даже в платформу )))

http://v8.1c.ru/o7/201312ref/index.htm
как то - Инструменты рефакторинга

Функции рефакторинга

Функции рефакторинга позволяют сделать код более понятным и удобным для восприятия. Например, вы можете оформить часть кода в виде отдельной процедуры или функции (команда Выделить фрагмент):
135 User_Agronom
 
07.05.14
07:49
(0) Метод последовательной детализации. Выносить блоки в процедуры и функции - хороший стиль. Зря ТС ругает.
(1) (18) - что-то эти два высказывания как-то не сходятся.
136 ДенисЧ
 
07.05.14
07:55
(135) У тебя не сходятся. Значит, ты ещё не дорос.
137 PLUT
 
07.05.14
08:38
(134) Не, для сноса крыши нужен обфусцированный код

http://infostart.ru/public/183177/
138 Mikeware
 
07.05.14
08:41
(132) Код должен быть "самокомментируемым" и в лучшем случае - "самодостаточным"
139 iamnub
 
07.05.14
08:52
(107)
Браво. Забавно, что никто смысла поста не понял.
140 iamnub
 
07.05.14
08:54
А ТС просто не работал в команде. Зачем читать книги, учиться программировать?? Дали мяч - }{уячь - вот и все 1С-ные паттерны.
141 Kyon8
 
07.05.14
09:00
В идеале процедура выполняет только одну задачу однозначно обозначенную в её названии, без побочных эффектов. Тогда при отладке не нужно и заходить в неё обычно. И отлаживать её можно независимо. См. Макконела, да.
142 ДенисЧ
 
07.05.14
09:03
(138) Код никому и ничего не должен
143 kosts
 
07.05.14
09:05
(133) Не нужно так делать. Нужно так, что бы название функции отражала её предназначение:

Запрос = Новый Запрос(ПолучитьТекстЗапросаШапкаДокумента())

или как-то так

Запрос = Новый Запрос(ПолучитьТекстЗапросаПодсчетаОстатков())
144 Separator
 
07.05.14
09:22
ТС, вон из профессии!!!
145 Pasha
 
07.05.14
09:23
(0) Выносить в отдельную процедуру код нужно как раз таки для удобства разбора кода, а не для многоразового использования.
Это стандарты 1С.
146 kosts
 
07.05.14
09:25
(145) И не только 1С.
147 Pasha
 
07.05.14
09:30
Хотя конечно налицо последствия школьного обучения.
Если не изменяет память, то Паскаль именно так и пишется... Одной сплошной простыней. И впитывается в мозг почти намертво. Потом выбить сложно.

Это как с чтением. Обучили читать по слогам, потом кому нужно переучиваются читать слова, ходят на курсы быстрого чтения.
148 Separator
 
07.05.14
09:33
(147) Это хреновые были учителя.
Pascal - образец структурированности, увы, недостижимый разрабами языка 1С.
149 Serg_1960
 
07.05.14
09:35
(0) Я сомневаюсь что есть такой термин.

Все знают про индусский код, но я сильно сомневаюсь что есть монографии по его изучению, методике и определению терминологии.

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

Вот как-то так.

:)
150 Kyon8
 
07.05.14
09:35
(116) Тексты запросов в отдельную функцию это спорно как-то, хотя почти стандарт типовых. По мне так логичнее возвращать готовую выборку. А то текст в одной функции, установка параметров в другой, нарушение абстракции.
151 Любопытная
 
07.05.14
09:36
(147) Не наговаривайте на Паскаль, в нем тоже можно писать отдельные процедуры и функции. И все чудесно структурировалось
152 ДенисЧ
 
07.05.14
09:39
(151) Перепутал человек Паскаль с Бейсиком.
Бывает...
153 Serg_1960
 
07.05.14
09:41
Угу. Как изучал - такие и представления :)

"Садись, два"(с)
154 VladZ
 
07.05.14
09:44
(152) В Бейсике тоже все отлично структурируется.
155 ДенисЧ
 
07.05.14
09:46
(154) Бейсики разные бывают
156 User_Agronom
 
07.05.14
09:52
(136) Корона за нимб не цепляется?
Приведи-ка пример задачи, в которой правильнее всего использовать команду goto (или её аналог).
157 ДенисЧ
 
07.05.14
09:55
(156) А кто ты такой, чтобы я тебе что-то приводил или доказывал?
Не знаешь - сиди, прозябай в невежестве.
158 PLUT
 
07.05.14
09:55
в 1С есть команда

Перейти (Goto)
Синтаксис:
    Перейти ~<Метка>;

Англоязычный синтаксис:
    Goto ~<Метка>;

бейсик йопта
159 PLUT
 
07.05.14
09:56
(156) почитай СП в 1С))

там пример выхода из двойного цикла
160 User_Agronom
 
07.05.14
10:00
(159) Это слабость языка 1С. В нём нет цикла с постусловием. Аналога repeat ... until из Pascal.
Но, тем не менее, это легко решается без команды Перейти.
161 User_Agronom
 
07.05.14
10:01
(157) Аргумент веский. Убедительный. Придётся согласиться.
162 Ndochp
 
07.05.14
10:13
(159) И это не портит читабельность? уж лучше еще один флажок завести, типа "мы все сделали" и поставить  в оба условия цикла в конец " и не мыВсеСделали"
163 kosts
 
07.05.14
10:18
(162) Портит читабельность именно такое применение.
С перейти в таком использовании нагляднее.
Представляю нагромождения с условиями, если нужно выйти например из тройного цикла.
В языке не хватает что то вроде Прервать <Уровень>
164 Separator
 
07.05.14
10:18
165 kosts
 
07.05.14
10:21
(163) Но если что, я не агитирую ни за один способ. Оба применяю там где это лучше подходит.
166 Stepa86
 
07.05.14
10:38
(156) Использование возврата, Продолжить или Прервать в начале метода/тела цикла при нарушении входных условий
167 Chai Nic
 
07.05.14
10:42
(148) "Pascal - образец структурированности"
Ага. Там даже можно процедуру определить внутри области видимости другой процедуры, а не глобально в модуле.
168 Stepa86
 
07.05.14
10:45
Всем тем, кто считает, что методы нужны только для предотвращения дублирования кода - пламенный привет.

Макконнелл выделяет 16 причин, и предотвращение дублирования всего лишь на 3м месте.
169 Separator
 
07.05.14
10:47
(167) А это плохо?
170 fisher
 
07.05.14
10:47
(0) Вот проблемы у людей. Мне в основном приходится матерится из-за прямо противоположного.
171 Asmody
 
07.05.14
10:51
(0) это еще в 1С лямбд нет и функций первого порядка.
можешь себе представить функцию, которая принимает другую функцию в качестве параметра и возвращает третью функцию?
172 fisher
 
07.05.14
10:52
ИМХО, если "кусочек кода" обладает законченной и изолированной функциональностью, то логично вынести его в отдельную функцию даже если он сейчас только один раз используется. Пусть это лишний вызов, но читабельность кода как раз повышается.
173 ДенисЧ
 
07.05.14
10:53
(171) Как представил себе, что это будет использовано в типовых...
Борода резко начала седеть...
174 Stepa86
 
07.05.14
10:54
(171) а я вот где то видел такое в 1С, где передавались куски кода и в выполнить подсовывались. Да и в УП и УТ11 все больше код движется в эту сторону
175 User_Agronom
 
07.05.14
10:55
(166) Не нужно путать команду безусловного перехода и команды управления циклом.
176 Stepa86
 
07.05.14
10:57
(175) а я как раз не путаю, продолжить это гото в конец тела цикла, прервать - гото в первую строчку после цикла, возврат - гото в конец метода
177 fisher
 
07.05.14
10:57
Давненько срачей по поводу гоу ту не было.
178 User_Agronom
 
07.05.14
10:57
(171) Это откуда?
179 Asmody
 
07.05.14
10:58
(174) Выполнить — это ужас-ужас
180 Asmody
 
07.05.14
10:59
(178) откуда что? лямбды и ФПП? из старого доброго функционального программирования.
181 ДенисЧ
 
07.05.14
11:04
(180) Старого - да. Доброго - ой сомневаюсь... :-)
182 User_Agronom
 
07.05.14
11:16
(180) Ни разу не сталкивался и изучал. Сейчас почитал, правда, достаточно специфично.
183 PLUT
 
07.05.14
11:19
(179) через Выполнить() все обормотчики событий в КД2 работают
184 iamnub
 
07.05.14
11:21
(171)
В 1С нет функций высшего порядка, а не первого, адепт.
185 Asmody
 
07.05.14
11:41
(184) поймал на терминологии? ну, ок, возьми с полки пирожок
186 Asmody
 
07.05.14
11:42
187 Чайник Рассела
 
07.05.14
11:56
(186) тю. вот библия каждого уважающего себя программиста
http://cs7009.vk.me/c540105/v540105830/25a04/icOk10-ri1s.jpg
188 quest
 
07.05.14
12:42
(171) а вот этого действительно жутко не хватает. как и макросов. И никакими выполнить/вычилсить не компенсировать
189 Torquader
 
07.05.14
15:49
(188) В 1С и указателей, как таковых, нет.
Есть только псевдообъекты, с заранее заданными наборами свойств.
Если кому интересно - сравните время вызова функций, работы Выполнить и обращения к объектам - сразу станет понятно, что интерпретатор, какой бы он умный не был - быстротой никогда не отличиться.
190 Shurjk
 
07.05.14
15:50
(0) Не согласен с озвученным определением лишних процедур.
191 Chai Nic
 
07.05.14
16:08
(169) А чего хорошего? Если ты делаешь узкоспециализированную процедурку, которая используется лишь в одном месте - логично было бы ограничить её область видимости этим местом. Это как приватные методы класса, только без классов - в чисто процедурном подходе.
192 Chai Nic
 
07.05.14
16:09
+(191) Да, и эта дочерняя процедура видит все переменные родительской процедуры, что позволяет и не заморачиваться с передачей параметров, и не вводить глобальных переменных..
193 vhl
 
07.05.14
16:17
(0) Автор не выделяет блоки кода до тех пор, пока они не будут использоваться повторно? Здравствуйте многостраничные процедуры. Очень удобно. "Хороший тон в программировании".
194 bolobol
 
07.05.14
16:24
(193) Более того! Когда блок используется повторно - он тупо копипастится! Скорость разработки поднимается в разы, ибо даже думу подключать не нужно. Зачем делать красиво там, куда обычно "почитать" не лазят?
195 vhl
 
07.05.14
16:25
И это тоже нормально:

Процедура УстановитьВидимость()
    УстановитьВидимостьКнопкиПодписания();
КонецПроцедуры

особенно, если по опыту знаешь, что в будущем будут еще "хотелки".
196 Torquader
 
07.05.14
16:55
(194) И повторное копирование блока ускоряет исполнение.
P.S. у меня под некоторые языки есть "сборщики кода" - ему пишешь просто и ясно, что нужно сделать, а он уже разворачивает в процедуры и функции, доступные для выбранного языка - то, что кто-то в этом "чуде" разобраться не сможет - это его личные проблемы - можно вверху модуля в комментариях вставить то, что было изначально.
197 quest
 
07.05.14
16:57
(188) спасибо, кэп!
198 Irbis
 
07.05.14
16:58
При этом, быстрые и лёгкие деньги, и даже не всегда маленькие платят именно за гомнокод. А потому чем его бельше тем лучше.
199 Torquader
 
07.05.14
16:59
(198) Ну, тот кто платит, код оценивает только по работоспособности.
200 Irbis
 
07.05.14
17:01
(199) И это правильно. Так зачем делать лучше если можно потом срубить з улучшение? Как в совке, сначало выпускаем форматку на спецболт, потом вносим рацуху на замену стандартным изделием. И всем хорошо.
201 quest
 
07.05.14
17:03
(200) именно поэтому и стало программирование - ремеслом куда ломанулись ПТУшники - тупо рубить бабки
202 Irbis
 
07.05.14
17:06
(201) Ничего в этом плохого нет.
203 StanleyMarsh
 
07.05.14
17:11
(0) давайте назовем это "полиморфизированный инкапсулят"!
204 Ненавижу 1С
 
гуру
07.05.14
17:11
да, напридумывали пустых ссылок вагон и радуются
205 quest
 
07.05.14
17:49
(204) еще null, неопределено придумали... логичненько так получилось.. чисто по одноэсовкси
206 ИС-2
 
naïve
08.05.14
07:59
(0) кстати, тоже мучался с возвратом на прежнее место в коде (откуда вызывалась процедура), пока не нашел для себя кноку alt+F2 и F2. Очень полезные.

Только не хватает стрелочек вперед-назад (как в браузерах), чтобы перейти к прошлому куску кода
207 Chai Nic
 
08.05.14
08:02
(206) А еще есть мечта насчет "обратного отладчика" ) Чтобы вернуться назад в исполнении, с восстановлением контекстов.
208 Михаил 1С
 
08.05.14
08:14
(59) Полностью согласен.

Так легко читать код и легко работать над отдельными частями.
В основной процедуре написано как оглавление из подпроцедур, в итоге сразу видно - что делается. А если надо детально что-то посмотреть - ныряешь в процедуру и смотришь.
209 Михаил 1С
 
08.05.14
08:16
(94) "зачем делать кучу процедур по 3 строчки, которые вызываются 1 раз"
   Ну, это лишнее. Правда, я не читал кода, тебе виднее.
210 Ненавижу 1С
 
гуру
08.05.14
09:27
(205) NULL уже был до них, они просто вынуждены были его использовать
Неопределено - тоже нужно, но в БД хранить нельзя его, только для неинициализированных объектов (nil в паскале)
211 kosts
 
08.05.14
09:46
(207) Об этом я тоже мечтал
(208) +1
(209) Бывает и такое нужно.
212 fisher
 
08.05.14
11:02
В тему. Порадовала функция из БСП:

// Создает массив и помещает в него переданное значение
//
Функция ЗначениеВМассиве(Значение) Экспорт
    
    Массив = Новый Массив;
    Массив.Добавить(Значение);
    
    Возврат Массив;
    
КонецФункции

Причины её появления, в принципе, понятны. Но всё равно прикольно смотрится :)
213 vova1122
 
08.05.14
11:55
я конечно не профи. Но на мой взгляд даже маленькие процедуры/функции на несколько строк которые используются всего один раз - лучше.
Например название функций% УдалитьПробелыВСтроке(МояСтрока)
ПолучитьАдресКонтрагентаПоЕгоКоду(КодКонтрагента)

По названии сразу понятно что она делает и что должна возвращать.
Если вписать эти несколько строк а основном модуле без комментариев, придётся анализировать что происходит в этих строках.
214 fisher
 
08.05.14
12:08
(213) Уточню про "маленькие процедуры/функции на несколько строк которые используются всего один раз". Только если их суть не прозрачна и не читается "в лёт". Функция из (212) при однократном использовании смысла не имеет и только ухудшает читабельность.
215 ELEA26
 
08.05.14
12:20
Если правильно названы процедуры - то даже перескакивать туда не обязательно, чтобы понять что она делает.
216 vova1122
 
08.05.14
12:21
(214) Согласен. На каждый "чих" ненужно писать функции, но и лепить все в одну процедуру тоже неверно.
217 Chai Nic
 
08.05.14
14:05
(214) Вообще для таких целей было бы неплохо иметь inline-функции. Это бы позволило не заморачиваться с передачей информации через параметры. Или сделать как в паскале - внутренние функции.
218 vhl
 
08.05.14
16:50
(216) А в чем проблема собственно? Тебе строк жалко или что?
У меня например есть такое:
Функция ПолучитьМассивИзСтрокиСРазделителем(пСтрока, пРазделитель = ".") Экспорт
    
    Возврат ирПлатформа.ЛксПолучитьМассивИзСтрокиСРазделителем(пСтрока, пРазделитель);
    
КонецФункции

Функция МассивИзСтрокиСРазделителем(пСтрока, пРазделитель = ".") Экспорт
    
    Возврат ирПлатформа.ЛксПолучитьМассивИзСтрокиСРазделителем(пСтрока, пРазделитель);
    
КонецФункции

Функция МассивИзСтрокиСРазделителями(пСтрока, пРазделитель = ".") Экспорт
    
    Возврат ирПлатформа.ЛксПолучитьМассивИзСтрокиСРазделителем(пСтрока, пРазделитель);
    
КонецФункции

Функция ИзСтрокиСРазделителем(пСтрока, пРазделитель = ".") Экспорт
    
    Возврат ирПлатформа.ЛксПолучитьМассивИзСтрокиСРазделителем(пСтрока, пРазделитель);
    
КонецФункции

Функция ИзСтрокиСРазделителями(пСтрока, пРазделитель = ".") Экспорт
    
    Возврат ирПлатформа.ЛксПолучитьМассивИзСтрокиСРазделителем(пСтрока, пРазделитель);
    
КонецФункции

Это называется "синонимы" и тебе просто не надо запоминать как он там пишется - все что не напишешь будет правильно.
219 su_mai
 
08.05.14
18:13
(207) Есть мечта, что бы появилась возможность останавливаться по ошибке содержащей текст
220 ДенисЧ
 
08.05.14
18:17
(219) А что, уже убрали в новых релизах??
221 su_mai
 
08.05.14
18:18
+(219) Наоборот, не останавливаться на ошибках, содержащих текст. Например когда ошибки в попытках маскируются :)

сорри :)