2012-01-29 2 views
11

Рассмотрим следующую процедуруCorrect «в» использовании оператора

procedure InTests; 
var 
    N, K: Integer; 

begin 
    N:= 1111; 
    if N in [6, 8, 10]   // this is correct, readable and effective code 
    then ShowMessage('OK'); 

    K:= 11; 
    if N in [6, 8, 10, K]  // this is correct but less effective 
    then ShowMessage('OK'); // (compiler creates local 16-bytes set var) 

    K:= 1111; 
    if N in [6, 8, 10, K]  // this is a bug (K > 255) 
    then ShowMessage('OK'); 
end; 

in оператора, а if цепи

if (N = 6) or (N = 8) or (N = 10) 
    then ShowMessage('OK'); 

делает код более компактным и удобным для чтения, но Delphi документации умалчивает об этом, и вы должны знать о потенциальных проблемах.

Возникает вопрос: если использование in оператора с постоянными только в скобках, например

if N in [6, 8, 10] 
    then ShowMessage('OK'); 

считается хорошей практикой в ​​Delphi?

+4

Да, но вы показываете литералы, а не константы. То есть, у меня было бы «MEANINGFULNAME = 6;», объявленное где-то в секции const, и использовать его в состоянии 'in'. Использование литералов - это то, что я бы не счел хорошей практикой (трудно найти, и вы, вероятно, пропустите ее, когда вам нужно изменить значение). –

+0

@MarjanVenema Вы настоящий программист-пурист :) – kludg

+0

Я возьму это как комплимент :) Не знаю о пуристе, просто ужалил пару раз слишком много с помощью кода, используя литералы ... –

ответ

1

У вас есть set of byte. Вопрос, который вы должны задать себе, - действительно ли то, что представляют ваши цифры, set of byte? У вас есть «магические числа» здесь, и в то время как я понимаю, что это всего лишь пример, вы должны учитывать, что в то время как

if Token in [TokenString, TokenNumber, TokenChar] then 

... будет считаться хорошей практикой, это:

if N in [2, 12, 14, 19] then 

. .. не будет.

Однако в первом случае (названные жетоны), явный набор тип будет гораздо более эффективная практика:

type TokenSet = (TokenNone, TokenString, TokenChar,...) 

Затем первый образец окончательно хорошая практика.

+0

Вопрос не в магических числах вообще. Я могу отредактировать его, чтобы удалить магические числа. – kludg

+0

Не следует ли читать «const TokenSet =» вместо «type TokenSet =»? –

+0

@ Ну, нет, это тип набора (http://delphi.about.com/od/beginners/a/delphi_set_type.htm) –

4

Это, безусловно, хорошая практика. Это делает код более читаемым и устраняет необходимость в логических операторах, круглых скобках и т. Д. Я бы всегда использовал in для такого теста.

Единственный недостаток - очень ограниченная поддержка Delphi для sets (базовый порядковый тип может иметь не более 256 значений). Но там, где вы не связаны этими ограничениями, вы не должны колебаться при использовании in.

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