Scala + Liftフレームワーク その2.

Slides:



Advertisements
Similar presentations
アルゴリズムとプログラミン グ (Algorithms and Programming) 第6回:クラスとインスタンス クラスの宣言 アクセス修飾子 インスタンスの生成 (new キーワード) this キーワード フィールドとメソッドの実際の定義と使い 方 クラスの宣言 アクセス修飾子 インスタンスの生成.
Advertisements

オブジェクト指向 言語 論 第八回 知能情報学部 新田直也. 多相性(最も単純な例) class A { void m() { System.out.println( “ this is class A ” ); } } class A1 extends A { void m() { System.out.println(
オブジェクト指向 プログラミング 第二回 知能情報学部 新田直也. 講義計画(あくまで予定) 第 1 回 プログラミング言語の種類と歴史 第 2 回 eclipse の基本操作 第 3 回 eclipse のデバッグ機能 第 4 回 構造化プログラミングの復習 第 5 回 演習 第 6 回 構造化指向からオブジェクト指向へ.
ソフトウェア工学 理工学部 情報システム工学科 新田直也. 演習問題 1 の解答例  入庫処理の DFD 酒屋の在庫問題の DFD( 入庫処理 ) 更新情報 在庫ファイル 更新処理 倉庫係 在庫不足リスト 在庫ファイル 出庫指示書 新規出庫 判定 出庫指示書 作成処理 出庫依頼 積荷票.
Scala + Lift フレームワーク. Scala の概要 JVM 上で動作するオブジェクト指向+関数型言 語 JVM のスケーラビリティを適用できる Java との相互利用が可能 trait を利用した多重継承( Mix-In )が可能.
6.4継承とメソッド 6.5継承とコンストラクタ 11月28日 時田 陽一
JavaScript プログラミング入門 2006/11/10 神津.
Javaのための暗黙的に型定義される構造体
プログラミングパラダイム さまざまな計算のモデルにもとづく、 プログラミングの方法論 手続き型 関数型 オブジェクト指向 代数 幾何.
アルゴリズムとデータ構造1 2007年6月12日
最適化ソルバーのための Python言語入門
Myoungkyu Song and Eli Tilevich 発表者: 石尾 隆(大阪大学)
第2回:Javaの変数と型の宣言 プログラミングII 2007年10月2日.
アルゴリズムとデータ構造 2011年6月13日
JavaBeans とJSP データベース論 第5回.
JSFによるWebアプリケーション開発 第6回
エンタープライズアプリケーション II 第7回 / 2006年7月9日
ピカチュウによる オブジェクト指向入門 (新版)
第6回独習Javaゼミ 第6章 セクション4~6 発表者 直江 宗紀.
プログラミング演習3 第2回 GUIの復習.
第13回 ハッシュテーブルを使ったプログラム ~高速に検索するには?~.
~手続き指向からオブジェクト指向へ[Ⅱ]~
細かい粒度でコードの再利用を可能とするメソッド内メソッドのJava言語への導入
オブジェクト指向 プログラミング 第十四回 知能情報学部 新田直也.
9.1 DOMの概要 9.2 DOMプログラミングの基礎 9.3 DOMのプログラミング例
ソフトウェア工学 知能情報学部 新田直也.
第4回JavaScriptゼミ セクション2-8 発表者 直江 宗紀.
アルゴリズムとプログラミング (Algorithms and Programming)
0からわかるF# Part1 中 博俊 F# September 2008 CTP Base.
0からわかるF# Part1 中 博俊 F# September 2008 CTP Base.
独習JAVA 6.8 コンストラクタの修飾子 6.9 メソッドの修飾子 6.10 ObjectクラスとClassクラス 11月28日(金)
オブジェクト指向 プログラミング 第十一回 知能情報学部 新田直也.
オブジェクト指向 プログラミング 第十三回 知能情報学部 新田直也.
暗黙的に型付けされる構造体の Java言語への導入
0からわかるF# Part1 中 博俊 F# September 2008 CTP Base.
プログラミング言語入門.
オブジェクト指向 プログラミング 第十四回 知能情報学部 新田直也.
0からわかるF# Part1 中 博俊 F# September 2008 CTP Base.
プログラミング演習3 第2回 GUIの復習.
C#言語ソースプログラムの原型 C言語 C#言語 Hello World! Hello Students! オマジナイ! 適当なクラス名
Java8について 2014/03/07.
オブジェクト指向言語論 第十一回 知能情報学部 新田直也.
オブジェクト指向言語論 第八回 知能情報学部 新田直也.
0からわかるF# Part1 中 博俊 F# September 2008 CTP Base.
0からわかるF# Part1 中 博俊 F# September 2008 CTP Base.
pointcut に関して高い記述力を持つ アスペクト指向言語 Josh
オブジェクト指向言語論 第十一回 知能情報学部 新田直也.
オブジェクト指向 プログラミング 第九回 知能情報学部 新田直也.
オブジェクト指向プログラミング クラス 継承
プログラミング言語論 第十三回 理工学部 情報システム工学科 新田直也.
オブジェクト指向 プログラミング 第八回 知能情報学部 新田直也.
Webアプリケーションと JSPの基本 ソフトウェア特論 第4回.
オブジェクト指向 プログラミング 第六回 知能情報学部 新田直也.
プログラミング言語論 第十一回 理工学部 情報システム工学科 新田直也.
アルゴリズムとデータ構造 2012年6月11日
Javaによる Webアプリケーション入門 第4回
サブゼミ第7回 実装編① オブジェクト型とキャスト.
ソフトウェア制作論 平成30年11月28日.
Action Method の実装 J2EE II 第9回 2004年12月2日.
JAVA入門⑥ クラスとインスタンス.
18. Case Study : Imperative Objects
オブジェクト指向言語論 第九回 知能情報学部 新田直也.
ソフトウェア工学 知能情報学部 新田直也.
Javaとは Javaとはオブジェクト指向言語でJava VM(Java仮想マシン)と呼ばれるプログラム上で動作します。
オブジェクト指向言語論 第六回 知能情報学部 新田直也.
例題のプログラムを通して JavaScriptの仕組みを理解することとします。
オブジェクト指向言語における セキュリティ解析アルゴリズムの提案と実現
JSFによるWebアプリケーション開発 第7回
オブジェクト指向言語論 第九回 知能情報学部 新田直也.
計算機プログラミングI 第10回 2002年12月19日(木) メソッドの再定義と動的結合 クイズ メソッドの再定義 (オーバーライド)
Presentation transcript:

Scala + Liftフレームワーク その2

Scalaの概要 JVM上で動作するオブジェクト指向+関数型言語 JVMのスケーラビリティを適用できる Javaとの相互利用が可能 traitを利用した多重継承(Mix-In)が可能

Liftの概要(復習) フルスタックのWebアプリケーションフレームワーク 簡潔な関数型Webフレームワーク Snippetアプローチ Viewを中心としたアーキテクチャ

Liftでのチャットアプリケーションに機能追加 メッセージを削除する機能を追加する LiftのJqJsCmdsを利用してメッセージの処理を行 う

追加する定義 sealed trait ChatCmd object ChatCmd { ① sealed trait ChatCmd object ChatCmd { implicit def strToMsg(msg: String): ChatCmd = new AddMessage(Helpers.nextFuncName, msg, new Date) } final case class AddMessage(guid: String, msg: String, date: Date) extends ChatCmd final case class RemoveMessage(guid: String) extends ChatCmd ② ③ ① seald を指定することで、同一ファイル内からしか継承できなくなる。プラス、分岐漏れをコ ンパイル時に検知できるようになる。 ② implicit とは、暗黙変換の定義。必要なときに、自動的に変換処理を行ってくれる ③ caseクラスとは、コンストラクタの引数を自動的にフィールド定義してくれる。また、マッチ ングに使用でき、比較メソッド等を持つ。

チャットサーバーオブジェクトの定義 object ChatServer extends LiftActor with ListenerManager { private var messages: List[ChatCmd] = List("ようこそチャットルームへ") def createUpdate = messages override def lowPriority = { case s: String => messages ::= s ; updateListeners() case d: RemoveMessage => messages ::= d ; updateListeners() } ④ ⑤ ④ メソッドの内容がcase文だけであれば、引数は省略し、その引数をマッチングにそのまま使用 できる。Scalaでは省略できるものは基本的に省略するスタイルが多い。 ⑤ ChatCmdのリストであるmessagesに、String型の s を追加しようとしている。普通であればコ ンパイルエラーとなるはずだが、②の暗黙変換が利用され、AddMessageに変換されて追加され る。

Chat コンポーネントの定義 1 Listの型をChatCmdに変更。 class Chat extends CometActor with CometListener { private var msgs: List[ChatCmd] = Nil private var bindLine: NodeSeq = Nil def registerWith = ChatServer override def lowPriority = { case m: List[ChatCmd] => { val delta = m diff msgs msgs = m updateDeltas(delta) } Listの型をChatCmdに変更。 LowPriorityの中では、ローカルのリストと新しいリストの差異をとり、ローカルのリストを更新 後にupdateDeltasに差異を渡している。updateDeltasは後述。

Chat コンポーネントの定義 2-1 updataDeltasの引数としてwhatを定義。whatのfoldRidghtを呼び出す。 def updateDeltas(what: List[ChatCmd]) { partialUpdate(what.foldRight(Noop) { case (m: AddMessage , x) => x & AppendHtml("ul_dude", doLine(m)) & Hide(m.guid) & FadeIn(m.guid, TimeSpan(0),TimeSpan(500)) case (RemoveMessage(guid), x) => x & FadeOut(guid,TimeSpan(0),TimeSpan(500)) & After(TimeSpan(500),Replace(guid, NodeSeq.Empty)) }) } updataDeltasの引数としてwhatを定義。whatのfoldRidghtを呼び出す。 foldRightとは、二項関数を使い、引数からはじまりリストの全ての要素を右から左に結合する。 foldRight [B](z : B)(f : (A, B) => B) : B particalUpdateは、引数としてJsCmdを受け取る。つまり、foldRightの二項関数下で、リスト内部 を一つのJsCmdオブジェクトに変換を行う。

Chat コンポーネントの定義 2-2 Noopはjqueryの何もしないという空の処理。 def updateDeltas(what: List[ChatCmd]) { partialUpdate(what.foldRight(Noop) { case (m: AddMessage , x) => x & AppendHtml("ul_dude", doLine(m)) & Hide(m.guid) & FadeIn(m.guid, TimeSpan(0),TimeSpan(500)) case (RemoveMessage(guid), x) => x & FadeOut(guid,TimeSpan(0),TimeSpan(500)) & After(TimeSpan(500),Replace(guid, NodeSeq.Empty)) }) } ⑥ Noopはjqueryの何もしないという空の処理。 二項関数は、現在のリスト要素と、今までの累積値の2つの引数を受け取る。 関数内で、追加と削除処理をcaseクラスによるマッチングで分岐させ、それぞれのJsCmdオブジェ クトを作成し、&メソッドにより結合していく。 ⑥ doLineは追加するHtmlを作成する処理。後述。

Chat コンポーネントの定義 3 private def doLine(m: AddMessage): NodeSeq = bind("chat", addId(bindLine, m.guid), "msg" -> m.msg, “btn” -> SHtml.ajaxButton(“削除", () => { ChatServer ! RemoveMessage(m.guid) Noop})) doLineは、メッセージを表示するためのhtmlタグを作成する。 この例では、メッセージごとにそれを削除するボタンを出力。 ajaxButtonのラベルに「削除」を指定し、ボタン押下時の処理として、削除メッセージをbangメソ ッドでChatServerに送信、最後にNoopを指定(こうしないとJsCmdのオブジェクトとならないた め)

Index.htmlの中身 <lift:surround with="default" at="content"> <lift:comet type="Chat"> <ul id="ul_dude"> <chat:line> <li><chat:msg/> <chat:btn/></li> </chat:line> </ul> <lift:form> <chat:input/> <input type="submit" value="chat"/> </lift:form> </lift:comet> </lift:surround>

総評 SnippetとJqJsCmds で、完全に隠蔽されたAjax とjqueryの処理実装が可能! 相変わらず、scala自体が難しいので、あんまり楽 になった気はしない 実コーディング量はかなり少なくなるため、玄人な ら開発効率向上するかも?