Your SlideShare is downloading. ×
僕の鮮やかなるScala導入失敗事例
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×

Saving this for later?

Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime - even offline.

Text the download link to your phone

Standard text messaging rates apply

僕の鮮やかなるScala導入失敗事例

175
views

Published on

SIROK技術勉強会 #2 「僕の鮮やかなScala導入失敗事例」で、発表した内容です。 …

SIROK技術勉強会 #2 「僕の鮮やかなScala導入失敗事例」で、発表した内容です。

僕のScalaの導入失敗事例を淡々と語ります。

Published in: Engineering

0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
175
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
0
Comments
0
Likes
0
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  • 1. 僕の鮮やかなるScala導入失敗事例 〜そして、解を求む〜
  • 2. @uchidas
  • 3. 関数型言語との出会い
  • 4. int factorial(int n) { int fact = 1; for (int i = n; i > 0; i--) { fact = fact * i; } return fact; }
  • 5. fun factorial 0 = 1 | factorial n = n * factorial (n - 1) ;
  • 6. - fun factorial 0 = 1 = | factorial n = n * factorial (n - 1); val factorial = fn : int -> int - factorial 6; val it = 720 : int
  • 7. factorial 6 => 6 * factorial 5 => 6 * (5 * factorial 4) => 6 * (5 * (4 * factorial 3)) => 6 * (5 * (4 * (3 * factorial 2))) => 6 * (5 * (4 * (3 * (2 * factorial 1)))) => 6 * (5 * (4 * (3 * (2 * (1 * factorial 0))))) => 6 * (5 * (4 * (3 * (2 * (1 * 1))))) 720
  • 8. Scalaとの出会い
  • 9. for Java
  • 10. Play Frameworkの テンプレートエンジン
  • 11. @(style: domain.Style = domain.Style.default)(screenContent: Html) <!doctype html> <html> <body class="@style.template.name"> @screenContent </body> </html>
  • 12. 転機
  • 13. 転機 • 1プロダクトの開発を任された • 期限は2週間 • もちろん技術的挑戦するよね
  • 14. Spring Scala
  • 15. 導入
  • 16. pomに設定を追加
  • 17. <repositories> <repository> <id>scala-tools.org</id> <name>Scala-Tools Maven2 Repository</name> <url>http://scala-tools.org/repo-releases</url> </repository> <repository> <id>repository.springsource.milestone</id> <name>SpringSource Milestone Repository</name> <url>http://repo.springsource.org/milestone</url> </repository> </repositories> <dependency> <groupId>org.scala-lang</groupId> <artifactId>scala-library</artifactId> <version>2.11.2</version> </dependency> <dependency> <groupId>org.springframework.scala</groupId> <artifactId>spring-scala</artifactId> <version>1.0.0.M2</version> </dependency>
  • 18. <plugin> <groupId>org.scala-tools</groupId> <artifactId>maven-scala-plugin</artifactId> <executions> <execution> <goals> <goal>compile</goal> <goal>testCompile</goal> </goals> </execution> </executions> <configuration> <sourceDir>src/main/java</sourceDir> <sourceDir>src/main/scala</sourceDir> </configuration> </plugin>
  • 19. これだけ
  • 20. もとの資産も生かせるし 楽勝
  • 21. Optionが神
  • 22. applicationService.findById(applicationId) match { case Some(application) => application case None => throw new BadRequestException() }
  • 23. Scalaに移行できるとこは全部し ちゃえ
  • 24. のはずが…
  • 25. 動かないAspectJ
  • 26. def findByApplicationId(@PathVariable applicationId:Int, model:Model, context:Context, request:ServletRequest):Application = { applicationService.findById(applicationId) match { case Some(application) => application case None => throw new BadRequestException() } }
  • 27. ControllerがScalaの場合、 @Aroundどう書くんですか?w
  • 28. Scalaのコードはコンパイルされる とJavaのクラスでこうなるはずだ から…
  • 29. あれ?
  • 30. なぜ、僕はJavaとScala両方考えて 実装しているんだ
  • 31. そして、別れ
  • 32. 別れの理由 • AspectJが動かない • なぜか、コンパイル後のJavaクラスの形を想像 している自分がいた
  • 33. 再会
  • 34. 導入
  • 35. $ activator new
  • 36. app → アプリケーションのソースコード └ assets → 別の言語へコンパイルされるアセットのソースファイル └ stylesheets → 通常は LESS CSS のソース └ javascripts → 通常は CoffeeScript のソース └ controllers → アプリケーションのコントローラ └ models → アプリケーションのビジネスロジック層 └ views → テンプレート build.sbt → アプリケーションビルドスクリプト conf → 設定ファイル └ application.conf → メイン設定ファイル └ routes → ルート定義 public → 公開アセット └ stylesheets → CSS ファイル └ javascripts → JavaScript ファイル └ images → 画像ファイル project → sbt 設定ファイル └ build.properties → sbt プロジェクトの基本ファイル └ plugins.sbt → Play 自身の定義を含む sbt プラグイン lib → 管理されないライブラリ依存性 logs → デフォルトのログ保存場所 └ application.log → デフォルトのログファイル target → Play により生成されたファイル test → 単体テストや機能テストのソースフォルダ
  • 37. レイヤーがMVCだけだとちょっと …
  • 38. ついでに、LESSをSassに CoffeeScriptをTypeScriptに
  • 39. app → アプリケーションのソースコード └ assets → 別の言語へコンパイルされるアセットのソースファイル └ stylesheets → Sass └ javascripts → TypeScript └ controllers → アプリケーションのコントローラ └ datasource → データソース(mysql, AWS…etc) └ service → アプリケーションのビジネスレイヤー └ repository → アプリケーションのデータアクセスレイヤー └ domain → ドメイン(DTO) └ views → テンプレート
  • 40. レイヤー増やしてみたものの依存 性が定義できていない
  • 41. Play frameworkにDIの概念を持ち 込もう!
  • 42. objectの排除
  • 43. objectとは? • Scalaには、classとobjectがある • classは、いわゆるクラス • シングルトンオブジェクト • 自動的にインスタンスが作成される • Javaでいう、staticなアクセスっぽい挙動ができ る
  • 44. Subcut
  • 45. 軽量の Scala で書かれた 依存性注入フレームワーク
  • 46. ControllerにService 依存性を持たせる
  • 47. class ApplicationController(implicit val bindingModule: BindingModule) extends Controller with Injectable { val applicationService:ApplicationService = inject[ApplicationService] }
  • 48. object ServiceModule extends NewBindingModule(module => { import module._ bind[ApplicationService] toModuleSingle { implicit module => new ApplicationService()(RepositoryModule) } })
  • 49. new ApplicationController()(ServiceModule)
  • 50. これだけ
  • 51. 今回こそ行けそう!
  • 52. そう思っていた時期が私にもあり ました。
  • 53. 同じレイヤーのクラスの依存性を 持つにはどうすればいいんだ?
  • 54. class ApplicationService(implicit val bindingModule: BindingModule) extends Injectable { val userService:UserService = inject[UserService] }
  • 55. object ServiceModule extends NewBindingModule(module => { import module._ bind[ApplicationService] toModuleSingle { implicit module => new ApplicationService()(ServiceModule) } bind[UserService] toModuleSingle { implicit module => new UserService()(ServiceModule) } })
  • 56. new ApplicationService()(ServiceModule)
  • 57. 荒ぶるコンパイラ
  • 58. そして、別れ
  • 59. 別れの理由 • 2週間楽勝で過ぎました • Serviceレイヤー内での相互依存ができなかった • アーキテクチャに固執してしまっている自分が いた
  • 60. 結論
  • 61. 結論 • 2週間という短い期間で突っ込むには地雷原だっ た • Scalaの理解が甘かった • Scala楽しい