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