Имя: Пароль:
1C
 
Почему короткий код считается крутым.
,
0 Kamelot
 
01.11.15
01:01
Почему считается что короткий код это признак мастерства, что то вроде: "- я вот тремя строчками написал, то что было 10-ю написано"
но то что было написано 10-ю легко читается, и внести изменения не составляет труда.
при уменьшении кода происходит практически обфускация и когда что-то нужно изменить проще выкинуть и написать заново.
Зачем люди стремятся к короткому коду вместо понятного кода?
1 PR третий
 
01.11.15
01:03
Кем считается?
И на каком языке?
2 Kamelot
 
01.11.15
01:12
на языке 1С,
например удаление строк из ТаблицыЗначений.
1 способ
МассивУдаляемых = Новый Массив;
Для каждого стр из ТаблицаДанных Цикл
//какое-то условие для удаляемой строки
МассивУдаляемых.Добавить(стр);
КонецЦикла;

Для каждого стр из МассивУдаляемых Цикл
ТаблицаДанных.Удадить(стр);
КонецЦикла;

2 способ
Для а = -ТаблицаДанных.Количество()+1 по 0 цикл
//какое-то условие для удаляемой строки
ТаблицаДанных.Удалить(ТаблицаДанных[-а]);
конеццикла;

в каком способе понятней что происходит?
3 Kamelot
 
01.11.15
01:20
или 3 способ, вообще без цикла, если условие удаление простое

ТаблицаДанных.Удалить(ТаблицаДанных.НайтиСтроки(Новый Структура("Колонка", Значение)));
4 Zamestas
 
01.11.15
01:22
(0) От лени.
5 PR третий
 
01.11.15
01:22
(2) Вообще-то второй способ лучше просто тупо потому что в нем не создается какой-то никому нахрен не нужный массив.
6 Serg_1960
 
01.11.15
01:29
"Краткость — сестра таланта"(Чехов)
"Тот истинный мудрец, кто многое умеет сказать коротко и ясно"(Аристофан)
"Величайшее из достижений оратора — не только сказать то, что нужно, но и не сказать того, что не нужно."(Цицирон)
7 Serg_1960
 
01.11.15
01:31
Применительно к теме - краткий код оптимальнее по производительности.
8 su_mai
 
01.11.15
03:34
(0) Основное занятие программиста, когда он не задействован в активной разработке - рефакторинг и оптимизация кода. :)
9 Сержант 1С
 
01.11.15
03:38
(0) перфекционизм. Иногда в ущерб задаче, иногда это способ оптимизировать задачу. Но всегда  -- самоутвердиться.
10 Web00001
 
01.11.15
05:31
Потому что могу?
Понравилось на хабре:

Программирование — Великая Игра. Оно поглощает игрока полностью, включая и душу и тело. Если ты попался — то ты попался, и ничего уже больше не имеет значения. Когда ты в следующий раз вылезешь из своей берлоги, вполне могут обнаружиться лишние десять киллограммов, борода до колен и такое количество пустых коробок из-под пиццы вокруг, что уже, наверное, наступила весна? Но для тебя это всё не важно. Потому, что твоя программа работает, а код быстр и элегантен. Ты победил.

Ты осознаешь, что некоторые люди считают тебя ботаном. Ну и что? Они — не Игроки. Они никогда не сражались с Windows и не строили отношения с Linux. Для них что «С++», что «Ь--» звучат одинаковой тарабарщиной. Да они вообще едва существуют. Как солдат или учёный, ты не сильно ждешь справедливой оценки своей работы от обывателей. Ты строишь нечто замысловатое и прекрасное. Они никогда не поймут.
http://megamozg.ru/post/1614/
11 hhhh
 
01.11.15
05:54
(7) обычно перебор в цикле оптимальнее всего, но некрасиво, поэтому программист ищет решение в одну строчку.
12 Pahomich
 
01.11.15
06:30
Вы все перепутали...надо сокращать не код, а время его работы. А сам код крайне необходимо было сокращать, когда память исчислялась килобайтами. Оттуда и пошло.
13 Гобсек
 
01.11.15
06:33
Сегодня есть смысл сокращать код тогда, когда это упрощает разработку и отладку. Иногда даже в ущерб производительности.
14 spectre1978
 
01.11.15
08:15
(0) потому что ассоциируется с изяществом, быстрой и безошибочной работой. В любых технических сферах деятельности ценится компактное и изящное.
15 фобка
 
01.11.15
08:25
(7) никакой связи нет
16 User_Agronom
 
01.11.15
08:41
(0) Анализировать короткий код гораздо легче. Приведённый тобой пример не особо нагляден.

Иногда часть кода лучше вынести в процедуру и её вызывать.

Даже есть такой метод: последовательной детализации.

http://school.xvatit.com/index.php?title=Вспомогательные_алгоритмы_и_подпрограммы

Программист, который не писал ничего крупного (а только мелочь) никогда не поймёт зачем выносить в процедуру код, который выполняется всего один раз.

О приведённых тобой примерах хорошо написано в (5). Если можно обойтись без массива, то массив не нужен.
17 Sserj
 
01.11.15
08:41
(15) Связь как минимум в меньшем расходе памяти и лишних тактов процессора.
Например код:
ПозицияВСписке = СписокЗначений.Индекс(ИскомоеЗначение);
СписокЗначений.Удалить(ПозицияВСписке);

Приведет к выделению памяти под новую переменную ПозцияВСписке и операцию присвоения ей значения функции Найти.
А короткий код:
СписокЗначений.Удалить(СписокЗначений.Индекс(ИскомоеЗначение));
Выполнится без этих двух операций.
18 User_Agronom
 
01.11.15
08:44
(17) А где будет находится результат выражения СписокЗначений.Индекс(ИскомоеЗначение), который потом будет передан методу Удалить?
19 Sserj
 
01.11.15
08:47
(18) Нигде она сразу скопируется во входной параметр функции Удалить
20 User_Agronom
 
01.11.15
08:51
(19) О! Это как?
Выполняется выражение, а результат никуда не пишется. Откуда он копироваться будет?
21 Sserj
 
01.11.15
08:56
Я не знаю как точно реализована виртуальная машина 1С.
Но в яве к примеру при загрузки объектов методы сразу создаются в памяти. То есть под аргументы уже выделена память.
Повторного выделения при вызове метода не требуется.
При выполеннии:
ПозицияВСписке = СписокЗначений.Индекс(ИскомоеЗначение);
Выделяется новая область в стеке и копируется в нее значение.
Затем значение из этой области копируется в заранее выделенное место аргумента процедуры Удалить.
Зачем эта лишняя развязка если можно сразу копировать результат функции Индекс в выделенную заранее под аргумент Удалить.
22 palpetrovich
 
01.11.15
09:12
(17) о, памятесрач наметился :)
имхо, выделение памяти одинаково в обоих случаях, единственное только, во втором случае ты не сможешь эту память "обнулить" до конца действия процедуры
23 Sserj
 
01.11.15
09:23
(22) Это утверждение верно если бы результат был ссылкой, тоесть фактически указателем на область памяти с результатом процедуры Индекс().
Примитивный тип будет храниться в отдельной области стека.
24 User_Agronom
 
01.11.15
09:46
Читаем: плохо (17) "...Приведет к выделению памяти под новую переменную..."
и хорошо (21) "...Выделяется новая область в стеке..." и (23) "...будет храниться в отдельной области..."

Т.е. бывает "хорошее" выделение памяти и "плохое". Но память то всё равно выделяется!
25 Sserj
 
01.11.15
10:00
(24) Когда что-то непонятно очень помогает рисовать
:)

В момент создания объекта СписокЗначений выделяется память под все его переменные и методы (включая аргументы, так как это по сути те-же переменные).

