Как я могу улучшить свой код AS3 / Air? - PullRequest
7 голосов
/ 18 октября 2010

Привет всем, это мой маленький код Франкенштейна, не смейтесь над ним, это работает!Таким образом, вы должны передать имя таблицы и данные в виде ассоциативного массива, которые являются объектами.Я уверен, что это не очень хороший код, каким я был и до сих пор изучаю 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 ]

5 голосов
/ 19 октября 2010

Если честно, то, где вы строите свой запрос, ужасно. Половина кода удаляет мусор, который вы добавили всего несколькими строками ранее. Это затрудняет чтение и понимание. Что является признаком низкого качества кода. Следующее намного короче и проще:

        //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 голосов
/ 18 октября 2010

Некоторые замечания,

  • Как уже было сказано, вы можете разложить все соединения БД, чтобы вы могли использовать функцию без перезаписи, если вам нужно изменить имя БД.

  • Не используйте новые String (), вы можете избежать этого

  • бесполезно очищать пустое пространство между полями: a,: b совпадает с: a,: b

  • В некоторых соглашениях имя локальной переменной не начинается с заглавной буквы, поэтому переназначать ее другой переменной бесполезно

Если я не ошибаюсь после того, как ваш //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();
3 голосов
/ 18 октября 2010

Кто-то однажды сказал мне, что глупая идея, которая работает, не глупа.Наша цель как программиста (часто) - решать вопросы бизнеса;и пока наш код делает это, мы успешны.Вам не нужно извиняться за код, который работает.

Что бы я сделал, чтобы изменить ваш фрагмент кода;Я мог бы просто заключить это в капсулу немного больше.Можно ли добавить папку, файл dbFile и имя файла db (task.db) в качестве свойств вашего класса или аргументов метода?

Можете ли вы отделить создание оператора SQL от обработки соединения от анализа данных?

...