2013-02-27 2 views
0

Недавно я заметил соглашение о назначении идентификатора для определенной сущности, и мое внимание было обращено на возврат -1, если идентификатор отсутствует. Зачем возвращать -1 вместо 0?Зачем возвращать -1 вместо 0?

protected long AcqAgreementID 
{    
    get 
    { 
     if(ViewState["AcqAgreementID"] != null) 
     { 
      return Convert.ToInt64(ViewState["AcqAgreementID"]); 
     } 
     else 
     { 
      return -1; 
     } 
    } 
} 

+4

В некоторых контекстах 0 является допустимым значением – CodesInChaos

+0

Является ли мой вопрос таким глупым, что я получаю минус. –

+0

Если при возврате -1 или 0 вы хотите показать возникшую ошибку, вы должны продолжить -1. Возвращая 0 вместо или любое другое значение в качестве кода ошибки, ваш заблокированный выйдет без каких-либо ошибок. Это была просто старая передовая практика. –

ответ

1

Часто 0 - действительное значение id или возвращаемое значение. Подумайте о контроле, который имеет индексы или поиск в строке. При поиске выделенного индекса для элемента управления, содержащего несколько элементов или при поиске индекса определенного символа в строке, возвращаемое значение 0 является абсолютно нормальным. Индекс 0 означает, что выбран первый элемент или символ найден в первой позиции в строке. В обоих случаях -1 возвращается, когда ничего не было выбрано или не найдено.

+1

Мне очень нравится ваш ответ. Простой и сладкий. Спасибо. –

6

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

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

+0

То же самое относится к '0' со многими схемами баз данных – CodesInChaos

+0

@ Давид Хеффернан: Тогда почему бы не 0? –

+1

@ HumayounKabir На это может ответить только автор кода. Возможно, 0 - действительный идентификатор. Возможно нет. Даже если 0 недействителен, -1, очевидно, является плохим значением. Плюс значение -1 очень часто используется для указания недопустимого индекса массива, и, возможно, знакомство с этим случаем использования переливается в это. –

0

В большинстве случаев вы не должны возвращать ни того, ни другого. Скорее всего, вы должны выбросить исключение.

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

+0

Я не согласен. Я вижу два случая: 1) Если приложение ожидает ненулевое значение, бросание исключения прекрасное. Но в этом случае его не следует поймать. 2) Код вызова должен обрабатывать недостающее значение. В этом случае он должен проверить, действительно ли это. (Возможно, используя метод TryGetAgreementID). Не используйте обработку исключений для потока управления. – CodesInChaos

+0

Из приведенного примера кода это выглядит как исключение приложения. –

+0

Я согласен с тем, что исключения не должны использоваться для управления потоком Из приведенного примера кода это выглядит как исключение приложения. Бросок исключения позволяет предоставить больше контекста и помощи. Вместо того, чтобы возвращать 0 или -1, бросание настраиваемого исключения позволяет вам явно указывать, что происходит. Вы можете выбросить AcqAgreementIDNotSetExcption, чтобы указать, что значение ViewState было null или исключение AcqAgreementIDWrongFormatException, чтобы указать, что значение, полученное из ViewState, было неправильным. Также исключаются и регистрируются исключения. –

0

Это простой случай magic numbers анти шаблон.

Этого не должно быть сделано. Должны использоваться константы или определения (в зависимости от языка).

Магические числа в целом; вызывают WTF и вопросы, подобные вашим.

+0

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

0

Вопрос немного открытый и как-то слишком общий; на самом деле легко ответить с чем-то вроде «это зависит». В общем случае вы используете отрицательные значения, если 0 - вполне допустимое значение домена (например, в разрешенном диапазоне для идентификаторов)

Это не очень хороший шаблон, однако: он оставляет пользователей функции/API запутался (как вы). Вы должны понять, что функция возвращает числа в одном домене (положительные целые числа) и что отрицательное значение невозможно и поэтому используется как «invalud» valude.

В C# /. NET, например, вы должны учитывать типы Nullable. Они явно говорят, что «это значение не находится в домене», добавив дополнительное «значение/состояние» (null). Кроме обнуляемых типов, другие действующие соглашения, которым вы должны рассмотреть:

  • сгенерирует исключение (как для int.Parse)
  • добавить параметр out, чтобы указать срок действия или нет (например, Int.TryParse)
+1

Nullables может создать беспорядок самостоятельно. Я согласен с вашим «это зависит» ... но это затем противопоставлено «следует использовать значение« nullable »... это опять-таки« это зависит ». –

+0

@MatthewWhited right, я отредактировал его, чтобы «подумать». Нулевые типы и NULL в реляционных БД до того, как они были изобретены для этой цели (имеют значение без домена для условий, где есть ошибка/неинициализированное условие) –

+1

@ dema80: Это поле id не может быть целым числом, равным нулю, это первичное ключевое поле для этого объекта. –

0

Я использовал этот шаблон в тех местах, где я хотел использовать целое число с нулевым значением для идентификатора. Мне не нравилось использовать 0 как «default»/«unassigned» ID, так как это значение по умолчанию для целочисленных типов. Это позволяет мне смотреть на объекты модели, чтобы определить, следует ли их вставлять или обновлять, а также могу сказать, неизвестно ли оно «0».

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

...

Как примечание, я также видел/используемые модели, где модель имела обнуляемый тип, который был colleased (??) с известным значением, такими как -1 перед вызовом в функцию/модель данных, для которой требуются типы с нулевыми значениями.Это потрясающий мир «зависит от нас», что мы всегда занимаемся проектами развития.

1

Это стандарт для методов, которые возвращают индекс в структуре .NET.

public int FindIndex( Predicate<T> match) метод возвращает отсчитываемый от нуля индекс первого вхождения элемента, который соответствует условиям, определенным матча, если найден ; в противном случае -1.

(http://msdn.microsoft.com/en-us/library/x1xzf2ca.aspx)

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

Несоблюдение типов может быть использовано вместо, но стандарт для этих методов был разработан до введения типов с нулевым значением. Если у вас есть контроль над этим кодом, вы можете изменить его, но нет ничего плохого в возврате -1. Определенно не возвращать 0, потому что 0 часто является действительным идентификатором/индексом.

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