2010-10-18 14 views
7

Ciao a tutti questo è il mio piccolo codice Frankenstein, non prenderlo in giro, funziona! Così si passerebbe il nome della tabella e un dato come un array associativo che sono oggetti. Sono abbastanza sicuro che questo non è un buon codice come lo ero io e sto ancora imparando ActionScript. Quindi, cosa posso cambiare o come fareste a migliorarlo?Come posso migliorare il mio codice 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(); 
     } 

risposta

5

La parte in cui si crea la query è piuttosto un orrore, a dire il vero. La metà del codice rimuove la posta indesiderata che hai aggiunto solo poche righe prima. Questo rende difficile leggere e capire. Quale è un segno di scarsa qualità del codice. Quanto segue è molto più breve e più semplice:

 //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

Qualcuno una volta mi ha detto che un'idea stupida che funziona non è stupida. Come programmatore, il nostro primo obiettivo è (spesso) risolvere i problemi aziendali; e finché il nostro codice lo fa, allora abbiamo successo. Non è necessario scusarsi per il codice che funziona.

In termini di cosa farei per modificare lo snippet; Potrei incapsularlo un po 'di più. La cartella, dbFile e il nome del file db (task.db) possono essere aggiunti come proprietà alla classe o agli argomenti del metodo?

È possibile separare la creazione dell'istruzione SQL dalla gestione della connessione dall'analisi dei dati?

+0

sarei d'accordo con quella prima affermazione fintanto che le risorse di sistema non vengono abusate. la memoria, specialmente nel flash residente del browser, dovrebbe sempre essere gestita correttamente. – TheDarkIn1978

+0

+1. anche se il codice è davvero così orribile, che non direi che in realtà "funziona" come codice. – back2dos

3

Alcune osservazioni,

  • Come detto prima che sia possibile fattorizzare fuori tutto il collegamento di db in modo da poter riutilizzare la funzione senza riscriverlo se è necessario cambiare il nome db.

  • Non utilizzare nuove String() si può evitare

  • non è utile per pulire lo spazio bianco tra il campo: un,: b è lo stesso: una,: b

  • Alcuni convenzione non cominciano il tuo nome var locale con un maiuscolo, e non è utile per riassegnare ad un altro var

Se non ho ricevuto sbagliato dopo il vostro //make fields and values può essere riscritta per esempio come:

//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(); 
Problemi correlati