Anidado si las declaraciones dependen de nulls -- # camp codereview Relacionados El problema

Nested if statements dependant on nulls


4
vote

problema

Español

En cuanto a la legibilidad y las mejores prácticas, no estoy seguro de la mejor manera de escribir este método de ayuda:

Aquí hay dos opciones que he intentado:

  private decimal? selectTolerance(decimal? globalTolerance, decimal? localTolerance) {      if(localTolerance == null)      {                if(globalTolerance == null){                    return null;                }else{                    return globalTolerance;                }      }     else      {                if(globalTolerance == null){                     return localTolerance;                }else{                    if(globalTolerance < localTolerance){                        return globalTolerance;                    }else{                        return localTolerance;                    }                }          }  }   

alternativamente,

  changeMapLocation()0  

¿Cuál de estos es mejor? ¿Alguna otra alternativa?

Original en ingles

As far as readability and best practises go I am not sure how best to write this helper method:

Here are two options I have tried:

private decimal? selectTolerance(decimal? globalTolerance, decimal? localTolerance) {      if(localTolerance == null)      {                if(globalTolerance == null){                    return null;                }else{                    return globalTolerance;                }      }     else      {                if(globalTolerance == null){                     return localTolerance;                }else{                    if(globalTolerance < localTolerance){                        return globalTolerance;                    }else{                        return localTolerance;                    }                }          }  } 

Alternatively,

private decimal? selectTolerance(decimal? globalTolerance, decimal? localTolerance) {            if (localTolerance == null && globalTolerance == null)            {                return null;            }             if (localTolerance != null && globalTolerance == null)            {                return localTolerance;            }             if (localTolerance == null && globalTolerance != null)            {                return globalTolerance;            }             if (globalTolerance < localTolerance)            {                return globalTolerance;            }            else            {                return localTolerance;            }   } 

Which of these are better? Any other alternatives?

  
 
 

Lista de respuestas

4
 
vote
vote
La mejor respuesta
 

Los métodos siempre deben ser nombrados en GetValueOrDefault()6 .

Puede condensar la lógica a lo siguiente:

  GetValueOrDefault()7  
 

Methods should always be named in PascalCase.

You can condense the logic to the following:

private decimal? SelectTolerance(decimal? globalTolerance, decimal? localTolerance) {     if (localTolerance == null || globalTolerance == null)     {         return localTolerance ?? globalTolerance;     }     return Math.Min(globalTolerance.Value, localTolerance.Value); } 
 
 
3
 
vote

El primer paso que puede tomar para simplificar enormemente esta función es comenzar así:

      if (globalTolerance == null)         return localTolerance;   

¿Por qué funciona eso? Porque si ambos parámetros son null , desea volver null , y la línea anterior hará eso. Si globaltolerance es null pero localtolerance no es null , desea devolver el valor de localtolerance < / fuerte> - y la línea anterior también hace eso. Y es una manera más sencilla.

Entonces todo lo que necesitas es

      if (localTolerance == null)         return globalTolerance;      return (globalTolerance < localTolerance) ? globalTolerance : localTolerance;   

El operador ternario ofrece una forma sencilla de devolver lo que sea menor. Así que el código completo es

  private decimal? SelectTolerance(decimal? globalTolerance, decimal? localTolerance) {     if (globalTolerance == null)         return localTolerance;      if (localTolerance == null)         return globalTolerance;      return (globalTolerance < localTolerance) ? globalTolerance : localTolerance; }   

simples.

cadenas de si (y, aún peor, si ... si ... si ) son muy frágiles por razones, explicado bastante a menudo en varios StecAkexchange sitios. En lugar de ensayar todos los motivos de nuevo aquí, eche un vistazo a mis otras respuestas para obtener una explicación de las fallas de ese tipo de estructura de control y una variedad de formas de evitarlo.

 

The first step you can take to hugely simplify this function is to start it like this:

    if (globalTolerance == null)         return localTolerance; 

Why does that work? Because if both parameters are null, you want to return null - and the above line will do that. If globalTolerance is null but localTolerance is not null, you want to return the value of localTolerance - and the above line does that too. And is way simpler.

Then all you need is

    if (localTolerance == null)         return globalTolerance;      return (globalTolerance < localTolerance) ? globalTolerance : localTolerance; 

The ternary operator offers a simple way to return whichever is lower. So the full code is

private decimal? SelectTolerance(decimal? globalTolerance, decimal? localTolerance) {     if (globalTolerance == null)         return localTolerance;      if (localTolerance == null)         return globalTolerance;      return (globalTolerance < localTolerance) ? globalTolerance : localTolerance; } 

Simples.

Chains of if (and, even worse, if... else... if) are very fragile for reasons I've explained quite often on various StackExchange sites. Rather than rehearse all the reasons again here, take a look at my other answers for both an explanation of the faults of that kind of a control structure and a range of ways to avoid it.

 
 
   
   

Relacionados problema

3  Generador de imágenes de Mandelbrot con iteración paralela  ( Mandelbrot image generator with parallel iteration ) 
Actualmente estoy tratando de optimizar esta clase que tengo para la generación fractal. La ecuación está destinada a ser conectable; He usado z => z*z + c ...

1  TPL HILO FUGA Y FUGA DE MEMORIA  ( Tpl thread leak and memory leak ) 
Estoy tratando de rastrear lo que supongo que debo ser una pérdida de memoria / hilo en uno de mis programas. Mi programa usa una función para cargar un arc...

3  Genéricos anulables - implementando secuencialSearchst en C #  ( Nullable generics implementing sequentialsearchst in c ) 
Para fines de aprendizaje, estoy implementando cierto código de SEDEDWICK & AMP; Los algoritmos de Wayne, cuarta edición . Debido a las características del...

7  Colecciones vacías en caché  ( Cached empty collections ) 
A menudo necesito devolver las colecciones vacías. Uno de esos días, escribí lo siguiente para devolver una instancia en caché: public static class Array<...

3  Mientras que el bucle usa variables adicionales, ¿se puede limpiar esto?  ( While loop uses extra variables can this be cleaned up ) 
Una pieza de mi programa permite que se utilice el bucle y la incremento de una entidad seleccionada en un bucle de tiempo en otro lugar. Aquí hay una muestra...

6  PRIGO DE PODER TICTACTOO EN C #  ( Command prompt tictactoe in c ) 
Escribí un juego básico de comando TIC TAC TOE juego. Quiero saber qué se puede mejorar en términos de modelado y qué errores he hecho (si corresponde). vo...

0  Creación de múltiples objetos del extracto de SQL Server  ( Creating multiple objects from sql server extract ) 
He creado una solución prototipo simplificada como una especie de prueba de concepto antes de comenzar un programa más grande. Aquí están los datos de prueb...

6  ¿Está mi delegado definió la forma correcta y necesita transformarse en una mariposa bonita?  ( Is my delegate defined the right way and does it need to transform to a pretty e ) 
He leído tantos Historias de tiempo de cama e inserciones de cómo < fuertes> delegados trabajo y por qué eventos deben ser reemplazados por los delegado...

35  Demasiados bucles en la aplicación de dibujo  ( Too many loops in drawing app ) 
Tengo un método que tiene muchos bucles: #ifndef __RUNES_STRUCTURES_H #define __RUNES_STRUCTURES_H /* Runes structures. */ struct Game { char board[2...

7  Versión LINQ del algoritmo de recocido simulado  ( Linq version of the simulated annealing algorithm ) 
Decidí intentarlo e implementar (una versión de) la recocido simulado algoritmo usando solo linq , solo para ver si pudiera. Me encantaría si alguien pudi...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos