Имя: Пароль:
1C
1С v8
Как вы думаете какой код лучше?
0 xReason
 
11.12.13
22:01
1. Свой вариант 70% (7)
2. Вариант 2 20% (2)
3. Вариант 1 10% (1)
Всего мнений: 10

Как вы думаете какой код лучше?

Вариант 1
------------------

Функция КлючиСтруктурыВСтроку(Структура, Разделитель = ",") Экспорт
    Результат = "";
    Для Каждого Элемент Из Структура Цикл
        СимволРазделителя = ?(ПустаяСтрока(Результат), "", Разделитель);
        Результат = Результат + СимволРазделителя + Элемент.Ключ;
    КонецЦикла;
    Возврат Результат;
КонецФункции


Вариант 2
-----------------
Функция КлючиСтруктурыВСтроку(Структура, Разделитель = ",") Экспорт
    Результат = "";
    Для Каждого Элемент Из Структура Цикл
        Результат = Результат + Элемент.Ключ + СимволРазделителя;
    КонецЦикла;
    Возврат Лев(Результат,СтрДлина(Результат)-1);
КонецФункции

PS Подразумеваем, что Структура всегда имеет минимум 1 значение
1 ДенисЧ
 
11.12.13
22:03
экви... ну понимаешь
2 фобка
 
11.12.13
22:04
первый, ибо он по смыслу написан, а не по результату, поэтому его проще понять

Вариант 1
3 Eugeneer
 
11.12.13
22:04
автор чекнутый ботан?
4 xReason
 
11.12.13
22:07
(3) Автор тут уже какой год сидит и темы у него разнообразные ))0
5 фобка
 
11.12.13
22:08
хотя, с другой стороны, пофиг

Функция КлючиСтруктурыВСтроку(Структура, Разделитель = ",") Экспорт
    Результат = "";
    Для Каждого Элемент Из Структура Цикл
        Результат = Результат + ?(ПустаяСтрока(Результат), "", Разделитель) + Элемент.Ключ;
    КонецЦикла;
    Возврат Результат;
КонецФункции

Свой вариант
6 xReason
 
11.12.13
22:12
(5) но в каждой итерации делать проверку на условие, это же медленная операция
7 фобка
 
11.12.13
22:13
(6) у тебя миллион итераций? нет? тогда плевать
8 serffer
 
11.12.13
22:18
у 1 читабельность лучше, но в цикле больше операций - плохо на больших объемах

Вариант 2
9 xReason
 
11.12.13
22:18
(7) " Но каждый грамм метала должен чувствовать в себе сталь.
    Мы в любой заготовке обязаны увидеть деталь."

ну или - копейка рубль бережет

А вдруг вот жизнь подкинет массив с миллионом
10 фобка
 
11.12.13
22:27
(9) ну, вот, как подкинет - так и оптимизируешь)
Но ты прав, всё начинается с малого - задумайся об этом, читая в очередной раз чужой код или создавая свой новый быстрый.. имхо, лучше по потребностям и без излишней хитрости по мелочам
11 Лефмихалыч
 
11.12.13
22:30
Функция КлючиСтруктурыВСтроку(Структура, Разделитель = ",") Экспорт
    Результат = "";
    Для Каждого Элемент Из Структура Цикл
        Результат = Результат + Символы.ПС + Элемент.Ключ;
    КонецЦикла;
    Результат = СтрЗаменить(СокрЛП(Результат), Символы.ПС, Разделитель);
    Возврат Результат;
КонецФункции

Свой вариант
12 Лефмихалыч
 
11.12.13
22:33
первый вариант однозначно хуже всех остальных, т.к. у него цикломатическая сложность самая большая.
Второй вариант плох тем, что там волшебные числа.
13 фобка
 
11.12.13
22:35
(11) СокрЛП() убирает табуляцию?
14 Arh01
 
11.12.13
22:37
(0) во 2 варианте ошибка.
15 Лефмихалыч
 
11.12.13
22:39
(13) да. Но ПС - не табуляция
16 фобка
 
11.12.13
22:39
+13 даже если убирает, все равно не универсально, если в строке таб окажется
17 фобка
 
11.12.13
22:40
(15) ок
18 Лефмихалыч
 
11.12.13
22:40
(16) откуда он там окажется?
19 Лефмихалыч
 
11.12.13
22:42
+(14) кстати, да
КлючиСтруктурыВСтроку(Структура, "Вариант 2 - гогно")
20 xReason
 
11.12.13
22:44
прогнал тест на 100 тыс записей

вариант 1 - 263 сек
вариант 2 - 273 сек
21 xReason
 
11.12.13
22:44
(14) Ошибку видел, считай, что там правильное название переменной
22 фобка
 
11.12.13
22:46
(18) в тексте не может быть перевода строки?)
(19) там еще и по синтаксису очепятка)
23 Лефмихалыч
 
11.12.13
22:47
(21) в функцию во втором параметре могут передать больше одного символа. Там две стрдлины надо, чтобы правильно работало.

(22) в какой версии платформы ключ структуры может содержать табуляцию? Или лучше спросить - в какой параллельной вселенной?
24 xReason
 
11.12.13
22:48
(21) Окей принимается, но вопрос был о другом
25 xReason
 
11.12.13
22:49
это для (23) написал
26 фобка
 
11.12.13
22:50
(23) точно, тут же "Элемент.Ключ", убедил
27 Лефмихалыч
 
11.12.13
22:51
(24) вот тут развернутый ответ (12)
28 фобка
 
11.12.13
22:51
(20) круто, теперь сделай структуру из 10+ ключей
29 xReason
 
11.12.13
23:02
вариант в (5) -285 сек
вариант 1 - 283 сек

фигня какая-то

по сути можно сказать, что одинаково

Проблема скорее всего упирается в конкатенацию строка Результат. Она становиться очень большой и из-за нее все тормоза
30 фобка
 
11.12.13
23:09
(29) у тебя структура из 100к ключей или 100к вызовов функции?
31 Salimbek
 
11.12.13
23:16
Как-то так:

Функция КлючиСтруктурыВСтроку(Структура, Разделитель = ",") Экспорт
    Результат = "";
    СимволРазделителя = "";
    Для Каждого Элемент Из Структура Цикл
        Результат = Результат + СимволРазделителя + Элемент.Ключ;
    СимволРазделителя = Разделитель;
    КонецЦикла;
    Возврат Результат;
КонецФункции
32 Salimbek
 
11.12.13
23:16
+ голосовалка

Свой вариант
33 Одесса
 
11.12.13
23:26
Функция КлючиСтруктурыВСтроку(Структура, Разделитель = ",") Экспорт

Результат = "";
СимволРазделителя = "";

Для Каждого Элемент Из Структура Цикл
         Результат = Результат + СимволРазделителя + Элемент.Ключ;
         СимволРазделителя = Разделитель;
КонецЦикла;

Возврат Результат;

КонецФункции
34 МишКа
 
11.12.13
23:27
(0) Один код не может быть лучше другого, по определению.
35 Eugeneer
 
11.12.13
23:31
в строну внутр и из строки внутре видимо никого в этой теме не учили. какие то дурацкие фиклы по массиву с разделителями.
36 Eugeneer
 
11.12.13
23:32
+(35) программисты фиговы.
37 Мимохожий Однако
 
11.12.13
23:33
(36)Продемонстрируй класс. Выдай свой вариант.
38 Eugeneer
 
11.12.13
23:33
даже пилять в сабже тупой код в обоих вариантах
39 Eugeneer
 
11.12.13
23:34
(37) синтаксис открой неуч.
40 Eugeneer
 
11.12.13
23:34
ЗначениеВСтрокуВнутр
ЗначениеИзСтрокиВнутр

две строчки кода.
41 Мимохожий Однако
 
11.12.13
23:35
А как быть с разделитель. Например ";"?
42 Одесса
 
11.12.13
23:36
(31) Опередил
(34) Как это не может? Скажи еще, что гуавнокода не бывает.
А так-то, у каждого додика своя методика. Поэтому

Свой вариант
43 Eugeneer
 
11.12.13
23:36
Всех кто в этой теме двоешники, кроме естественно меня, как настоящего пропитанного 1Ска.
44 Мимохожий Однако
 
11.12.13
23:37
(39)"хамишь, парниша"
(43)слифффф
45 МишКа
 
11.12.13
23:38
(43) Ничо, что у тебя результат немного другой, чем в сабже?
46 Eugeneer
 
11.12.13
23:38
(44) ну я так и знал что все сольетесь как я прийду и покажу всего две строчки кода.
47 Одесса
 
11.12.13
23:38
(43) Знаем, знаем, "Одна я умная, в белом пальто стою красивая"
48 Eugeneer
 
11.12.13
23:39
(45) а ты мозг свой включи. Нафига ему нужна эту функция.
Ответ просто - чтобы потом еще иметь другую функцию которая это считает обратно.
49 Мимохожий Однако
 
11.12.13
23:39
Перенедопил. ИМХО.
50 Eugeneer
 
11.12.13
23:40
Скорее всего автор пытается в строку запихнуть структуру не ведаю про СтрокуВнтур, скорее всего пытается изобрести сохранение настроек.
И так же обратно потом будет мозг делать чтобы эту строку разобрать обратно.
51 МишКа
 
11.12.13
23:41
(42) Вот так вот - не может. Одна воля ничуть не лучше и не хуже другой воли.
Твоя эффективность определяется не тем, какой код ты пишешь.
А тем, можешь ли ты здесь и сейчас написать код и сколько времени у тебя это займет.
52 Мимохожий Однако
 
11.12.13
23:41
(50)Гадать можно и на кофейной гуще, а ответить конкретным кодом не получается.
53 МишКа
 
11.12.13
23:43
(48) Эта функция ему нужна, чтобы задать вопрос на мисте.
Это же очевидно.
54 Eugeneer
 
11.12.13
23:44
Я не вижу никаких других дурацких задач шде бы из структуры нужно было сделать строку с разделителями строк. Да еще в ракурсе какого то ключа.
Поэтому вы все и двоешники.

И двешники потому что:

КолВсего = Структура.Количество();
Сч = 0;

Результат = "";
    Для Каждого Элемент Из Структура Цикл
Сч = Сч+1;

Если Сч = КолВсего
        Результат = Результат + Элемент.Ключ;
Иначе
Результат = Результат + Элемент.Ключ + СимволРазделителя;
КонецЕсли;
    КонецЦикла;
55 х86
 
11.12.13
23:46
(54)бггг
56 Мимохожий Однако
 
11.12.13
23:47
(54)"СтрокуВнтур" забыл?
57 Eugeneer
 
11.12.13
23:50
(56) это вообще верхсупермегабыстрый метод 1С. я бы сказал это самый крутой встроенный метод 1С
58 Eugeneer
 
11.12.13
23:50
во все времена
59 Eugeneer
 
11.12.13
23:50
он творит чудаса
60 Eugeneer
 
11.12.13
23:52
неправильно выразился: это самый крутой метод 1С из всей 1С вместе взятой.
61 Шурик71
 
11.12.13
23:54
извращенцы, блин.

я использую в зависимости от фазу луны вариант 2 и тот, который похож на (5), только используя сред(Результат,2). При этом это не имеет совсем никакого значения.

И пох на разницу в 0,01  мс. Ибо итераций < 100000000.

И в 50% случаев прав (40), ибо с вероятностью 50% применимо (48). Но жизнь все же многообразней, поэтому только 50% за этот вариант.
62 ivanovnm
 
12.12.13
00:00
(40) Не взлетит если структуру заполнить, а она на 99,999% будет заполнена
63 ivanovnm
 
12.12.13
00:02
(0) Сейчас вечером, в пледе, после горячего чая можно решать что быстрее, а за 2 часа до окончания рабочего дня оба метода будут одинаково эффективны.
64 ivanovnm
 
12.12.13
00:04
(0) Только можно поправить

...
Результат = Разделитель + Результат + Элемент.Ключ;
....
Возврат Сред(Результат, 2);
....

Вариант 2
65 ivanovnm
 
12.12.13
00:06
(64) Результат = Результат + Разделитель + Элемент.Ключ;
66 Eugeneer
 
12.12.13
00:07
(64)  - (54) не пробовал посмотреть?
67 Eugeneer
 
12.12.13
00:09
могу даже красивее нарисовать из (54) если кому не нравиться!

КолВсего = Структура.Количество();
Сч = 0;

Результат = "";
Для Каждого Элемент Из Структура Цикл
Сч = Сч+1;
Результат = Результат + Элемент.Ключ +  ?(Сч = КолВсего,"",СимволРазделителя);
КонецЦикла;
68 ivanovnm
 
12.12.13
00:19
(67) "Сч = Сч+1;" и "?(Сч = КолВсего,"",СимволРазделителя)" лишние
69 Classic
 
12.12.13
00:32
(60)
Самый крутой это ЗаполнитьЗначенияСвойств()
70 Classic
 
12.12.13
00:33
(31)
Вот оно
71 Classic
 
12.12.13
00:34
(48)
Или передать в другую программу. Но ты, как истинный одинэсник, отрицаешь существование других программ. Ибо ересь
72 ivanovnm
 
12.12.13
00:44
(71) ибо зоопарк
73 xReason
 
12.12.13
01:08
все спасибо, вот такая миста мне нравится

   Eugeneer - получает отедбный приз - плесневелую коробку 1С 7.7

ЗаполнитьЗначенияСвойств - отличный метод, но всегда страшно, как оно там работает
74 МихаилМ
 
12.12.13
01:59
Функция КлючиСтруктурыВСтроку(Структура, Разделитель = ",") Экспорт
Перем Счётчик;
    Результат = ""+Структура[0].Ключ;
    
    Для Счётчик  = 1 по Структура.Количество() Цикл
        Результат = Результат + СимволРазделителя + Структура[Счётчик].Ключ;
    КонецЦикла;
    Возврат Результат;
КонецФункции

Свой вариант
75 Dethmont
 
12.12.13
02:19
(74) Вывалиться с ошибкой без минус 1
(74)+

Свой вариант
76 programmist1cswworld
 
12.12.13
06:33
(0) у меня такой код программа пишет
77 xReason
 
12.12.13
07:15
(74)

Перем Счётчик; // - привет мамонтам )))
78 dauster
 
12.12.13
07:30
(74) и давно к элементам структуры можно стало обращаться по индексу?
79 vde69
 
модератор
12.12.13
08:16
мой вариант,
1. пофиг на размерность структуры (отображает корректно пустую)
2. возможен разделитель из нескольких символов
3. быстрый
-----------------
Функция КлючиСтруктурыВСтроку(Структура, Разделитель = ",") Экспорт
    СимволРазделителя = ?(ПустаяСтрока(Результат), "", Разделитель);
    Результат = СимволРазделителя;
    Для Каждого Элемент Из Структура Цикл
        Результат = Результат + Элемент.Ключ + СимволРазделителя;
    КонецЦикла;
    Возврат Сред(Результат,СтрДлина(СимволРазделителя)+1);
КонецФункции
80 vde69
 
модератор
12.12.13
08:17
(79)+

Свой вариант
81 Wasya
 
12.12.13
08:20
Функция КлючиСтруктурыВСтроку(Структура, Разделитель = ",") Экспорт
    Результат = "";
    Для Каждого Элемент Из Структура Цикл
        Результат = Результат + Разделитель + Элемент.Ключ;
    КонецЦикла;
    Возврат Сред(Результат,2);
КонецФункции
82 dmpl
 
12.12.13
08:35
(0) Из представленных 2 - первый, т.к. корректно отработает при любой длине разделителя. А так - я использую флаг ЭтоПерваяИтерация - с ним быстрее будет, чем с определением, пустая ли строка.
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство. Фредерик Брукс-младший