| 
    
            
         
         | 
    
  | 
Почему короткий код считается крутым. | ☑ | ||
|---|---|---|---|---|
| 
    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 
 | 
         
        в тему ветки
 
        v8: Преобразование текста модуля в одну строку  | 
|||
| 
    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 
 | 
         
        ну судя по мностроидальным типовым - там вообще ничего не экономили. принципиально. наоборот даже - ИБД явно есть     
         | 
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |