LINUX.ORG.RU

Как вы бы поступили?

 , , ,


0

1

Ну вот сколхозили вы себе свой конфигурационный формат. Допустим у вас в конфиге

var = 100500

И в программе

//возврат значения конкретной размерности, без вариантов!
//Никаких big num только нативные типы платформы! 

uint64_t var = config_get_u64(cfg,"var");

Всё ок, но как вы бы обработали вот такое?

var = 10000000000000000000500000000000000000000
  • 1: Выплюнули ошибку и убили программу
  • 2: Обрезали бы число до максимального хранимого типа и вернули 18446744073709551616
  • 3: Дали бы по шапке тому кто такие значения космичесикие вписывает
  • invalid value: 0x"6’33>42
  • 5:Иное

Микро опрос -

Нужны ли «неограниченные» числа в конфигах?

  • да
  • нет

Нужны ли «неограниченные» числа в конфигах?

Нет не нужны.

Выплюнули ошибку и убили программу

Да. Самый адекватный вариант. Юзер пусть думает сам.

ttywizard ()

откуда в конфигах числа, превышающие число элементарных частиц во вселенной? физ смысл натуральных чисел - отображать КОЛИЧЕСТВО. количество чего может превышать все мыслимые пределы? если человек оперирует такими количествами - он с ума сошел. потому отвести 128 бит максимум, лучше 64, и всех остальных слать к доктору.

alysnix ()
Последнее исправление: alysnix (всего исправлений: 1)

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

Какие я вижу варианты:

1) Допустим, что параметр - это номер порта, на котором нужно запустить сервер. В конфиге указано невалидное значение, лучшее, что мы можем сделать - умереть с сообщением об ошибке.

2) Пусть параметр будет необязательным с дефолтным значением, например, таймаут по умолчанию 30 сек. Если мы не можем разобрать значение, указанное пользователем, то вполне допустимо использовать значение по-умолчанию и вывести предупреждение в лог.

3) Возможно, что тебе действительно нужно работать с очень большими числами или с очень большой точностью. Но тут уже надо отказываться от примитивных типов и юзать соответствующие для длинной арифметики.

hippi90 ★★★★ ()
Ответ на: комментарий от alysnix

физ смысл натуральных чисел - отображать КОЛИЧЕСТВО. количество чего может превышать все мыслимые пределы?

Расстояние до соседней галактики в нанометрах. Зачем? Во славу Сатаны, конечно.

hippi90 ★★★★ ()
Ответ на: комментарий от alysnix

если человек оперирует такими количествами

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

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

Korchevatel ★★★ ()

Всё ок, но как вы бы обработали вот такое? var = 10000000000000000000500000000000000000000

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

Нужны ли «неограниченные» числа в конфигах?

Нет.

metaprog ()
Ответ на: комментарий от Morin

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

deep-purple ★★★★★ ()

Зависит от обстоятельств. Либо считать за ошибку и прекращать работу, либо давать предупреждение и брать значение по-умолчанию (ну или какое-то произвольное разумное, главное об этом сообщить). По шапке пусть дают специально обученные люди, программисту об этом думать не следует.

no-such-file ★★★★★ ()
Ответ на: комментарий от deep-purple

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

Morin ★★ ()

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

goper48265 ()

Откатиться на дефолтное значение и выплюнуть ошибку в лог.

Если откат на дефолтное значение невозможен - выплюнуть ошибку в лог и упасть.

Нужны ли «неограниченные» числа в конфигах?

Нет.

KillTheCat ★★★★★ ()
Ответ на: комментарий от hippi90

Расстояние до соседней галактики в нанометрах. Зачем? Во славу Сатаны, конечно.

хотелось бы заметить, что даже это, никому не нужное число имеет порядок 10^33. то есть уложится в 34 десятичных разряда.

alysnix ()
Ответ на: комментарий от hippi90

а я сразу сказал, что если не считать нанометры до галактики, что несется на нас со скоростью 300 км/сек, то можно уложиться в 64. а если таки считать эти нанометры, то надо брать 128.

alysnix ()

Up to you

Зависит от того расценивать конфиг «данными из внешнего мира» или нет.

Если предполагается, что кофиг редактируется в твоём гуевом окошке и текстовая репрезентация – деталь реализации, то падать при невалидных значениях.

Если ты говоришь юзверю «вот файл – редактируй», то нужна валидация, логгирование и кламп до валидных значений.

Нужны ли «неограниченные» числа в конфигах?

Нет.

Stil ★★★★★ ()
Ответ на: комментарий от deep-purple

а это числа?

Пока что это просто циферки, т.е. символы. Можно интерпретировать как числа, а можно нет. Откуда такие абсолютистские закидоны? Может ты ещё и в бога веришь?

no-such-file ★★★★★ ()

Нужны ли «неограниченные» числа в конфигах?

Нет.

5:Иное

Вообще это 4. Можно просто игнорировать эту строку как если бы её не было в конфиге, опционально с выдачей предупреждения пользователю.

xaizek ★★★★★ ()

Точно 1. Поведение программы должно быть ожидаемым. Если юзер передает число как параметр - то он хочет чтобы именно оно обрабатывалось.

Если выберешь 2 - тогда это явный баг, юзер явно не хочет чтобы оно превращалось во что-то другое и считалось.

Ну и да, типов огромное количество, за всеми тяжело уследить. Поэтому лучше всегда юзеру показать что то, что он вводит неверно. Иначе начнут непонятно что передавать и жаловаться что получается непонятно что.

Kronick ()

https://books.google.ru/books?id=kttwBgAAQBAJ&pg=PA802&lpg=PA802&dq=%D0%B4%D0%B0%D0%B9%D1%82%D0%B5+%D0%B5%D0%BC%D1%83++%D0%BB%D0%B5%D0%B4%D0%B5%D0%BD%D0%B5%D1%86&source=bl&ots=dq3mU48Xgv&sig=ACfU3U0PT-6p5H9mIL-1WQDHY5w31al3sA&hl=ru&sa=X&ved=2ahUKEwiL-OyghqnoAhWJw6YKHWEpDF0Q6AEwBHoECAcQAQ#v=onepage&q=%D0%B4%D0%B0%D0%B9%D1%82%D0%B5%20%D0%B5%D0%BC%D1%83%20%20%D0%BB%D0%B5%D0%B4%D0%B5%D0%BD%D0%B5%D1%86&f=false

5: всёж конфиг не тьюринг полон поэтому процедура чтения числа лобовая - домножаем на 10 + прочитаный_символ-‘0’ - все выходы за пределы как и использование в числе не ‘0’..‘9’ никак не ловить пусть UB

нет не нужны.

qulinxao3 ()

Выплюнули ошибку с пояснением и убили программу

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

Обрезали бы число до максимального

В сообщении о ошибке вывести допустимый диапазон значений и там далее пусть пользователь сам решает что ему писать в конфиге.

Если что, то я не программист, а пользователь и я описал желаемое мной поведение программы.

torvn77 ★★★★★ ()
Последнее исправление: torvn77 (всего исправлений: 4)

Все зависит от семантики. Есть параметры которые можно обрезать, есть которые нельзя. Есть которым нужны неограниченные диапазоны, есть которым не нужны. Есть которые представляются в виде floating point. Почему вы всё в одну кучу валите?

slovazap ★★★★★ ()
Ответ на: комментарий от no-such-file

это просто циферки, т.е. символы

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

Откуда такие абсолютистские закидоны?

Эх...

в бога веришь?

Я — пастафарианец.

deep-purple ★★★★★ ()

Что написано в документации?

Если в документации написано, что ‘var’ никак не ограничен, то программа не соответстует документации. То есть программиста можно ставить на неограниченный «счётчик».

Если в докумнтации ‘var’ ограничен, а программа плюет на ограничения и принимает заграничные значения, то программиста - на ограниченный счётчик.

Если всё по документации, то зарплату - согласно контракту.

anonymous ()

1) если значение в конфиге критично, то часть программы которая парсит конфигы выплёвывает ошибку и завершает работу программы
2) если оно некритично, то парсер выплёвывает ошибку, дебилам которые вписывают такие ужасы прилетает по шапке, а используется значение по умолчанию

Да, при таких раскладах надо хранить у себя значения по умолчанию.

reprimand ★★★★★ ()
Ответ на: комментарий от anonymous

Дополню

Если всё по документации

Также включает те случаи, когда в документации ничего не сказано. Раз ничего не сказано, то делай что хочешь. UB он и в сишечке UB.

Поэтому

зарплату - согласно контракту.

anonymous ()

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

Norgat ★★★★★ ()
Ответ на: комментарий от reprimand

Если программно можно отловить проблему, но это не сделано - это недоработка программиста. В этом и суть программы - она автоматизирует действия.

Norgat ★★★★★ ()