2010-10-18 13 views
7

Hola a todos, este es mi pequeño código de Frankenstein, no se burlen de él, ¡funciona! Entonces pasaría el nombre de la tabla y los datos como una matriz asociativa que son objetos. Estoy bastante seguro de que este no es un buen código como lo era y todavía estoy aprendiendo ActionScript. Entonces, ¿qué puedo cambiar o cómo lo harían mejor?¿Cómo puedo mejorar mi código AS3/Air?

public function save(table:String,data:Object):void 
     { 
      var conn:SQLConnection = new SQLConnection(); 
      var folder:File = File.applicationStorageDirectory; 
      var dbFile:File = folder.resolvePath("task.db"); 
      conn.open(dbFile); 

      var stat:SQLStatement=new SQLStatement(); 
      stat.sqlConnection=conn; 

      //make fields and values 
      var fields:String=""; 
      var values:String=""; 
      for(var sRole:String in data) 
      { 
       fields=fields+sRole+",:"; 
       stat.parameters[":"+sRole]=data[sRole]; 
      } 
      //trim off white space 
      var s:String=new String(fields); 
      var cleanString:String=s.slice(0, -2); 

      //over here we add : infront of the values I forget why 
      var find:RegExp=/:/g; 
      var mymyField:String=new String(cleanString.replace(find,"")); 
      cleanString=":"+cleanString; 

      var SQLFields:String=mymyField; 
      var SQLValues:String=cleanString; 

      stat.text="INSERT INTO "+table+" ("+SQLFields+")VALUES("+SQLValues+")"; 

      stat.execute(); 
     } 

Respuesta

5

La parte donde crea su consulta es todo un horror, para ser sincero. La mitad del código elimina la basura que agregaste solo unas líneas antes. Esto hace que sea difícil de leer y entender. Que es un signo de mala calidad de código. Lo siguiente es mucho más corto y simple:

 //make fields and values 
     var fields:Array = []; 
     for(var field:String in data) { 
      fields.push(field); 
      stat.parameters[":"+field]=data[fieldName]; 
     } 
     var sqlFields:String = fields.join(","); 
     var sqlValues:String = ":"+fields.join(",:"); 

     stat.text="INSERT INTO "+table+" ("+sqlFields+")VALUES("+sqlValues+")"; 

     stat.execute(); 
3

Alguien me dijo una vez que una idea estúpida que funciona no es estúpida. Como programador, nuestro primer objetivo es (a menudo) resolver problemas comerciales; y siempre que nuestro código lo haga, tendremos éxito. No necesita disculparse por el código que funciona.

En términos de lo que haría para cambiar su fragmento; Podría encapsularlo un poco más. ¿Pueden agregarse la carpeta, dbFile y el nombre de archivo db (task.db) como propiedades a su clase o argumentos al método?

¿Puede separar la creación de la instrucción SQL del manejo de la conexión de su análisis de datos?

+0

Estoy de acuerdo con esa primera afirmación siempre que no se abuse de los recursos del sistema. la memoria, especialmente en el flash residente del navegador, siempre debe gestionarse correctamente. – TheDarkIn1978

+0

+1. aunque el código es realmente tan horrible, que no diría que realmente "funciona" como código. – back2dos

3

Algunas observaciones,

  • Como se ha dicho antes de que pueda factorizar toda la conexión db para que pueda volver a utilizar la función sin tener que reescribir si es necesario cambiar el nombre db.

  • No utilice nueva String() se puede evitar

  • no es muy útil para limpiar el espacio en blanco entre su campo: una, que: B es lo mismo que: a,: b

  • Algunos

    convención no comienzan su nombre var local con una mayúscula, y no es útil para reasignarlos a otra var

Si no consigo mal después de su //make fields and values puede reescribirse como por ejemplo:

//make fields and values 
var fields:String = ""; 
var values:String = ""; 
var fieldSeparator:String = ""; 

for(var sRole:String in data) 
{ 
    fields += fieldSeparator + sRole; 

    var paramName:String = ":" + sRole; 
    values += fieldSeparator + paramName; 

    stat.parameters[paramName] = data[sRole]; 

    fieldSeparator = ","; 
} 

stat.text = "INSERT INTO " + table +" (" + fields + ") VALUES (" + values + ")"; 

stat.execute(); 
Cuestiones relacionadas