|   |   | 
| 
 | Философский вопрос об оформлении кода - 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 тоже не годятся для удаления     | 
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |