|
Философский вопрос об оформлении кода - 3 | ☑ | |||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
0
quest
03.06.12
✎
23:49
|
Трава стала еще забористее.
уже 3 эквивалентных варианта кода (здесь ТЗ это таблица значений) 1. для каждого СтрокаТЗ из ТЗ цикл что-то делаем со СтрокаТЗ; КонецЦикла; 2. всего = ТЗ.Количество()-1; для ИндексСтроки = 0 по всего цикл СтрокаТЗ = ТЗ[ИндексСтроки]; что-то делаем со СтрокаТЗ; КонецЦикла; 3. всего = ТЗ.Количество()-1; ИндексСтроки = 0; пока ИндексСтроки < всего цикл СтрокаТЗ = ТЗ[ИндексСтроки]; что-то делаем со СтрокаТЗ; ИндексСтроки = ИндексСтроки + 1; КонецЦикла; Какой из вариантов вам ближе? в каких случаях? почему? |
||||||||||
1
0_Serg_0
03.06.12
✎
23:51
|
2 вариант
но вместо всего = ТЗ.Количество()-1; для ИндексСтроки = 0 по всего цикл написал бы всего = ТЗ.Количество(); для ИндексСтроки = 0 по всего-1 цикл или для ИндексСтроки = 0 по ТЗ.Количество()-1 цикл Вариант 2 |
||||||||||
2
IamAlexy
03.06.12
✎
23:53
|
(0) чисто риторический вопрос:
ИТС и их рекомендации по оформлению кода читал? |
||||||||||
3
IamAlexy
03.06.12
✎
23:54
|
по теме: первый вариант
|
||||||||||
4
quest
03.06.12
✎
23:56
|
(2) не смотря на то что риторический - отвечу - да.
для себя ответ есть. А вот послушать что могут сказать умные люди - всегда приятно. Вдруг что новое для себя узнаю :) |
||||||||||
5
DrShad
03.06.12
✎
23:56
|
да уже добейте кто-нибудь ТС - сил больше нет
|
||||||||||
6
0_Serg_0
03.06.12
✎
23:57
|
(1) + бывает что без индексов не обойтись - например для удаления части записей
а когда обращаться по индексу не надо - то конеч 1 вариант |
||||||||||
7
DrShad
04.06.12
✎
00:10
|
удалять можно и строки
|
||||||||||
8
dklushin
04.06.12
✎
00:10
|
(0) вопрос один: где ты это берёшь? конечно первый. Если вот тебе нужно перескакивать через элементы, знать индекс текущего элемента при выполнении, ещё что-то творить с индексами, то тут ещё можно подумать, а так....
Вариант 1 |
||||||||||
9
Нуф-Нуф
04.06.12
✎
00:11
|
Не?
Вариант 1 |
||||||||||
10
0_Serg_0
04.06.12
✎
00:12
|
(7)
ТЗ тогда собьётся |
||||||||||
11
DrShad
04.06.12
✎
00:13
|
(10) смотря как удалять
|
||||||||||
12
dklushin
04.06.12
✎
00:14
|
(10) вопрос зачем удалять в этом цикле, во время проверок?? Пишешь массив удаляемых записей, потом в отдельном цикле удаляешь. И делов
|
||||||||||
13
Asmody
04.06.12
✎
00:14
|
первый, остальное — говнокод.
и вообще, я предпочел бы "рубийный" вариант типа ТЗ.ДляКаждойСтроки { |строка| // что-то делаем со строкой } |
||||||||||
14
0_Serg_0
04.06.12
✎
00:16
|
(12)
а зачем потом и отдельно?? - если можно сразу просто обратным проходом |
||||||||||
15
Asmody
04.06.12
✎
00:17
|
(14) затем, что так быстрее
|
||||||||||
16
0_Serg_0
04.06.12
✎
00:18
|
(15)
для ЛЮБЫХ случаев?)) |
||||||||||
17
dklushin
04.06.12
✎
00:18
|
(14) ну можно и так.. Можно и прямым проходом без индексов(кажись, не пробовал), можно прямым с индексами и смещением счетчика на (-1)
|
||||||||||
18
lepesha
04.06.12
✎
00:19
|
Я бы еще и обратный порядок выборки строк организовал - а вдруг в процессе их количество изменится. Но вы на меня внимание не обращайте, я уже литруху виски выпел.
|
||||||||||
19
Asmody
04.06.12
✎
00:20
|
(16) в большинстве случаев
|
||||||||||
20
quest
04.06.12
✎
00:20
|
(13) я вообще бы предпочел как в Lisp'e
для преобразований (map (lambda (x) (что-то там делаем со строкой)) ТЗ) для удалений (filter (lambda (x) (условие по которому удаляем)) ТЗ) для вычислений (reduce (lambda (x y) (какая-то функция обработки строки)) ТЗ) - и просто и понятно но кто прикрутит lisp к 1C? |
||||||||||
21
dklushin
04.06.12
✎
00:21
|
(20) тогда уж в sql проще удаление.
|
||||||||||
22
0_Serg_0
04.06.12
✎
00:22
|
(17)
я про обратный имел в виду: всего = ТЗ.Количество(); для ИндексСтроки = 1 по всего цикл СтрокаТЗ = ТЗ[всего-ИндексСтроки]; |
||||||||||
23
Asmody
04.06.12
✎
00:23
|
(20) не, в лиспе скобочки считать запаришся
|
||||||||||
24
Asmody
04.06.12
✎
00:24
|
(21) мы же не только про удаление
|
||||||||||
25
dklushin
04.06.12
✎
00:24
|
я понял. (22) кстати обратный цикл в 1с-ке изврат, как и цикл с шагом <>0. Я долго был в шоке, когда узнал, что там нет оператора "шаг"
|
||||||||||
26
dklushin
04.06.12
✎
00:26
|
(24) тогда синтаксис UPDATE вполне подойдёт, мы же "что-то делаем со СтрокаТЗ;" только и всего.
|
||||||||||
27
dklushin
04.06.12
✎
00:27
|
(25)шагом не равным 1, ошибся
|
||||||||||
28
quest
04.06.12
✎
00:27
|
(21) каким боком тут sql?
(22) кстати, да. Забыл указать жтот вариант. (23) не прав. после месяца чтения кода даже их не замечаешь. (25) почему же изврат? просто непривычная для глаза конструкция |
||||||||||
29
Asmody
04.06.12
✎
00:28
|
(26) не факт, что мы изменяем строку, не факт, что мы изменяем только эту строку, не факт, что мы вообще что-то изменяем
|
||||||||||
30
quest
04.06.12
✎
00:29
|
(26) update не прокатит если надо получить результат вычисления функции над каким-то множество строк
|
||||||||||
31
dklushin
04.06.12
✎
00:32
|
(28)
(.21) таким же, как лисп и руби. (.25) перегруженная для глаз конструкция. в цикле ты как получишь результат над множеством строк? вторым циклом? |
||||||||||
32
dklushin
04.06.12
✎
00:33
|
(29) UPDATE .... SET ...=... WHERE ...
|
||||||||||
33
Asmody
04.06.12
✎
00:41
|
(32) не факт, что мы вообще что-то меняем! твоими словами, делаем SELECT
|
||||||||||
34
dklushin
04.06.12
✎
00:48
|
в (0) написано же: "что-то делаем со СтрокаТЗ;"
А селект можем селектом делать, я за sql, он в некоторых случаях даже рулит. |
||||||||||
35
Steel_Wheel
04.06.12
✎
01:04
|
Незачем вручную считать индекс: ты его нигде не используешь, кроме обхода.
Вариант 1 |
||||||||||
36
quest
04.06.12
✎
01:06
|
(34) что-то делаем со СтрокаТЗ - это может быть просто читаем и используем данные из нее
например для каждого х из ТЗ цикл если х.Сумма < 0 тогда продолжить; конецЕсли; суммирование = ОбработатьСумму(х.сумма); конеццикла то есть фактически, фильтруем ТЗ и по отфильтрованым строкам что-то считаем |
||||||||||
37
dklushin
04.06.12
✎
01:56
|
опять же не ясно куда деваем значение переменной "суммирование" и что делает ОбработатьСумму(). Реляционным запросом можно решить 90% задач =)
|
||||||||||
38
quest
04.06.12
✎
02:25
|
да просто реляционным запросом реши - собрать сумму так что каждая третья строка в ТЗ - умножена на 2 каждая вторая - на 3 и каждая 7 - 11.32
для ТЗ это сделать не вопрос - просто обойти. А для запроса? если что - я понимаю что это вариант из оставшися 10% которые не решаются запросами. Так что напрягаться над решением не нужно. |
||||||||||
39
quest
04.06.12
✎
02:26
|
(37) там ошибка строку суммирование = ОбработатьСумму(х.сумма); читать как суммирование = суммирование+ ОбработатьСумму(х.сумма);
просто писал с мобилы, пропустил. |
||||||||||
40
dklushin
04.06.12
✎
02:47
|
я как раз про этот случай из 10 % и подумал. Да, ну как раз для такого случая реляционный запрос не подходит))) Приходится напрягаться, но благо в T-SQL есть циклы, это не слишком напряжно. Но кстати и такое решается запросами)) но это уже для извращенцев
|
||||||||||
41
Loki_DelMar
04.06.12
✎
06:20
|
Определенно первый вариант, если не нужны индексы. Либо второй, если нужны.
Вариант 1 |
||||||||||
42
0xFFFFFF
04.06.12
✎
06:23
|
(0) Предлагаю 4й вариант. ТЗ в запрос, выгружаем результат в тз, тз в массив, обходим массив, получаем строки.
Ну можно еще че нить посложнее придумать. В этом цель опроса, так ведь? |
||||||||||
43
dva1c
04.06.12
✎
06:40
|
В типовых и в рекомендациях
Вариант 1 |
||||||||||
44
dva1c
04.06.12
✎
06:40
|
Можно использовать и...
Вариант 2 |
||||||||||
45
dva1c
04.06.12
✎
06:41
|
Все зависит от решения задачи.
|
||||||||||
46
ДенисЧ
04.06.12
✎
07:56
|
Извращенцы...
В цикле для каждого при удалении строки из ТЗ выборка не сбивается... Вариант 1 |
||||||||||
47
Vladal
04.06.12
✎
08:19
|
(46) вот-вот
Вариант 1 |
||||||||||
48
shamannk
04.06.12
✎
08:24
|
А если в первом варианте из этого же тз удалять строку то обходить тз цикл будет меньше раз на кол-во удаленных. Пример тз из 2строк 1ую удаляем и цикл завершается.
Вариант 2 |
||||||||||
49
Defender aka LINN
04.06.12
✎
08:28
|
(6) Я обхожусь без индекса при удалении. ЧЯДНТ?
Вариант 1 |
||||||||||
50
GomerSimpson
04.06.12
✎
08:53
|
В цикле для каждого обращение к строкам все равно происходит по индексу, который всегда увеличивается на 1.
Т.е. если мы в цикле удаляем строку, то следующая строка просто пропускается. Косяк. |
||||||||||
51
Помогите
04.06.12
✎
08:57
|
конечно
Вариант 1 |
||||||||||
52
Vladal
04.06.12
✎
09:03
|
(48) Та ты шо?
При удалении строки в цикле, надо его обходить с конца, вроде УдалитьСТроку(КолвоСтрок-ТекущийНомерСтроки+1) Но еще лучше, создать массив удаляемых строк и удалить их так. v8: Выборочное удаление строк документа |
||||||||||
53
Maxus43
04.06.12
✎
09:07
|
только так.
З.ы. для удаления строк по другому, типа 2 Вариант 1 |
||||||||||
54
PuhUfa
04.06.12
✎
09:12
|
1
Вариант 1 |
||||||||||
55
Steel_Wheel
04.06.12
✎
09:55
|
(53) Для удаления не подходит ни один из способов. Если удалять с индексами, надо идти с конца (такой вариант не предусмотрен) или дополнительно обрабатывать строку с индексом удаляемой строки после удаления ненужной (а это уже неэффективный код)
|
||||||||||
56
mirosh
04.06.12
✎
09:57
|
по методологии 1с конечно же
Вариант 1 |
||||||||||
57
Ахиллес
04.06.12
✎
10:05
|
Удобнее, когда точка выхода из функции 1, поэтому
Вариант 2 |
||||||||||
58
Ахиллес
04.06.12
✎
10:06
|
Но часто ленюсь и делаю, как короче.
Вариант 1 |
||||||||||
59
Ахиллес
04.06.12
✎
10:06
|
А вообще наплевать, такой фигнёй голову не забиваю.
|
||||||||||
60
kotletka
04.06.12
✎
10:11
|
Сторонники 1 удалите с его помощью в цикле некоторые строки
|
||||||||||
61
Ахиллес
04.06.12
✎
10:11
|
Не в ту тему ответил :-)
|
||||||||||
62
Defender aka LINN
04.06.12
✎
10:28
|
(60) Смотри и рыдай:
Вариант 1 - удалить строки с определенным значением колонки:
Вариант 2 - удалить строки по более сложному условию
|
||||||||||
63
0_Serg_0
04.06.12
✎
10:31
|
(62)
но ведь это не внутри варианта 1?!О_о |
||||||||||
64
0_Serg_0
04.06.12
✎
10:32
|
+ (63) не там где текст "что-то делаем со СтрокаТЗ;" ??
|
||||||||||
65
Defender aka LINN
04.06.12
✎
10:49
|
(63) Варианты 2 и 3 отличает получение количества строк, вариант 1 - использование цикла Для Каждого. Все признаки в наличии, в чем проблема?
|
||||||||||
66
GomerSimpson
04.06.12
✎
10:52
|
Удаление строки в цикле для каждого )))
УдалилиСтроку = Ложь; Для Каждого Строка Из ТЗ Цикл Если УдалилиСтроку Тогда Строка = ТЗ[ТЗ.Индекс(Строка)-1]; КонецЕсли; Если КакоеТоУсловие Тогда ТЗ.Удалить(Строка); УдалилиСтроку = Истина; Иначе УдалилиСтроку = Ложь; КонецЕсли; КонецЦикла; |
||||||||||
67
Defender aka LINN
04.06.12
✎
10:55
|
(66) Наверняка в медицине и для этого название найдется...
|
||||||||||
68
Infsams654
04.06.12
✎
11:02
|
В зависимости от того, что делаем со СтрокаТЗ.
Если просто в ней что-то меняем, то 1, если есть случай, что надо удалить, то (62) (т.к. в 1С есть эта фишка, double recept разработчикам) или (66)(что ближе к другим языкам программирования, медицину к (67)), если надо прервать цикл то последний пост v8: Философский вопрос о коде |
||||||||||
69
Steel_Wheel
04.06.12
✎
11:04
|
(60) В том виде, в каком есть, без копрокода варианты №№2 и 3 тоже не годятся для удаления
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |