2009-07-12 3 views
0

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

Есть ли какие-либо соглашения вокруг этого?

Я работаю в ActionScript в последнее время и имею множество объектов с дополнительными параметрами, поэтому для большинства переменных я устанавливаю нуль, но для чисел или ints я не могу использовать null. Пример:

package com.website.app.model.vo 
{ 
    public class MyValueObject 
    { 
     public function MyValueObject (
              _id:String=null, 
              _amount:Number=0, 
              _isPurchased:Boolean=false 
            ) 
     { // Constructor 
      if(_id != null)   this.id   = _id; 
      if(_amount != 0)   this.amount  = _amount; 
      if(_isPurchased != false) this.isPurchased = _isPurchased; 
     } 

     public var id:String; 
     public var amount:Number; 
     public var isPurchased:Boolean; 
    } 
} 

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

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

Это первый вопрос о переполнении стека. Надеюсь, смысл моего вопроса имеет смысл.

ответ

1

Поскольку вы спросили в комментарии, я немного расскажу о C и C++. По соображениям эффективности локальные переменные и выделенная память по умолчанию не инициализируются. Но отладочные сборки часто делают это, чтобы уловить ошибки. Используемое общее значение - 0xcdcdcdcd, что маловероятно. Он имеет высокий набор бит и является либо довольно большим беззнаковым, либо довольно большим отрицательным номером. В качестве адреса указателя это нечетно, что приведет к исключению выравнивания, если оно используется ничем, кроме символа (но не для X86). Он не имеет особого значения как 32-битное число с плавающей запятой, поэтому он не является идеальным выбором.

Иногда вы видите частично выровненное значение в переменной, такой как 0xcdcd0000 или 0x0000cdcd. Они могут считаться подозрительными как минимум.

Иногда разные значения будут использоваться в зависимости от области распределения библиотеки. Это дает вам подсказку, в которой может возникнуть плохая стоимость (т. Е. Она сама не была инициализирована, но была скопирована из унифицированного значения).

Идеальное значение было бы недействительным независимо от того, какое выравнивание вы читаете из памяти и является недопустимым по всем примитивным типам. Это также должно выглядеть подозрительно для человека, поэтому, даже если они не знают соглашения, они могут подозревать, что что-то есть нога. Вот почему 0xdeadbeef может быть хорошим выбором, потому что программист (гекс-просмотр) распознает это как работу человека, а не случайность.Обратите также внимание на то, что он нечетный и имеет высокий бит, поэтому он имеет то, что для него нужно.

1

Значение -1 часто традиционно используется как «вне диапазона» или «недопустимое» значение для указания отказа или неинициализированных данных. Опять же, это идет прямо вниз, если значение -1 является семантически допустимым значением для переменной ... или вы используете неподписанный тип.

1

Вам кажется, что null (и не без оснований), так почему бы просто не использовать его повсюду?

+0

ActionScript не принимает значение null для int или числовых параметров. Но при чтении этого вопроса: http://stackoverflow.com/questions/1003100/why-cant-typed-optional-arguments-have-a-default-of-null похоже, что NaN является эквивалентным нулевым значением для номера. Поэтому я думаю, что это отвечает на мой вопрос. Но мне любопытно, какие конвенции существуют на других языках. –

3

Многие из отладчиков будут использовать 0xdeadbeef для инициализации регистров. Когда я это вижу, я всегда получаю смешок.

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

+0

0xdeadbeef, LOL. Интересно, будет следить за этим. Спасибо за ответ. Это то, что я искал. И я согласен с тем, что использование не ожидаемого числа имеет смысл. –

1

В ActionScript вы можете присваивать Number.NaN только переменным, которые набираются Number, а не int или uint.

Это, так как AS3 не поддерживает именованные аргументы, вы всегда можете посмотреть массив аргументов (это встроенный массив, который имеет все функции, если вы не используете конструкцию ... rest). Если длина этого массива меньше, чем позиция вашего числового аргумента, вы знаете, что он не был передан.

+0

Интересный пункт массива аргументов я буду смотреть на это. Звучит очень полезно. Спасибо за совет. –

1

Я часто использую максимальное значение для этого. Как вы говорите, ноль часто является допустимым значением. Обычно max-int, теоретически допустимый, можно исключить. Но не всегда; быть осторожен.

1

Мне нравится 0xD15EA5ED, он похож на 0xDEADBEEF, но, как правило, более точен при отладке.

Смежные вопросы