![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)
I think I got it where all this bs about passing around numerical ids of entities instead of entity references (maybe lazy) come from. It's like 'error code'. It comes from the ancient c programming, where we just could not allocate a string for a readable piece of text, or for the data that may need some efforts to instantiate or allocate.
In short. It's stupid to pass around "ids" in a program.
In short. It's stupid to pass around "ids" in a program.
no subject
Date: 2015-10-02 02:39 pm (UTC)1. id вместо сообщения об ошибке (содержащего конкретные детали)
2. перепасовка целых чисел в коде, вместо type-safe конкретных указателей на объекты
3. использование целых чисел для идентификации явлений природы
По третьему вопросу - конечно, нужен способ; но почему именно десятичные цифры, я не понимаю. base36 для меня звучало бы более осмысленно. BC-4KSNL, то ли дело. Запоминается мгновенно, как мем.
no subject
Date: 2015-10-03 01:56 am (UTC)1). В сообщениях об ошибках номер ошибки вместо текста применяется в результате работы исключений. Допустим, где-то глубоко в недрах вашей программы возникло исключение. Исключение - это объект, и его надо создать. Допустим так же, что у вас в программе в этот момент осталось мало памяти. Если вы создаёте объект-исключение и ему не хватило памяти, происходит выброс нового исключения - stack overflow или no enough memory. Если памяти не хватит и ему, будет выбрасываться новое исключение и так без конца. В винде это приводило к зависанию всей системы. Поэтому создавали исключения с кодом ошибки - так оно займёт меньше места и меньше шансов возникновения подобной ситуации.
Но в системе есть функция разыменовывания этих кодов и пользователю всегда надо показывать полный текст ошибки, если такое возможно. Однако, увы, программисты часто пренебрегают подобной практикой.
2) Числа с плавающей точкой обрабатываются хранятся в сопроцессоре. Для вывода и ввода в него числа перекодируются float, double или long double форматы. При перекодеровке возможны потеря точности, 1.3 может превратиться в 1.2999999998 или в 1.30000001. Для случаев, когда подобное не желательно, числа преобразут в целое, умнажая на 10^n, где n - точность и округляя к ближайшему целому.
Числа с плавающей точкой нельзя сравнивать из-за потери точности:
float a = 1.3;
float b = a/3;
b *=3;
if (a == b) // может быть не равно
if ((int)(a *100 + 0.5) == (int)(b *100 + 0.5)) // всегда равно