что такое волшебные значения, плавающие в erlang? [Дубликат]

Используйте последовательный цикл for:

var myStringArray = ["Hello","World"];
var arrayLength = myStringArray.length;
for (var i = 0; i < arrayLength; i++) {
    alert(myStringArray[i]);
    //Do something
}

@zipcodeman предлагает использовать инструкцию for...in, но для итерации массивов for-in следует избегать, этот оператор предназначен для перечисления свойства объекта.

Его нельзя использовать для объектов типа массива, потому что:

  • Порядок итерации не гарантируется, индексы массива могут не посещаться в числовых порядок.
  • Унаследованные свойства также перечислены.

Во-вторых, это может дать вам массу проблем, например, если вы расширите Array.prototype объект, чтобы включить в него метод, это свойство также будет перечислено.

Например:

Array.prototype.foo = "foo!";
var array = ['a', 'b', 'c'];

for (var i in array) {
  alert(array[i]);
}

Вышеупомянутый код будет предупреждать: «a», «b», «c »и« foo! ».

Это особенно проблематично, если вы используете некоторую библиотеку, которая в значительной степени опирается на добавление собственных прототипов (например, MooTools).

for-in как я уже говорил, есть перечислять свойства объекта , например:

var obj = {
  "a": 1,
  "b": 2,
  "c": 3
};

for (var prop in obj) {
  if (obj.hasOwnProperty(prop)) { 
  // or if (Object.prototype.hasOwnProperty.call(obj,prop)) for safety...
    alert("prop: " + prop + " value: " + obj[prop])
  }
}

В приведенном выше примере e hasOwnProperty метод позволяет вам перечислять только собственные свойства , вот и все, только свойства, которые физически имеют объект, никаких унаследованных свойств.

Я бы рекомендовал вам прочитать в следующей статье:

436
задан Tiny Giant 8 January 2016 в 06:08
поделиться

15 ответов

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

Например, если у вас есть (в Java):

public class Foo {
    public void setPassword(String password) {
         // don't do this
         if (password.length() > 7) {
              throw new InvalidArgumentException("password");
         }
    }
}

Это должно быть реорганизовано в :

public class Foo {
    public static final int MAX_PASSWORD_SIZE = 7;

    public void setPassword(String password) {
         if (password.length() > MAX_PASSWORD_SIZE) {
              throw new InvalidArgumentException("password");
         }
    }
}

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

JDK полна примеров, например, в классах Integer, Character и Math.

PS: Статический анализ инструменты, такие как FindBugs и PMD, обнаруживают использование магических чисел в вашем коде и предлагают рефакторинг.

494
ответ дан Lii 1 September 2018 в 09:48
поделиться

@ eed3si9n: Я даже предположил, что «1» - магическое число. : -)

Принцип, связанный с магическими числами, состоит в том, что каждый факт, с которым связан ваш код, должен быть объявлен ровно один раз. Если вы используете магические числа в своем коде (например, пример длины пароля, который дал @marcio, вы можете легко закончить дублирование этого факта, и когда вы поймете об этом факте, у вас возникла проблема обслуживания.

1
ответ дан Andrew 1 September 2018 в 09:48
поделиться

Как инициализировать переменную в верхней части класса со значением по умолчанию? Например:

public class SomeClass {
    private int maxRows = 15000;
    ...
    // Inside another method
    for (int i = 0; i < maxRows; i++) {
        // Do something
    }

    public void setMaxRows(int maxRows) {
        this.maxRows = maxRows;
    }

    public int getMaxRows() {
        return this.maxRows;
    }

В этом случае 15000 является магическим числом (согласно CheckStyles). Для меня установка значения по умолчанию - это нормально. Я не хочу этого делать:

private static final int DEFAULT_MAX_ROWS = 15000;
private int maxRows = DEFAULT_MAX_ROWS;

Сложнее ли это читать? Я никогда не рассматривал это, пока не установил CheckStyles.

3
ответ дан Ascalonian 1 September 2018 в 09:48
поделиться

Магическое число - это последовательность символов в начале формата файла или обмен протоколом. Этот номер служит проверкой работоспособности.

Пример: Откройте любой файл GIF, который вы увидите в самом начале: GIF89. «GIF89» является магическим числом.

Другие программы могут читать первые несколько символов файла и правильно идентифицировать GIF.

Опасность состоит в том, что случайные двоичные данные могут содержать эти же символы. Но это очень маловероятно.

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

Магические числа по-прежнему полезны.

17
ответ дан Brian R. Bondy 1 September 2018 в 09:48
поделиться

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

3
ответ дан Community 1 September 2018 в 09:48
поделиться

Я всегда использовал термин «магическое число» по-разному, как неявное значение, хранящееся в структуре данных, которое можно проверить как проверку быстрой проверки. Например, файлы gzip содержат 0x1f8b08 в качестве первых трех байтов, файлы классов Java начинаются с 0xcafebabe и т. Д.

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

Быстрая проверка магического номера перед обработкой файла или структуры данных позволяет сигнализировать ошибки раньше, а не schlep полностью через потенциально длительную обработку, чтобы объявить, что вход был полным balderdash.

3
ответ дан DGentry 1 September 2018 в 09:48
поделиться

Еще одно преимущество извлечения магического числа в качестве константы дает возможность четко документировать деловую информацию.

public class Foo {
    /** 
     * Max age in year to get child rate for airline tickets
     * 
     * The value of the constant is {@value}
     */
    public static final int MAX_AGE_FOR_CHILD_RATE = 2;

    public void computeRate() {
         if (person.getAge() < MAX_AGE_FOR_CHILD_RATE) {
               applyChildRate();
         }
    }
}
0
ответ дан jguiraud 1 September 2018 в 09:48
поделиться
16
ответ дан Larry 1 September 2018 в 09:48
поделиться

Вы просмотрели запись в Википедии для магического номера ?

В деталях рассказывается обо всех способах создания ссылки на магические числа. Вот цитата из магического числа как плохая практика программирования

Термин «магическое число» также относится к плохой практике программирования использования чисел непосредственно в исходном коде без объяснения причин. В большинстве случаев это затрудняет чтение, понимание и поддержку программ. Хотя большинство руководств делают исключение для чисел с нулем и единицей, полезно определить все остальные числа в коде как именованные константы.

29
ответ дан MarianD 1 September 2018 в 09:48
поделиться

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

Плохо для та же самая причина, по которой SPOT (Single Point of Truth) хорош: если вы хотите позже изменить эту константу, вам нужно будет искать ваш код, чтобы найти каждый экземпляр. Это также плохо, потому что другим программистам может быть непонятно, что представляет это число, следовательно, «волшебство».

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

10
ответ дан Nick Retallack 1 September 2018 в 09:48
поделиться

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

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

3
ответ дан Rob Rolnick 1 September 2018 в 09:48
поделиться

Как насчет возвращаемых переменных?

Я особенно затрудняюсь при реализации хранимых процедур.

Представьте следующую хранимую процедуру (неверный синтаксис, я знаю, просто чтобы показать пример) :

int procGetIdCompanyByName(string companyName);

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

int procGetIdCompanyByName(string companyName, bool existsCompany);

Кстати, что он должен вернуть, если компания не существует? Ok: он установит existesCompany как false, но также вернет -1.

Функция Antoher состоит в том, чтобы сделать две отдельные функции:

bool procCompanyExists(string companyName);
int procGetIdCompanyByName(string companyName);

So предварительным условием для второй хранимой процедуры является то, что компания существует.

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

Суть заключается в следующем: что вы думаете об использовании таких «волшебных чисел», которые относительно известны и безопасны, чтобы сказать, что что-то не увенчалось успехом или что-то не существует?

1
ответ дан ROMANIA_engineer 1 September 2018 в 09:48
поделиться

Магическое число также может быть числом со специальной, жестко закодированной семантикой. Например, я когда-то видел систему, в которой идентификаторы записей> 0 обрабатывались нормально, 0 сама была «новой записью», -1 была «это корень», а -99 была «это было создано в корне». 0 и -99 приведет к тому, что WebService будет предоставлять новый идентификатор.

Что плохого в этом, так это то, что вы повторно используете пространство (значение целых чисел для идентификаторов записей) для специальных способностей. Возможно, вы никогда не захотите создать запись с идентификатором 0 или с отрицательным идентификатором, но даже если это не так, каждый человек, который смотрит либо на код, либо на базу данных, может наткнуться на это и сначала запутаться. Разумеется, 22, 7, -12 и 620 также считаются магическими числами.

. ; -)

9
ответ дан Sören Kuklau 1 September 2018 в 09:48
поделиться

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

Например, предположим, что у вас есть страница, отображающая последние 50 Заказы на странице «Ваши заказы». 50 - это Волшебный номер здесь, потому что он не установлен стандартным или условным, это число, которое вы определили по причинам, изложенным в спецификации.

Теперь, что вы делаете, у вас есть 50 в разных местах - ваш SQL-скрипт (SELECT TOP 50 * FROM orders), ваш сайт (ваши последние 50 заказов), ваш логин вашего заказа (for (i = 0; i < 50; i++)) и, возможно, много других мест.

Теперь, что происходит, когда кто-то решает изменить 50 до 25? или 75? или 153? Теперь вам нужно заменить 50 во всех местах, и вы, скорее всего, пропустите это. Найти / заменить может не работать, потому что 50 можно использовать для других вещей, и слепо заменить 50 на 25 может иметь некоторые другие плохие побочные эффекты (т. Е. Ваш Session.Timeout = 50 вызов, который также установлен на 25, и пользователи начинают сообщать слишком частые таймауты ).

Кроме того, код может быть трудно понять, то есть «if a < 50 then bla» - если вы столкнулись с этим в середине сложной функции, другие разработчики, которые не знакомы с кодом, могут спросить себя «WTF - 50 ???»

Вот почему лучше всего иметь такие двусмысленные и произвольные числа в одном месте - «const int NumOrdersToDisplay = 50», потому что это делает код более читаемым («if a < NumOrdersToDisplay» , это также означает, что вам нужно только изменить его в 1 четко определенном месте.

Места, где подходят магические числа, - это все, что определено стандартом, то есть SmtpClient.DefaultPort = 25 или TCPPacketSize = whatever (не уверен, что это стандартизировано). Кроме того, все, что определено только в 1 функции, может быть приемлемым, но это зависит от контекста.

134
ответ дан Samuel 1 September 2018 в 09:48
поделиться

Проблема, о которой не упоминалось при использовании магических чисел ...

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

И тогда, конечно же, вам нужно изменить значение ... только для одного цель.

10
ответ дан user 1 September 2018 в 09:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: