2012-01-29 14 views
11

Considere el siguiente procedimientocorrecta 'en' el uso del operador

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 operador en lugar de if cadena

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

hace que el código sea más compacta y fácil de leer, pero la documentación de Delphi no dice nada al respecto, y deberías ser consciente de los posibles problemas.

La pregunta es: ¿debería el uso in operador con constantes solamente entre paréntesis, por ejemplo

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

ser considerada como una buena práctica en Delphi?

+4

Sí, pero muestra literales, no constantes. Es decir, tendría 'SIGNIFICADO_NOMBRE = 6;' declarado en algún lugar en una sección const y usarlo en la condición 'en'. Usar literales es algo que no consideraría una buena práctica (difícil de buscar, y es probable que se pierda uno cuando necesite cambiar un valor). –

+0

@MarjanVenema Eres un verdadero programador purista :) – kludg

+0

Lo tomaré como un cumplido :) No sé de purista, solo picó un par de veces más por código usando literales ... –

Respuesta

1

Lo que tienes aquí es un set of byte. La pregunta que debe hacerse es si un set of byte es realmente lo que representan sus números. Usted tiene "números mágicos" aquí, y si bien entiendo que es sólo una muestra, debe tener en cuenta que, si bien

if Token in [TokenString, TokenNumber, TokenChar] then 

... se considera una buena práctica, esto:

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

. ..no sería.

Sin embargo, en el primer caso (fichas con nombre), un tipo de conjunto explícito sería mucho más buenas prácticas:

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

A continuación, la primera muestra es definitivamente una buena práctica.

+0

La pregunta no es sobre números mágicos en absoluto. Puedo editarlo para eliminar los números mágicos. – kludg

+0

¿No debería leer "const TokenSet =" en lugar de "tipo TokenSet ="? –

+0

@Uwe, no, es un tipo de conjunto (http://delphi.about.com/od/beginners/a/delphi_set_type.htm) –

4

Definitivamente es una buena práctica. Hace que el código sea mucho más legible y elimina la necesidad de operadores lógicos, paréntesis, etc. Yo siempre usaría in para tal prueba.

El único inconveniente es el soporte muy limitado de Delphi para sets (el tipo de base ordinal no puede tener más de 256 valores). Pero cuando no esté sujeto a esas limitaciones, no debe dudar en usar in.

Cuestiones relacionadas