Если используешь короткую запись:
СписокЗначений.Удалить(СписокЗначений.Индекс(ИскомоеЗначение))
фактически вообще не происходит новых выделений памяти под результат, так как место под входной аргумент метода Удалить и результат метода Индекс уже зарезервировано в момент создания объекта СписокЗначений, производится только копирование из области отведенной под результат Индекс в область отведенную для аргумента Удалить.
Если используешь длинную версию проиходит выделение новой области под переменную ПозицияВСписке и копирование в нее из области отведенной для результат Индекс, а затем копирование из этой Переменной в область отведенную под аргумент Удалить.
26 User_Agronom
 
01.11.15
10:16
(25) Продолжу: и как только процедура (или функция) завершаются, то память, выделенная под локальную переменную ПозицияВСписке очищается.

Поэтому, с точки зрения приложения, дополнительные локальные переменные не увеличивают объем памяти, требующийся под работу приложения.
27 oslokot
 
01.11.15
10:33
код в 1с? это слишком громко. это текст для интерпретатора)
28 Mikeware
 
01.11.15
10:56
(27) (27) даже этот текст может быть написан красиво и эффективно. "Краткость" не показатель эффективности и прочего, но как правило, более короткий код написан более обдуманно, легче читается и эффективнее работает. (Хотя хаки я не одобряю - несмотря на краткость и эффективность они бывают не всегда понятны)
29 Sserj
 
01.11.15
10:59
(26) Никуда она не очищается.
Код методов он один для всех объектов. У тебя может быть тысяча объектов СписокЗначений, но в памяти методы скомпилирвоаны в единственном экземпляре. И память под аргументы в единственном экземпляре для всех выделена.
А как там работает сборка мусора в 1С неведомо и когда на самом деле память будет отдана покрыто тайной.
30 oslokot
 
01.11.15
11:04
(28) согласен
31 oslokot
 
01.11.15
11:08
я уже давно всоставную пишу, например

т.найтистроки(новый структура("колонка1, колонка2", значение1, значение2)).Количество()
...
запрос().выполнить().выгрузить().выгрузитьколонку("имя")
и т.д.

раньше, разделял всё
32 Rovan
 
гуру
01.11.15
11:10
Для а = -ТаблицаДанных.Количество()+1 по 0 цикл
//какое-то условие для удаляемой строки

ТаблицаДанных.Удалить(-а);
конеццикла;
33 ДенисЧ
 
01.11.15
11:14
(31) Я за такой код сотрудников когда-то штрафовал.
34 ДенисЧ
 
01.11.15
11:15
(25) "Если используешь короткую запись:
СписокЗначений.Удалить(СписокЗначений.Индекс(ИскомоеЗначение))
фактически вообще не происходит новых выделений памяти под результат"

Это ложь, обман и просто ямщикоизображение.
35 Vovan1975
 
01.11.15
11:16
(0) а вы когда-нибудь слышали про развертку циклов?
36 Vovan1975
 
01.11.15
11:17
(35) + или выравнивание данных в памяти?
37 oslokot
 
01.11.15
11:18
(33) чего так?)
38 ДенисЧ
 
01.11.15
11:18
(35) (36) Если ты думаешь, что интерпретатор 1с занимается такой фигнёй, то ты сильно ошибаешься
39 Vovan1975
 
01.11.15
11:19
(37) что произойдет если запрос будет пустым?
40 ДенисЧ
 
01.11.15
11:19
(37) Несопровождаемый код, совершенно неприменимый в отладке. И понятный (изредка) только написателю оного.
41 oslokot
 
01.11.15
11:22
(39) пустой список
(40) поржал
42 Vovan1975
 
01.11.15
11:26
(41) пустой список

отлично, надо еще цикл с нопами вставить для скорости
43 Pahomich
 
01.11.15
11:31
Код написанный на страницу и в несколько строчек может транслироваться интерпретатором в один и тот же машинный код...
PS Крутые яйца менее полезны, чем свежие или всмятку, если не заражены...
44 Vovan1975
 
01.11.15
11:42
(43) не порти интригу
45 Rovan
 
гуру
01.11.15
11:43
46 Vovan1975
 
01.11.15
11:43
вообще эта ветка наглядно демонстрирует пользу высшего образования
47 Rovan
 
гуру
01.11.15
11:46
Рекомендации: какой цикл в 1С работает быстрее
http://habrahabr.ru/post/245687/
48 Rovan
 
