¿Hay algo malo con este doble ternario? -- actionscript-3 camp codereview Relacionados El problema

Is there anything wrong with this double ternary?


3
vote

problema

Español

¿Hay algo de malo en usar el operador doble ternario así:

  var stateName:String = state is String ? state as String : "name" in state ? state.name : null;   

Aquí hay dos líneas porque alguien lo solicitó:

  var stateName:String = state is String ? state as String :                          "name" in state ? state.name :                              null;   

Aquí está la alternativa:

  if (state is String) {     stateName = state as String; } else if ("name" in state) {     stateName = state.name; } else {     stateName = null; }   

La función:

  /**  * Sets the style in the state specified. Creates state if it doesn't exist.  * */ public static function setStyleInState(styleName:String, value:*, state:*, target:UIComponent = null):void {     var stateName:String = state is String ? state as String : "name" in state ? state.name : null;      if (!StateUtils.hasState(target, state)) {         state = createState(stateName, null, target);     }     else if (!(state is State)) {         state = getState(target, stateName);     }      // more code to write }   

tiene sentido para mí, pero soy el que lo escribe.

Este es ActionScript3 o Ecmascript 4 (básicamente JavaScript con un fuerte mecanografía).

Original en ingles

Is there anything wrong with using double ternary operator like so:

var stateName:String = state is String ? state as String : "name" in state ? state.name : null; 

Here is two lines because someone requested it:

var stateName:String = state is String ? state as String :                          "name" in state ? state.name :                              null; 

Here is the alternative:

if (state is String) {     stateName = state as String; } else if ("name" in state) {     stateName = state.name; } else {     stateName = null; } 

The function:

/**  * Sets the style in the state specified. Creates state if it doesn't exist.  * */ public static function setStyleInState(styleName:String, value:*, state:*, target:UIComponent = null):void {     var stateName:String = state is String ? state as String : "name" in state ? state.name : null;      if (!StateUtils.hasState(target, state)) {         state = createState(stateName, null, target);     }     else if (!(state is State)) {         state = getState(target, stateName);     }      // more code to write } 

It makes sense to me but I'm the one writing it.

This is ActionScript3 or ECMAScript 4 (basically JavaScript with strong typing).

  
         
         

Lista de respuestas

5
 
vote
vote
La mejor respuesta
 

Dado su ejemplo, creo que su operación doble ternaria debería ser una función separada. Cuando empiezas a conseguir una sola línea compleja como esta, es una señal de que necesita otra función. Aquí es cómo me acercé a él:

  GetRange()4  

Esto podría usarse en su función así;

  GetRange()5  

Hay más que decir aquí; Creo que la exposición de la mutabilidad como esta en un método estático (en lugar de en la instancia de un estado) le llevará a problemas más adelante en la carretera y probablemente debería volver a evaluar su diseño.

Específicamente, State en los métodos estáticos es siempre una receta para el desastre cuando se trata de la prueba y la depuración, especialmente cuando se ramifica en múltiples hilos.

 

Given your example I think that your double ternary operation should actually be a separate function. When you start getting complex one-liners like this, it is a sign that you need another function. Here's how I approached it:

function getStateName(state) {   if(state is String) {     return state as String;   }    // This will always return "null" if state.name does not exist.   // I don't know about AS, but in JavaScript if something doesn't   // exist it returns as undefined (not null), but you want the null   // return. As far as I am aware, AS supports the || short-circuit and   // truthy/falsey equivalence, like JavaScript.   return state.name || null; } 

This could be used in your function like so;

public static function setStyleInState(styleName:String, value:*, state:*, target:UIComponent = null):void {     var stateName:String = getStateName(state);      if (!StateUtils.hasState(target, state)) {         state = createState(stateName, null, target);     }     else if (!(state is State)) {         state = getState(target, stateName);     } } 

There's more to be said here; I think that exposing mutability like this on a static method (instead of on the instance of a state) is going to lead you into trouble later on down the road and you should probably re-evaluate your design.

Specifically, state in static methods is always a recipe for disaster when it comes to testability and debugging, especially when you branch into multiple threads.

 
 
       
       

Relacionados problema

3  ¿Necesito eliminar estos oyentes de eventos?  ( Do i need to remove these event listeners ) 
El siguiente código ActionScript solo descarga e intenta analizar a algunos JSON desde un servicio API. Dentro del método, he definido una función 9988776665...

4  Obtener mejor velocidad de ajustar las filas en un DockableToolbar  ( Getting better speed from adjusting rows in a dockabletoolbar ) 
He estado usando FlexLib para su función de barra de herramientas acoplable. Cuando encoge la ventana, intentará envolver las filas si el ancho de la etapa es...

3  Contenido de precarga en StageWebView  ( Preload content in stagewebview ) 
Me gustaría obtener algunos comentarios sobre mi código AS3 a continuación. Es para una aplicación móvil Adobe Air para precargar un sitio web en un contenedo...

3  Implementación de la estructura de datos del gráfico de ActionScript  ( Actionscript graph data structure implementation ) 
Entonces, no estoy seguro de si debería tener Vertex Extender 9988777665544331 , porque el 9988777665544332 y < Código> compareTo()3 Las funciones ya e...

3  Agregar eventos Dispositivo para ActionScript Framework Robotlegs  ( Add events dispatching for actionscript framework robotlegs ) 
Tengo la siguiente función en un ArrayList4 clase ArrayList5 Este ArrayList6 la clase debe enviar un ArrayList7 es exitoso y un ArrayList9 si ...

1  Pasando muchas opciones a una función  ( Passing lots of options to a function ) 
Estoy aprendiendo Codificación de ActionScript 3 haciendo un juego de plataformas de crappy :) El problema que estoy enfrentando está pasando muchas opcione...

2  ¿Hay algo parcial en esta prueba de rendimiento?  ( Is there anything biased in this performance test ) 
Sólo preguntándome si esta prueba de rendimiento básica entre una matriz sin impresión de matrices y un vector (matriz escrito) de matrices en ActionScript 3 ...

4  Usando booleanos para gestionar el estado  ( Using booleans to manage state ) 
Estoy en medio de escribir mi propio juego de disparos de bullet mucho en el estilo de Touhou. Todo funciona bien hasta ahora, pero estoy al no gustarles cier...

3  Cómo simplificar a mi otra persona  ( How to simplify my else if statement ) 
Bien, así que este no es un problema con mi programa, no funciona, es más un hecho que quiero aprender a codificar mejor. Este es uno de los 6, si es posibl...

3  Cheque de robustez de clase aérea AS3  ( As3 air class robustness check ) 
Tengo una clase aérea de ActionScript 3 que me gustaría que verificaste por robustez. Sé que es un gran código y no se le exige que revise el código completo,...




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