第2回Android勉強会でAndroid & Scala

2009/05/31 by demuyan · コメントする
カテゴリー: Android, Scala 
  このエントリーを含むはてなブックマーク この記事をクリップ! コメントを見る

という訳で、第2回Android勉強会@金沢支部で、一部の方に非常に注目されているAndroid & Scalaの話をしてきた。こんな事やってる人は、全世界合わせても100名いないはず。先駆者になるチャンス。

金沢は遠すぎて参加できなかったよ、という方の為に、発表内容+アルファで再現してみる。

Scalaについて

オブジェクト指向型言語と関数型言語のいいとこ取り。

釈迦に説法になりそうなのでこれ以上の解説はパス。参照:Scala – Wikipedia

開発環境

開発手順

今回初めてScalaを使用するので

  • Javaにて作成、デバッグ、実行
  • Scalaに移植

という順序で開発を行った。

動作するアプリケーションを作ってきたよ

あるサイトのRSSを解析して、リンク先を表示するアプリケーション

Scala版のファイルサイズがやたらデカいのは、Scalaのライブラリもアーカイブしてある為。 HatebuReaderというアプリ名をつけながら参照先はITMediaだったりする。 はてブのホッテントリーを取得する予定だったのだが、Androidで動作させるとXMLを解析するところで例外を吐くので断念。解決方法があると思うのだが時間切れにより終了。PCなら動くんだけどなあ。

Scalaの強み、その1 クラス定義

Javaだとこう書くところが

public class BlogEntry {
    private String title;
    private String link;
 
    public String getLink() { return link; }
    public String getTitle() { return title; }
 
    public BlogEntry(String _title, String _link) {
        title = _title;
        link = _link;
    }
 
    @Override
    public String toString() {
        return title;
    }
}

Scalaだとこうなる

class BlogEntry(_title: String, _link: String)
{
  val title = _title
  val link = _link
 
  override def toString():String = 
    return title
 
}

すっきり見やすい。

Scalaの強み、その2 XML解析

「Javaがあるところ、影にXML有り」と言われるほど、JavaではXMLが頻繁に登場する。そんなXMLの扱いもかなりお手軽。

Javaだとこう書くところが

DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
 
Document dom = db.parse(in);
Element docEle = dom.getDocumentElement();
 
blogEntries.clear();
 
NodeList nl = docEle.getElementsByTagName("item");
if (nl != null && nl.getLength() > 0) {
    for (int i = 0; i < nl.getLength(); i++) {
        Element entry = (Element) nl.item(i);
        Element title = (Element) entry.getElementsByTagName("title").item(0);
        Element link = (Element) entry.getElementsByTagName("link").item(0);
 
        String details = title.getFirstChild().getNodeValue();
        String linkString = link.getFirstChild().getNodeValue();
 
        BlogEntry entry_ = new BlogEntry(details, linkString);
 
        addNewEntry(entry_);
    }
}

Scalaだとこうなる

val cpa = scala.xml.parsing.ConstructingParser.fromSource(src, false) 
val ele = cpa.document().docElem
blogEntries.clear()
 
ele match {
  case <rdf:RDF>{therms @ _*}</rdf:RDF> =>
    for (therm @ <item>{_*}</item> <- therms)
    {
      var title = (therm \ "title").text
      var link = (therm \ "link").text
      val entry_ = new BlogEntry(title, link)
      addNewEntry(entry_)
    }
}

こっちの方がすっきりして見やすいでしょ。RubyのHpricotを彷彿させる。

開発してみて

  • Javaコードをそのまま移植する程度なら、学習コストはさほど高くない。Java & LL(Perl, Python,Ruby)を知っている人なら、なおさら。
  • 現状AndroidでScalaを利用する際は、Scalaで作成したライブラリをJavaからコールする方法がスマートではないかと
  • 手軽に高速なコードを書くには丁度いい。あとは開発環境が充実してくれれば言うことないのだが。

どこでもお話しますよ

こんな要望があるか不明だけと、Androidの話を聞きたいという依頼があれば引き受けます。詳細については応談なので demuyan at cnu dot jp までメール下さい。

Programming in Scala: A Comprehensive Step-by-step Guide
Programming in Scala: A Comprehensive Step-by-step GuideMartin Odersky

おすすめ平均
starsScalaという新しい視点
stars開発者本人によるScala入門

Amazonで詳しく見る
by G-Tools

補足(2009/8/23)

Android SDK 1.5 でもビルドできる事が後に判明。

  • (android-sdkのフォルダ)/tools以下をすべてを (android-sdkのフォルダ)/platforms/android-1.5/toolsにコピー
  • (android-sdkのフォルダ)/platforms/android-1.5/toolsにPATHを通す

  • HatebuReader.zip内のdefault.propertiesを開き、sdk-folderを、 (android-sdkのフォルダ)/platforms/android-1.5/ と指定する。

これでコンパイルできる。

こちらもあわせてどうぞ

Comments

コメントをどうぞ...





Trackback URL

Get Adobe Flash playerPlugin by wpburn.com wordpress themes