如何让我的AS3 / Air代码更好?

时间:2010-10-18 15:02:40

标签: flex actionscript-3 air adobe

大家好,这是我的小弗兰肯斯坦代码,不要取笑它,它的工作原理! 因此,您将传递表名称和作为关联数组的数据作为对象。 我很确定这不是像我一样好的代码而且还在学习ActionScript。那么我可以改变什么,或者你们如何让它变得更好?

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();
        }

3 个答案:

答案 0 :(得分:5)

诚实地说,构建查询的部分非常恐怖。一半的代码删除了之前添加了几行的垃圾。这使得阅读和理解变得困难。这是代码质量差的迹象。以下内容更短更简单:

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

答案 1 :(得分:3)

有人曾告诉我,一个有效的愚蠢想法并不愚蠢。作为程序员,我们的第一个目标是(经常)解决业务问题;只要我们的代码那样做,那么我们就会成功。您无需为有效的代码道歉。

就我将如何改变你的片段而言;我可能会把它封装一下。可以将文件夹,dbFile和db文件名(task.db)作为属性添加到类或方法的参数中吗?

您能否从数据解析的连接处理中分离出SQL语句的创建?

答案 2 :(得分:3)

一些评论,

  • 如前所述,您可以将所有数据库连接分解,以便在需要更改数据库名称时重复使用该功能而无需重写。

  • 不要使用新的String(),可以避免使用

  • 清除字段之间的空白区域没有用处:a,:b与:a,:b

  • 相同
  • 某些约定不会以大写形式开始本地var名称,并且将它们重新分配给另一个var

  • 无用。

如果我的//make fields and values可以改写之后我没有错,例如:

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