Re[19]: что нельзя делать никогда
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 18.12.13 08:00
Оценка: -1
Здравствуйте, stronk2, Вы писали:

N>>Пример должен относиться именно к тестам, а не к основному коду, потому что я (независимо от полной позиции) сказал это именно для случая тестов.


S>С копипастерами я уже давно не работаю, поэтому пример именно для тестов привести не могу.


Спасибо, вопросов тут больше не имею.
The God is real, unless declared integer.
Re[8]: что нельзя делать никогда
От: MTD https://github.com/mtrempoltsev
Дата: 18.12.13 08:18
Оценка:
Здравствуйте, netch80, Вы писали:

N>Посыл верный, адресат — нет


Еще пол часа подумай, как с оценочкой, может поймешь
Re[9]: что нельзя делать никогда
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 18.12.13 08:23
Оценка: -1
Здравствуйте, MTD, Вы писали:

N>>Посыл верный, адресат — нет

MTD>Еще пол часа подумай, как с оценочкой, может поймешь

1. К тебе та же просьба: или показывай пример, или не захламляй форум тупым флеймом.
2. Я вообще-то работаю (не знаю, как некоторые), а мерять тайминг ответов и делать из него выводы — как раз стиль того, кому сейчас явно нечем заняться.
3. Да, раз ты начал ставить минусы — я не считаю себя обязанным отвечать тем же, но могу и поставить. Просто для того, чтобы тот, кто пришёл сюда за чем-то полезным, имел быстрый якорь для взгляда.
The God is real, unless declared integer.
Re[3]: что нельзя делать никогда
От: мыщъх США http://nezumi-lab.org
Дата: 18.12.13 08:30
Оценка: 96 (5) +7 :)
Здравствуйте, stronk2, Вы писали:

S>Здравствуйте, мыщъх, Вы писали:


М>>контрпример -- коэффициенты в различных вычислениях. самые умные имена будут К1, К2, К3. "умность" тут в краткости, т.к. К1 короче чем 123456789.987654321, но за это приходится платить поиском мест, где они определены.


S>Какие коэффициенты, откуда взялись?

например, перевод фаренгейта в цельсия. вот формула. вас не затруднит написать программу?



очень хочется увидеть осмысленные названия вместо магических констант. а самое главное -- понять _нахрена_ оно им? и это -- простейший случай. или вы не сталкивались ни с какими вычислениями вообще? какую формулу ни возьми -- в ней полно безымянных "магических констант". попытка дать им "самопальные" имена только запутает программу.


М>>если код размножен в 100500 местах, то это очень плохо. если код размножен в двух местах, которые к тому же слегка отличаются друг от друга -- это вполне нормально и ничуть не смертельно.

S>Самый худший вид копипасты, за который вообще надо руки рубить. Попробуй определи с одного взгляда — чем отличаются два похожих куска текста, и отличаются ли вообще.
и за что тогда рубить руки? вы снова мыслите тактически. обратите внимание на копи-пасту в АПИ. размножение сущностей с идентичной семантикой, но разными именами АПИ -- это, действительно, мрак. тем более, что с АПИ людям работать, а с копи-пастой в худшем случае появляются проблемы с поддержкой кода, да и то не факт, т.к. преодоление копипасты путем, скажем, шаблонов -- встречает свои проблемы.


S>А нагадить посреди своей комнаты — это стратегия или тактика?

гадить перед приходом вероятного противника -- это тактический прием. гадить после его ухода -- стратегический.

М>>ЗЫ. пояснения не помешают. что такое магические константы?

S>Ну ладно, нельзя требовать, чтобы все знали терминологию. Но хотя бы гуглить ты умеешь?
и где там определение? например, делим длину на два. нужно ли писать
#define half 2
или можно писать /2 ? или вот... for (idx=0;idx<len;idx++) это нормально? или неявный 1 нужно заменить на one, 0 -- start_index, len -- end_index
вы же не можете не признать, что end_index это лучше? for (idx=start_index;idx==end_index;idx+=one), где end_index = len — one, правда, тут нужно еще предусмотреть случай когда len == 0, где 0 определен как empty_xxx (вместо ххх -- название сущности).

так все-таки где граница магичности? а как на счет магических алгоритмов? смотрите в программу и видите в ней 1 + х и думаете, что это наверное ошибка, т.к. тут должно быть е**х, но программа работает. почему? вопрос в самом деле интересный, т.к. при копи-пасте она проработает недолго и быстро сломается. если х это не аргумент функции и если х удовлетворяет определенным условиям неизвестным вам, то оно... работает. причем очень шустро. допустим, функция не может возвращать ошибку и не имеет права кидать исключений, а х -- вычисляется в рантайме -- тут ведь даже проверку на соответствие этим условиям не вставишь...

а вот еще. написано -- (k + 4)/10. оно заменяет кучу ресурсоемких вычислений и выдает удивительно точный результат, который долго пытались объяснить аналитическим путем, выдвинули несколько гипотез почему оно работает, но потом плюнул и забили болт. работает -- и ладно. для k == 8 не работает. но k никогда не равно 8, т.к. не соответствует никакой физической реальности, но работает для 7 и 9. даже для -1 работает. во. а теперь скажите мне -- что оно считает. а оно определенно что-то считает.
americans fought a war for a freedom. another one to end slavery. so, what do some of them choose to do with their freedom? become slaves.
Re[10]: что нельзя делать никогда
От: MTD https://github.com/mtrempoltsev
Дата: 18.12.13 08:37
Оценка: -1
Здравствуйте, netch80, Вы писали:

N>1. К тебе та же просьба: или показывай пример, или не захламляй форум тупым флеймом.


Кто бы говорил.

N>2. Я вообще-то работаю (не знаю, как некоторые), а мерять тайминг ответов и делать из него выводы — как раз стиль того, кому сейчас явно нечем заняться.


Вот иди и работай. А когда будет время, подумай какую хрень несешь.

N>3. Да, раз ты начал ставить минусы — я не считаю себя обязанным отвечать тем же, но могу и поставить. Просто для того, чтобы тот, кто пришёл сюда за чем-то полезным, имел быстрый якорь для взгляда.


Мама, мама, он первый начал!
Re: что нельзя делать никогда
От: k.o. Россия  
Дата: 18.12.13 08:44
Оценка: +1
Здравствуйте, stronk2, Вы писали:

S>Какие вещи в коде можно считать однозначно плохими и нельзя использовать никогда и ни при каких условиях?


S>По моей версии:

S>1. магические константы
S>2. копи-паста

Даже для кода, призванного продемонстрировать недостатки вышеперечисленного? Боюсь, тебе, трудно будет кого-нибудь убедить в своей правоте, если ты даже пример привести не можешь.

А по поводу констант:

the use of 0 and 1 as initial or incremental values in a for loop, such as for (int i = 0; i < max; i = i + 1) (assuming i++ is not supported)
the use of 2 to check whether a number is even or odd, as in isEven = (x % 2 == 0), where % is the modulo operator
the use of simple arithmetic constants, e.g., in expressions such as circumference = 2 * Math.PI * radius, or for calculating the discriminant of a quadratic equation as d = b^2 − 4*a*c

Re[3]: что нельзя делать никогда
От: мыщъх США http://nezumi-lab.org
Дата: 18.12.13 08:51
Оценка: +3 -1
Здравствуйте, MTD, Вы писали:

MTD>Здравствуйте, мыщъх, Вы писали:


М>>контрпример -- коэффициенты в различных вычислениях. самые умные имена будут К1, К2, К3. "умность" тут в краткости, т.к. К1 короче чем 123456789.987654321, но за это приходится платить поиском мест, где они определены.


MTD>Это ложная альтернатива, выбирайте дерьмо №1 или дерьмо №2.


я вам вполне конкретную задачу, а вы мне софистику. хорошо, вот реальная формула (к + 4)/10, которая вычисляет то, что вычислить нельзя (нет таких вычислительных мощностей) и потому _это_ держат в таблицах. или используют данную эмпирическую формулу, в которой нет никакого смысла, кроме того, что она выдает результат совпадающий с данными, полученными путем измерений. чистая магия, да.

MTD>А потом кто-то увидит одну часть и подумает, ну не страшно, будет в двух местах, и вот у нас уже 3 места.

предложите альтернативу? шаблоны или наследование или еще что-то. причем, оригинальный код не в шаблоне и наследовать его просто так нельзя. поэтому, либо скопировать и чуть-чуть исправить, либо реконструировать данный фрагмент программы так, чтобы повторное использование кода стало возможно без копи-пасты. хорошо если это наш код, а если он чужой? да еще и законсервирован?

я против копи-пасты, но я так же против оторванной от реальной жизни постановлений в стиле "не следует делать никогда". я сторонник более мягких формулировок: "не рекомендуется" или "можно, если обосновать", не говоря уже о том, что какие-либо правила имеют смысл только для "младшего командного состава" и рядовых, т.к. у них еще недостаточно опыта для всестороннего анализа ситуации и проще сказать "не суйся в воду", убрав оттуда "не зная броду", т.к. каждый пацак думает, что он знает, но это не так. а опытные товарищи ведут разведку, вторгаясь в неизвестные территории, где не действуют никакие правила.

ЗЫ. скажи мне свою философию и я скажу кто ты. если ваш код решает нерешенную проблему -- к стилю кодирования относятся намного более снисходительно.
americans fought a war for a freedom. another one to end slavery. so, what do some of them choose to do with their freedom? become slaves.
Re: что нельзя делать никогда
От: TarasB  
Дата: 18.12.13 08:52
Оценка:
Здравствуйте, stronk2, Вы писали:

S>Какие вещи в коде можно считать однозначно плохими и нельзя использовать никогда и ни при каких условиях?


S>По моей версии:

S>1. магические константы
S>2. копи-паста

S>Ваши варианты?


1. ==true
2. Ручное управление памятью
3. Недетерминированный сборщик мусора
4. С++
Re[4]: что нельзя делать никогда
От: vnp  
Дата: 18.12.13 08:56
Оценка:
Здравствуйте, мыщъх, Вы писали:

М>и где там определение? например, делим длину на два. нужно ли писать

М>#define half 2

боже упаси. #define оторвет руки сам, без нашего участия.

М>или можно писать /2 ?

M>или вот... for (idx=0;idx<len;idx++) это нормально? или неявный 1 нужно заменить на one, 0 -- start_index, len -- end_index

А вот так низзя. Семантика for менялась как минимум 6 раз. Единственно кошерный способ это while (idx < len). Смайликов не ставлю из принципа.

М>вы же не можете не признать, что end_index это лучше? for (idx=start_index;idx==end_index;idx+=one), где end_index = len — one, правда, тут нужно еще предусмотреть случай когда len == 0, где 0 определен как empty_xxx (вместо ххх -- название сущности).


Еще кошернее, while (begin != end). Ну, вы поняли.

М>так все-таки где граница магичности? а как на счет магических алгоритмов? смотрите в программу и видите в ней 1 + х и думаете, что это наверное ошибка, т.к. тут должно быть е**х, но программа работает. почему? вопрос в самом деле интересный, т.к. при копи-пасте она проработает недолго и быстро сломается. если х это не аргумент функции и если х удовлетворяет определенным условиям неизвестным вам, то оно... работает. причем очень шустро. допустим, функция не может возвращать ошибку и не имеет права кидать исключений, а х -- вычисляется в рантайме -- тут ведь даже проверку на соответствие этим условиям не вставишь...


А вот такого я не встречал. Пример можно?

М>а вот еще. написано -- (k + 4)/10. оно заменяет кучу ресурсоемких вычислений и выдает удивительно точный результат, который долго пытались объяснить аналитическим путем, выдвинули несколько гипотез почему оно работает, но потом плюнул и забили болт. работает -- и ладно. для k == 8 не работает. но k никогда не равно 8, т.к. не соответствует никакой физической реальности, но работает для 7 и 9. даже для -1 работает. во. а теперь скажите мне -- что оно считает. а оно определенно что-то считает.


Выдыхай... что-нибудь соответствующее какой-нибудь физической реальности, желательно.
Re[4]: что нельзя делать никогда
От: MTD https://github.com/mtrempoltsev
Дата: 18.12.13 08:59
Оценка:
Здравствуйте, мыщъх, Вы писали:

М>хорошо, вот реальная формула (к + 4)/10, которая вычисляет то, что вычислить нельзя (нет таких вычислительных мощностей) и потому _это_ держат в таблицах.


Конкретно здесь все в порядке, хотя я бы написал рядом комментарий с ссылкой на формулу.

MTD>>А потом кто-то увидит одну часть и подумает, ну не страшно, будет в двух местах, и вот у нас уже 3 места.

М>предложите альтернативу? шаблоны или наследование или еще что-то.

По ситуации.
Re: что нельзя делать никогда
От: Tilir Россия http://tilir.livejournal.com
Дата: 18.12.13 09:20
Оценка:
Здравствуйте, stronk2, Вы писали:

S>Какие вещи в коде можно считать однозначно плохими и нельзя использовать никогда и ни при каких условиях?


Никогда и ни при каких условиях нельзя отключать предупреждения компилятора или игнорировать непонятные вам предупреждения вместо того, чтобы разобраться в них и исправить.

Не знаю насколько это "в коде", конечно...

Что до магических констант, глобальных переменных и прочего, хм... вот простой тестик из dejagnu:

{code}
#include <string.h>

static int
special_format (fmt)
const char *fmt;
{
return (strchr (fmt, '*') != 0
|| strchr (fmt, 'V') != 0
|| strchr (fmt, 'S') != 0
|| strchr (fmt, 'n') != 0);
}

main()
{
if (special_format ("ee"))
abort ();
if (!special_format ("*e"))
abort ();
exit (0);
}
{code}

Копипаста очевидна, магические константы в ассортименте. Тест, тем не менее, функционален и вполне понятен. Он работает там с 2000 года и его никто ни разу не трогал. И НЕ НАДО.
Re[5]: что нельзя делать никогда
От: мыщъх США http://nezumi-lab.org
Дата: 18.12.13 09:29
Оценка: 2 (1) +1
Здравствуйте, netch80, Вы писали:

N>Здравствуйте, мыщъх, Вы писали:


N>От современных десктопов я плююсь практически от всех

командная строка рулит. например, мне гораздо быстрее прочитать руководство о командной строке гит, чем втыкать в мануал с кучей скринов. хотя это оффтопик, а по существу вопроса вы же сами признали, что как только кастомеры начнут перелезать на семерку -- так и начнется. даже если они и не начнут... может помните была такая бага у багдада, когда вычислялась скорость ЦП в цикле и на новых камнях возникала ошибка деления на ноль. "о сколько нам открытий чудных..." а потом мелкомягкие долго не могли перенести значительную часть своего же кода под свою же ось и вырубали свои же защиты от выполнения кода в неисполняемых областях памяти чтобы он хоть как-то работал.

еще большой класс ошибок связан с размерами хардов. многие инсталляторы, обнаружив _очень_ много свободного места вопили о его нехватке и оказывали устанавливать программу. поэтому какое-то время компы продавались с битыми хардами -- специально для обхода баг инсталляторов.

так что даже при неизменном софтверном окружении может меняться хардвер. даже если вы сами выбираете железо для сервера -- старого железа может больше не оказаться в наличии, а с поддержкой нового возникать проблемы.

я по молодости столько косяков допускал... скажем, не проверял размер файла лога на максимально возможный размер файла, допускаемый данной файловой системой, т.к. не хотел геморра и обоснованно (реально обоснованно) считал, что даже за сто лет работы программа не приблизится к нему даже наполовину. как же я ошибался. объемы обрабатываемых данных возросли, а с ними возросли и логи, причем появились удоды, которые для своего удодства стали размешать логи на съемных дисках, размечанных под фатом, чтобы их открывать под виндой или маком. а у меня проверка только на размер свободного пространства, которого еще есть, но мы упираемся в ограничение фат. кстати, под никсами. когда я разобрался в ситуации, то очень долго матерился. в самом деле -- откуда под никсами фат?! времена 9х давно прошли. была бы это винда --- там была бы НТФС с которой нет таких проблем, но... оказалось, что нужно быть готовым к самому невероятному.
americans fought a war for a freedom. another one to end slavery. so, what do some of them choose to do with their freedom? become slaves.
Re[20]: что нельзя делать никогда
От: stronk2  
Дата: 18.12.13 09:31
Оценка: -1
Здравствуйте, netch80, Вы писали:

N>Спасибо, вопросов тут больше не имею.


Не забудь поставить зарубку на клавиатуре, спец-чемпион
Re[4]: что нельзя делать никогда
От: stronk2  
Дата: 18.12.13 09:32
Оценка:
Здравствуйте, мыщъх, Вы писали:

М>например, перевод фаренгейта в цельсия. вот формула. вас не затруднит написать программу?


Вот по формуле и напишу, не забыв указать, откуда она взялась.

М>а вот еще. написано -- (k + 4)/10. оно заменяет кучу ресурсоемких вычислений и выдает удивительно точный результат, который долго пытались объяснить аналитическим путем, выдвинули несколько гипотез почему оно работает, но потом плюнул и забили болт. работает -- и ладно.


Вот примерно такие случаи говнокода я и имел в виду.
Re[6]: что нельзя делать никогда
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 18.12.13 09:48
Оценка:
Здравствуйте, мыщъх, Вы писали:

N>>От современных десктопов я плююсь практически от всех

М>командная строка рулит. например, мне гораздо быстрее прочитать руководство о командной строке гит, чем втыкать в мануал с кучей скринов. хотя это оффтопик, а по существу вопроса вы же сами признали, что как только кастомеры начнут перелезать на семерку -- так и начнется.

Не так. "Начнётся" у нас при попытке создать рабочую конфигурацию, инструкции по апгрейду и т.п. До кастомеров дойдёт уже простая инструкция типа "вставьте диск, нажмите Enter, ничего не трогайте и ждите зелёного свистка".
Причём основные сложности при переносе ОС это именно чтобы в процессе апгрейда система осталась живой без необходимости ставить с нуля. У RedHat это возможно далеко не всегда, тот же RHEL, на моей памяти, несколько раз переносился только по принципу "забэкапить, снести, поставить с нуля, вернуть данные с бэкапа". А дальше апгрейды базы и прочие уже кастомные радости целевого софта.

М> даже если они и не начнут...


Если не начнут — то может ничего и не случиться. При том, что вышла версия 38, есть такие, у которых до сих пор 12-яф. Разумеется, уже без поддержки. Но работает... я сам фигею.

М> может помните была такая бага у багдада, когда вычислялась скорость ЦП в цикле и на новых камнях возникала ошибка деления на ноль. "о сколько нам открытий чудных..." а потом мелкомягкие долго не могли перенести значительную часть своего же кода под свою же ось и вырубали свои же защиты от выполнения кода в неисполняемых областях памяти чтобы он хоть как-то работал.


Так подобные чудеса всегда есть — прогресс не стоит на месте. То какое-нибудь EFI придумают, то планшеты вдруг появятся...

М>еще большой класс ошибок связан с размерами хардов. многие инсталляторы, обнаружив _очень_ много свободного места вопили о его нехватке и оказывали устанавливать программу. поэтому какое-то время компы продавались с битыми хардами -- специально для обхода баг инсталляторов.


Было такое, да. И не только с диском. Слышал, как ставили Win95 на машину с 1GB RAM. Та отказалась — мало ей памяти...
А ещё потому, что FAT16 не тянул (AFAIR) больше 2G, а FAT32 был недоступен в тех ОС.

М>я по молодости столько косяков допускал... скажем, не проверял размер файла лога на максимально возможный размер файла, допускаемый данной файловой системой, т.к. не хотел геморра и обоснованно (реально обоснованно) считал, что даже за сто лет работы программа не приблизится к нему даже наполовину. как же я ошибался. объемы обрабатываемых данных возросли, а с ними возросли и логи, причем появились удоды, которые для своего удодства стали размешать логи на съемных дисках, размечанных под фатом, чтобы их открывать под виндой или маком. а у меня проверка только на размер свободного пространства, которого еще есть, но мы упираемся в ограничение фат. кстати, под никсами. когда я разобрался в ситуации, то очень долго матерился. в самом деле -- откуда под никсами фат?! времена 9х давно прошли. была бы это винда --- там была бы НТФС с которой нет таких проблем, но... оказалось, что нужно быть готовым к самому невероятному.


"удод для своего удодства" это сильно, надо запомнить.
The God is real, unless declared integer.
Re[5]: что нельзя делать никогда
От: k.o. Россия  
Дата: 18.12.13 10:09
Оценка:
Здравствуйте, stronk2, Вы писали:

S>Вот по формуле и напишу, не забыв указать, откуда она взялась.


По формуле, это как, с неименованными константами? Так ведь их "нельзя использовать никогда и ни при каких условиях".

М>>а вот еще. написано -- (k + 4)/10. оно заменяет кучу ресурсоемких вычислений и выдает удивительно точный результат, который долго пытались объяснить аналитическим путем, выдвинули несколько гипотез почему оно работает, но потом плюнул и забили болт. работает -- и ладно.


S>Вот примерно такие случаи говнокода я и имел в виду.


Т.е. куча ресурсоемких вычислений будет лучше?
Re: что нельзя делать никогда
От: robin_of_the_wood Россия  
Дата: 18.12.13 11:15
Оценка:
Здравствуйте, stronk2, Вы писали:

S>Какие вещи в коде можно считать однозначно плохими и нельзя использовать никогда и ни при каких условиях?


S>По моей версии:

S>1. магические константы
S>2. копи-паста

S>Ваши варианты?


У всех правил есть исключения. Иногда они настолько специфичны, что ими можно пренебречь. А иногда и наоборот.
Поэтому запоминая любое правило очень важно понимать причины появления этого правила.
Это позволит принимать правильное решение об использовании данного правила в конкретной ситуации.
Споры в этой ветке это кстати подтверждают.
У разных людей были разные ситуации и следование одинаковым правилам приводило к совершенно разному результату.
Тут как с лыжами.
Если упустить из виду необходимость наличия снега,
то о целесообразности их одевания можно спорить очень долго и безрезультатно при полной правоте обоих сторон.
Проектирование велосипедов для слепых жирафов
Re[10]: что нельзя делать никогда
От: Кодт Россия  
Дата: 18.12.13 12:51
Оценка:
Здравствуйте, netch80, Вы писали:

N>Вообще-то Капитан Очевидность вырастает до Адмирала Ясен Хрен (я заменил последнее слово на похожее, но пригодное для открытых источников). Генералов тут в иерархии не встречается.


Ну здрасьте, как это не встречается. А генерал Фейлор?
Будучи (_|_), он встречается в любой иерархии. Причём, как это и полагается для полноты и неизбежности, он находится на самом верху.
Перекуём баги на фичи!
Re[4]: что нельзя делать никогда
От: Кодт Россия  
Дата: 18.12.13 13:00
Оценка: 2 (1)
Здравствуйте, мыщъх, Вы писали:

М>например, перевод фаренгейта в цельсия. вот формула. вас не затруднит написать программу?


М>


А теперь рядом — обратный перевод?

float const C0_in_F   =  +32.0; // +32F = 0C
float const C100_in_F = +212.0; // +212
float const C_per_F   = (100-0)/(C100_in_F-C0_in_F); // 5./9.

float constexpr C_from_F(float f) { return (f-C0_in_F)*C_per_F; }
float constexpr F_from_C(float c) { return (c/C_per_F)+C0_in_F; }
Перекуём баги на фичи!
Re[11]: что нельзя делать никогда
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 18.12.13 13:08
Оценка:
Здравствуйте, Кодт, Вы писали:

К>Здравствуйте, netch80, Вы писали:


N>>Вообще-то Капитан Очевидность вырастает до Адмирала Ясен Хрен (я заменил последнее слово на похожее, но пригодное для открытых источников). Генералов тут в иерархии не встречается.


К>Ну здрасьте, как это не встречается. А генерал Фейлор?

К>Будучи (_|_), он встречается в любой иерархии.

А он очевиден?

Обычно _стараются_ считать, что он невероятен. Хотя с реализацией этого достаточно часто бывают проблемы

К> Причём, как это и полагается для полноты и неизбежности, он находится на самом верху.


Там ещё в небе Арктический Лис маячит. Но его упоминать всуе считается дурным тоном, его методы слишком радикальны.
The God is real, unless declared integer.