гуру
01.11.15
11:48
(43) к самому выполняемому коду еще привязаны метки для отладки.... меньше строк кода - меньше меток
49 Asmody
 
01.11.15
11:52
(48) очевидно, что итератор работает быстрее, чем взятие по индексу.
50 Мэс33
 
01.11.15
12:15
А если завтра в продакшн, а на рефакторинг времени нет?
51 User_Agronom
 
01.11.15
12:22
(50) Если работает правильно, то норм.

Потом будет задача оптимизировать алгоритм (ускорить или ещё что-нибудь)
52 Lama12
 
01.11.15
12:37
(0)ИМХО. Во времена слабых машин, код оптимизировали либо под производительность, либо под объем используемой памяти. Сейчас принято оптимизировать под удобство поддержки (модификации). Т.е. код должен быть читаемым.
Так что, связи с длиной кода - не вижу.
53 viraboy
 
01.11.15
12:39
(0) Ознакомьтесь с трудами Макконела, может поймете для себя какой код считается крутым.
54 viraboy
 
01.11.15
12:40
+(53) Ну и не забывайте про работу оптимизаторов в компиляторах. Крутой код - который легко читать и сопровождать
55 dmpl
 
01.11.15
13:34
(19) С переменной, не используемой далее, все будет точно так же. Ну, если компилятор нормальный.
56 H A D G E H O G s
 
01.11.15
13:39
(47) тупость, вызванная незнанием
57 Mikeware
 
01.11.15
13:41
(55)но тут-то не компилятор....
А так да, оптимизирующиее компиляторы многие огрехи кодирования исправляют. Но они не могутисправить кривой алгоритм.
58 dmpl
 
01.11.15
13:42
(52) Дело в том, что современные компиляторы уже умеют многое сокращать. Например, если ты где-то пишешь а=б (имеются в виду простые типы), то компилятор вообще игнорирует это, он у себя отмечает, что теперь по такому-то адресу лежат а и б, и пока что-то из них не будет изменено (а второе значение будет использовано далее в коде) - удвоения выделения памяти и копирования не произойдет.

(57) Ну, судя по возможности поставки без исходного кода - все-таки что-то там компилируется.
59 Garykom
 
гуру
01.11.15
13:53
(2) оба способа и 3-й тоже го..но

правильный это перенос нужных (для оставления) строчек в новую ТЗ
60 Fl0Mаsтер
 
01.11.15
14:28
(59) Это чего это? Создание ещё одной ТЗ - бред.
61 GROOVY
 
01.11.15
14:32
А, хохму с быстродействием модуля, написанного в одну строку, уже обсуждали?
62 Sserj
 
01.11.15
14:46
(58) Компиляторы работают долго и вдумчиво, 1С интерпретирует на ходу у него нет возможности строить графы вызовов. Потому не будет никакой оптимизации а-ля inline.
63 dmpl
 
01.11.15
16:08
(60) Удаление построчно большого числа строк из большой таблицы может оказаться медленнее создания новой таблицы.

(62) С чего ты взял, что интерпретирует на ходу? Само наличие глючащего кеша говорит о том, что там не чистый интерпретатор.
64 mTema32
 
01.11.15
16:34
(61) ссылка выше есть)
65 КонецЦикла
 
01.11.15
22:10
Он должен быстро работать и легко модифицироваться/читаться, какая-то логика должна прослеживаться
Выеживаться ради краткости типа ?(sdlfjlsdkfj,?(dsfsdf)...) - не понимаю такого
66 Tarlich
 
01.11.15
22:16
Делаю ставку на удобочитаемость ....
67 TormozIT
 
гуру
01.11.15
23:05
(3) Это нерабочий способ. Он выдаст ошибку.
68 Balabass
 
02.11.15
01:38
А еще можно на богомерзком писать. Говорят что работает быстрее.
69 Злопчинский
 
02.11.15
02:04
ну судя по мностроидальным типовым - там вообще ничего не экономили. принципиально. наоборот даже - ИБД явно есть