Почему короткий код считается крутым. #757215


#0 by Kamelot
Почему считается что короткий код это признак мастерства, что то вроде: "- я вот тремя строчками написал, то что было 10-ю написано" но то что было написано 10-ю легко читается, и внести изменения не составляет труда. при уменьшении кода происходит практически обфускация и когда что-то нужно изменить проще выкинуть и написать заново. Зачем люди стремятся к короткому коду вместо понятного кода?
#1 by PR третий
Кем считается? И на каком языке?
#2 by Kamelot
на языке 1С, например удаление строк из ТаблицыЗначений. 1 способ МассивУдаляемых = Новый Массив; в каком способе понятней что происходит?
#3 by Kamelot
или 3 способ, вообще без цикла, если условие удаление простое ТаблицаДанных.Удалить(ТаблицаДанных.НайтиСтроки(Новый Структура("Колонка", Значение)));
#4 by Zamestas
От лени.
#5 by PR третий
Вообще-то второй способ лучше просто тупо потому что в нем не создается какой-то никому нахрен не нужный массив.
#6 by Serg_1960
"Тот истинный мудрец, кто многое умеет сказать коротко и ясно"(Аристофан) "Величайшее из достижений оратора — не только сказать то, что нужно, но и не сказать того, что не нужно."(Цицирон)
#7 by Serg_1960
Применительно к теме - краткий код оптимальнее по производительности.
#8 by su_mai
Основное занятие программиста, когда он не задействован в активной разработке - рефакторинг и оптимизация кода. :)
#9 by Сержант 1С
перфекционизм. Иногда в ущерб задаче, иногда это способ оптимизировать задачу. Но всегда  -- самоутвердиться.
#10 by Web00001
Потому что могу? Понравилось на хабре: Программирование — Великая Игра. Оно поглощает игрока полностью, включая и душу и тело. Если ты попался — то ты попался, и ничего уже больше не имеет значения. Когда ты в следующий раз вылезешь из своей берлоги, вполне могут обнаружиться лишние десять киллограммов, борода до колен и такое количество пустых коробок из-под пиццы вокруг, что уже, наверное, наступила весна? Но для тебя это всё не важно. Потому, что твоя программа работает, а код быстр и элегантен. Ты победил. Ты осознаешь, что некоторые люди считают тебя ботаном. Ну и что? Они — не Игроки. Они никогда не сражались с Windows и не строили отношения с Linux. Для них что «С++», что «Ь--» звучат одинаковой тарабарщиной. Да они вообще едва существуют. Как солдат или учёный, ты не сильно ждешь справедливой оценки своей работы от обывателей. Ты строишь нечто замысловатое и прекрасное. Они никогда не поймут.
#11 by hhhh
обычно перебор в цикле оптимальнее всего, но некрасиво, поэтому программист ищет решение в одну строчку.
#12 by Pahomich
Вы все перепутали...надо сокращать не код, а время его работы. А сам код крайне необходимо было сокращать, когда память исчислялась килобайтами. Оттуда и пошло.
#13 by Гобсек
Сегодня есть смысл сокращать код тогда, когда это упрощает разработку и отладку. Иногда даже в ущерб производительности.
#14 by spectre1978
потому что ассоциируется с изяществом, быстрой и безошибочной работой. В любых технических сферах деятельности ценится компактное и изящное.
#15 by фобка
никакой связи нет
#16 by User_Agronom
Анализировать короткий код гораздо легче. Приведённый тобой пример не особо нагляден. Иногда часть кода лучше вынести в процедуру и её вызывать. Даже есть такой метод: последовательной детализации. Программист, который не писал ничего крупного (а только мелочь) никогда не поймёт зачем выносить в процедуру код, который выполняется всего один раз. О приведённых тобой примерах хорошо написано в . Если можно обойтись без массива, то массив не нужен.
#17 by Sserj
Связь как минимум в меньшем расходе памяти и лишних тактов процессора. Например код: Приведет к выделению памяти под новую переменную ПозцияВСписке и операцию присвоения ей значения функции Найти. А короткий код: СписокЗначений.Удалить(СписокЗначений.Индекс(ИскомоеЗначение)); Выполнится без этих двух операций.
#18 by User_Agronom
А где будет находится результат выражения СписокЗначений.Индекс(ИскомоеЗначение), который потом будет передан методу Удалить?
#19 by Sserj
Нигде она сразу скопируется во входной параметр функции Удалить
#20 by User_Agronom
О! Это как? Выполняется выражение, а результат никуда не пишется. Откуда он копироваться будет?
#21 by Sserj
Я не знаю как точно реализована виртуальная машина 1С. Но в яве к примеру при загрузки объектов методы сразу создаются в памяти. То есть под аргументы уже выделена память. Повторного выделения при вызове метода не требуется. При выполеннии: ПозицияВСписке = СписокЗначений.Индекс(ИскомоеЗначение); Выделяется новая область в стеке и копируется в нее значение. Затем значение из этой области копируется в заранее выделенное место аргумента процедуры Удалить. Зачем эта лишняя развязка если можно сразу копировать результат функции Индекс в выделенную заранее под аргумент Удалить.
#22 by palpetrovich
о, памятесрач наметился :) имхо, выделение памяти одинаково в обоих случаях, единственное только, во втором случае ты не сможешь эту память "обнулить" до конца действия процедуры
#23 by Sserj
Это утверждение верно если бы результат был ссылкой, тоесть фактически указателем на область памяти с результатом процедуры Индекс. Примитивный тип будет храниться в отдельной области стека.
#24 by User_Agronom
Читаем: плохо "...Приведет к выделению памяти под новую переменную..." и хорошо "...Выделяется новая область в стеке..." и "...будет храниться в отдельной области..." Т.е. бывает "хорошее" выделение памяти и "плохое". Но память то всё равно выделяется!
#25 by Sserj
Когда что-то непонятно очень помогает рисовать :) В момент создания объекта СписокЗначений выделяется память под все его переменные и методы (включая аргументы, так как это по сути те-же переменные). Если используешь короткую запись: СписокЗначений.Удалить(СписокЗначений.Индекс(ИскомоеЗначение)) фактически вообще не происходит новых выделений памяти под результат, так как место под входной аргумент метода Удалить и результат метода Индекс уже зарезервировано в момент создания объекта СписокЗначений, производится только копирование из области отведенной под результат Индекс в область отведенную для аргумента Удалить. Если используешь длинную версию проиходит выделение новой области под переменную ПозицияВСписке и копирование в нее из области отведенной для результат Индекс, а затем копирование из этой Переменной в область отведенную под аргумент Удалить.
#26 by User_Agronom
Продолжу: и как только процедура (или функция) завершаются, то память, выделенная под локальную переменную ПозицияВСписке очищается. Поэтому, с точки зрения приложения, дополнительные локальные переменные не увеличивают объем памяти, требующийся под работу приложения.
#27 by oslokot
код в 1с? это слишком громко. это текст для интерпретатора)
#28 by Mikeware
даже этот текст может быть написан красиво и эффективно. "Краткость" не показатель эффективности и прочего, но как правило, более короткий код написан более обдуманно, легче читается и эффективнее работает. (Хотя хаки я не одобряю - несмотря на краткость и эффективность они бывают не всегда понятны)
#29 by Sserj
Никуда она не очищается. Код методов он один для всех объектов. У тебя может быть тысяча объектов СписокЗначений, но в памяти методы скомпилирвоаны в единственном экземпляре. И память под аргументы в единственном экземпляре для всех выделена. А как там работает сборка мусора в 1С неведомо и когда на самом деле память будет отдана покрыто тайной.
#30 by oslokot
согласен
#31 by oslokot
я уже давно всоставную пишу, например т.найтистроки(новый структура("колонка1, колонка2", значение1, значение2)).Количество ... запрос.выполнить.выгрузить.выгрузитьколонку("имя") и т.д. раньше, разделял всё
#33 by ДенисЧ
Я за такой код сотрудников когда-то штрафовал.
#34 by ДенисЧ
"Если используешь короткую запись: СписокЗначений.Удалить(СписокЗначений.Индекс(ИскомоеЗначение)) фактически вообще не происходит новых выделений памяти под результат" Это ложь, обман и просто ямщикоизображение.
#35 by Vovan1975
а вы когда-нибудь слышали про развертку циклов?
#36 by Vovan1975
+ или выравнивание данных в памяти?
#37 by oslokot
чего так?)
#38 by ДенисЧ
Если ты думаешь, что интерпретатор 1с занимается такой фигнёй, то ты сильно ошибаешься
#39 by Vovan1975
что произойдет если запрос будет пустым?
#40 by ДенисЧ
Несопровождаемый код, совершенно неприменимый в отладке. И понятный (изредка) только написателю оного.
#41 by oslokot
пустой список поржал
#42 by Vovan1975
пустой список отлично, надо еще цикл с нопами вставить для скорости
#43 by Pahomich
Код написанный на страницу и в несколько строчек может транслироваться интерпретатором в один и тот же машинный код... PS Крутые яйца менее полезны, чем свежие или всмятку, если не заражены...
#44 by Vovan1975
не порти интригу
#45 by Rovan
в тему ветки
#46 by Vovan1975
вообще эта ветка наглядно демонстрирует пользу высшего образования
#47 by Rovan
Рекомендации: какой цикл в 1С работает быстрее
#48 by Rovan
к самому выполняемому коду еще привязаны метки для отладки.... меньше строк кода - меньше меток
#49 by Asmody
очевидно, что итератор работает быстрее, чем взятие по индексу.
#50 by Мэс33
А если завтра в продакшн, а на рефакторинг времени нет?
#51 by User_Agronom
Если работает правильно, то норм. Потом будет задача оптимизировать алгоритм (ускорить или ещё что-нибудь)
#52 by Lama12
ИМХО. Во времена слабых машин, код оптимизировали либо под производительность, либо под объем используемой памяти. Сейчас принято оптимизировать под удобство поддержки (модификации). Т.е. код должен быть читаемым. Так что, связи с длиной кода - не вижу.
#53 by viraboy
Ознакомьтесь с трудами Макконела, может поймете для себя какой код считается крутым.
#54 by viraboy
+ Ну и не забывайте про работу оптимизаторов в компиляторах. Крутой код - который легко читать и сопровождать
#55 by dmpl
С переменной, не используемой далее, все будет точно так же. Ну, если компилятор нормальный.
#56 by H A D G E H O G s
тупость, вызванная незнанием
#57 by Mikeware
но тут-то не компилятор.... А так да, оптимизирующиее компиляторы многие огрехи кодирования исправляют. Но они не могутисправить кривой алгоритм.
#58 by dmpl
Дело в том, что современные компиляторы уже умеют многое сокращать. Например, если ты где-то пишешь а=б (имеются в виду простые типы), то компилятор вообще игнорирует это, он у себя отмечает, что теперь по такому-то адресу лежат а и б, и пока что-то из них не будет изменено (а второе значение будет использовано далее в коде) - удвоения выделения памяти и копирования не произойдет. Ну, судя по возможности поставки без исходного кода - все-таки что-то там компилируется.
#59 by Garykom
оба способа и 3-й тоже го..но правильный это перенос нужных (для оставления) строчек в новую ТЗ
#60 by Fl0Mаsтер
Это чего это? Создание ещё одной ТЗ - бред.
#61 by GROOVY
А, хохму с быстродействием модуля, написанного в одну строку, уже обсуждали?
#62 by Sserj
Компиляторы работают долго и вдумчиво, 1С интерпретирует на ходу у него нет возможности строить графы вызовов. Потому не будет никакой оптимизации а-ля inline.
#63 by dmpl
Удаление построчно большого числа строк из большой таблицы может оказаться медленнее создания новой таблицы. С чего ты взял, что интерпретирует на ходу? Само наличие глючащего кеша говорит о том, что там не чистый интерпретатор.
#64 by mTema32
ссылка выше есть)
#65 by КонецЦикла
Он должен быстро работать и легко модифицироваться/читаться, какая-то логика должна прослеживаться Выеживаться ради краткости типа ?(sdlfjlsdkfj,?(dsfsdf)...) - не понимаю такого
#66 by Tarlich
Делаю ставку на удобочитаемость ....
#67 by TormozIT
Это нерабочий способ. Он выдаст ошибку.
#68 by Balabass
А еще можно на богомерзком писать. Говорят что работает быстрее.
#69 by Злопчинский
ну судя по мностроидальным типовым - там вообще ничего не экономили. принципиально. наоборот даже - ИБД явно есть
Тэги:
Ответить:
Комментарии доступны только авторизированным пользователям

В этой группе 1С