40歳からのキャリアチェンジ

20代はエンジニア・PM、30代はWeb系エンジニア向けのキャリアアドバイザー。40代の今はフリーランスで開発含めて色々やってます。技術ネタとしてはRuby/RailsとJavaScript関連あたり

012-ユニットテスト(データベース接続)

こんなテストを準備して実行したらexpected: "199/14992.html" result: "101/14977.html"という感じでテストにパスないことが判明

Ti.include('database.js');
var blogDB = new blogDB();

module("database connection");

test("unit test for database connection",
  function(){
    var blog_id = blogDB.items[0].blog_id;
    equals(blog_id,"199/14992.html");
  }
);

とりあえずTitanium.API.info()を使ってひたらす怪しそうな所をチェック

自分が意図したデータ構造はこんな感じ。

[
  {blog_id: "199/14992.html",
   blog_entry: "ブログ本文1..."
  },
  {blog_id: "101/14977.html",
   blog_entry: "ブログ本文2..."
  }
]

そのため最初の配列に格納されているオブジェクトのblog_id引っ張ってくれば、"199/14992.html"になるという意図だったのに、実際には2番目の配列の値を引っ張っているように見えました。

そのため、Titanium.API.info()メソッドを使い配列に値を格納してる所の処理確認したらこんな感じになっていました。

 (
{
"blog_entry" = "(長いので割愛)";
"blog_id" = "101/14977.html";
},
{
"blog_entry" = "(長いので割愛)";
"blog_id" = "101/14977.html";
}
)

配列の先頭に最初の値を格納して、次のループ処理をした時に、先頭の値も上書きしていたみたいだったので、こうしたら意図した通りに動くようになった。

var blogDB = function(){
  this.items=[];
  this.init();
};
blogDB.prototype = {
  init:function(){
    var columns = [
      "blog_id",
      "blog_entry"
    ];
    var db = Titanium.Database.install('blog.db','blogDB');
    var rows = db.execute('SELECT * FROM entry');
    var i,z= columns.length;
    while (rows.isValidRow()){
      var item ={};
      for(i=0;i < z;i++){
	item[columns[i]] = rows.fieldByName(columns[i]);
      }
      this.items.push(item);
      rows.next();
    }
    rows.close();
    db.close();
    return this.items;
  }
};

これをベースにして開発続けるのになんとなく抵抗が・・

自分が作ろうとしているのはあすなろBLOGのブロガー別に記事を閲覧できるアプリケーション。

そうなると思いつくメソッドとして

var blogDB = new blogDB();
blogDB.showAllBlogger(); // 登録されているブロガー一覧取得
blogDB.findEntryList(blogger); //該当するブロガーの これまでのエントリ一覧取得できる
blogDB.insertEntry(blogger, blog_id, blog_entry); // 該当するブロガーのブログ記事をデータベースに格納
:

という感じだけど、上記にちょっと書いた現在のデータ構造だとなんとなくうまく扱えない気がする。

※このあたりが1人開発&職業としてプログラマーの経験が無い自分のカベなんだろうなぁ。

O/Rマッピングツールに対する誤解をときたい

オブジェクト指向で設計 → オブジェクト指向言語で実装、というところまではスマートに進んだのに、データを保存したり取り出したりする部分でつまずいてしまいました。

・・・これがインピーダンスミスマッチ問題です。

つまりオブジェクト指向上のクラスとリレーショナルデータベースは互換性が無いため、バリバリのオブジェクト指向で作られたプログラムほど、データベースとのやりとりに困るわけです。

というエントリなんかを読んでいてもしっかりとしたO/Rマッピングツール使って、使い易いAPIを考えながら実装していくほうがよいのかな。

次回書きたい内容