|
Как называется, когда в модуле много лишних процедур? | ☑ | ||
---|---|---|---|---|
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
|
||||
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
|
оставлю здесь https://en.wikipedia.org/wiki/First-class_function
|
|||
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) Наоборот, не останавливаться на ошибках, содержащих текст. Например когда ошибки в попытках маскируются :)
сорри :) |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |