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.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.