SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新開発言語「Scala」の実体

Javaの限界を超えて実用化を目指す
新開発言語「Scala」のメリットとは~後編

キーワードは手軽さと拡張性

  • X ポスト
  • このエントリーをはてなブックマークに追加

SELECT/DELETE/UPDATE/INSERTを実行

 続いてLiftのマッパークラスを利用して、SELECT/DELETE/UPDATE/INSERTを実行してみます。まず、HTMLを編集しておきましょう。

 ¥todo¥src¥main¥webapp¥index.htmlの4行目に、次を追記します。

<lift:TestSelectInsert.doSelect />
<lift:TestSelectInsert.doInsert />

 これは、「TestSelectInsertクラスのdoSelect関数とdoInsert関数を呼び出す」という意味を持つLift固有の表記法です。

 このクラスと関数を作成してみましょう。¥todo¥src¥main¥scala¥com¥liftworkshop¥snippetフォルダにTestSelectInsert.scalaファイルを新規作成し、LIST37のコードを記述します。最後にLIST36と同様にWebサーバを起動します。なお、前提として、test1テーブルに5行以上のデータを入れておくことが必要です。

LIST37
package com.liftworkshop.snippet

import com.liftworkshop.model._

class TestSelectInsert {
	/** SELECT DELETE UPDATE のテスト関数*/
	def doSelect = {
		//全ての行をSELECTする
		val rows = Test1Table.findAll
		
		<div>
		{
			var count = 0
			rows.flatMap{ row => 
				count += 1
				if(count == 1){
					//UPDATEする
					row.name("!" + row.name).price(row.price + 1000).save()
					<p>{row.id + " : " + row.name + " is " + row.price + "円"}</p>
				}else if(count == 3){
					//DELETEする
					if(Test1Table.delete_!(row)){
						println("Delete OK")
					}else{
						println("Delete Error")
					}
					scala.xml.NodeSeq.Empty
				}else{
					<p>{row.id + " : " + row.name + " is " + row.price + "円"}</p>
				}
			}
		}
		</div>
	}
	
	/** INSERTのテスト関数 */
	def doInsert = {
		import java.util.Date
		//空の行を用意する
		val newRow = Test1Table.create
		//テスト用に現在時刻を付加している
		//INSERTする
		newRow.name("japaneseWine | " + new Date().toString + " | ").price(3000).save()
		<span>test</span>
	}
}

 ソースコード中に、findAllやflatMapなどJavaではなじみの少ない表記が登場してきましたね。Scalaでは、関数型言語の特徴を活かし、データ全体を扱うためのコードを簡単に記述できます(いわゆる高階操作というテクニックです。高階操作の詳細は、次回解説したいと思います)。画面3はWebブラウザで、http://localhost:8080/にアクセスした直後の画面です。

画面3:サンプルデータの表示
画面3:サンプルデータの表示

 さらに、Webブラウザの[更新]ボタンを押すと、画面4のようにデータが更新されていることが分かります。

画面4:データが更新されている
画面4:データが更新されている

 LIST37を見ると、doSelect関数では、全データをSELECTして表示しています。その際に、1件目のデータをUPDATEし、3件目のデータをDELETEしています。doInsert関数では、新しい行をINSERTしています。このように、すべての操作を1、2行で終わらせることが特徴です。詳しくはnet.lift.mapperパッケージ内を参照ください。

まとめ

 今回の連載では、一部の機能しか説明できませんでしたが、読者の方にScalaを知ってもらい、実際に動作させて試してもらうところまでは解説できたと思います。

 これまで実務的なプログラミング言語の世界では、動的言語の手軽さをとるか、静的言語の厳密さをとるかという二者択一の選択肢となりがちでした。Scalaは、「型を推論する(型推論)」・「データ集合を集合全体として操作する(高階操作)」といった、関数型言語の成果を上手に取り込み、両者を同時に実現することができています。また、言語として新しい機能を多く実装しながらも、Javaなど既存言語のプログラマにとって違和感の少ない表記法が採用されていることも特徴です。Scalaを選択することによって得られる生産性/スケーラビリティの向上などは、新しい言語を覚えるコストを払うに値するものだと考えています。

 ぜひScalaに触れることで、その良さを感じてください。なお、本稿で説明しきれなかったScalaの個性的なプログラミング手法(高階操作、パターンマッチなど)については、近日中に簡単な解説記事を公開する予定です。こちらもぜひ、楽しみにお待ちください。

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
新開発言語「Scala」の実体連載記事一覧

もっと読む

この記事の著者

株式会社パテントビューロ 三木隆史(ミキ タカフミ)

株式会社パテントビューロ所属。マネージャー業務と平行して、Webアプリケーション開発、自然言語系の研究開発を行なう。以前はC言語による組込開発。違和感なくScalaへ移行できたことや、ロジック部分に注力できる生産性の高さに驚いている。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

株式会社パテントビューロ 木村吉博(キムラ ヨシヒロ)

政府系研究機関での研究開発を経て、現在、株式会社パテントビューロにて、プログラミング(知財関連文書(SGML/XML)の変換バッチ処理のScalaでの記述など)を担当している。複雑でイレギュラーな記述も多々見られる大量の文書を相手にする際に、Scalaの書きやすさと高速性とに大いに助けられている。か...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/4476 2009/11/19 14:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング