プラグインベースのソフトウェアとは?開発とテストを容易にするデザインパターン #rubykaigi #rubykaigiA

Plugin-based software design with Ruby and RubyGems http://rubykaigi.org/2015/presentations/frsyuki @frsyuki
1
Kohei Sugi @koheiSG

rubyでDIの話でニヤニヤしてしまう #rubykaigiA

2015-12-13 15:05:37
アルフォートおじさん @joker1007

デフォルト引数でベースのクラスを差し込むのはよくやる。 #rubykaigiA

2015-12-13 15:05:49
黒曜@Leaner Technologies @kokuyouwind

JavaではDI手法が確立されているが、Rubyではいい方法を知らないので知ってたら教えてほしい。keyword argumentをいい感じにbindできるようにしたい。 #rubykaigi #rubykaigiA

2015-12-13 15:06:32
Blue Garnet @blue_garnet_

{:keyword => class} 名前付き引数使うんだぜ、ってことか #rubykaigi #rubykaigiA

2015-12-13 15:06:40
もひゃ @onjiro_mohyahya

プラグイン同士の依存関係が生じるときに困るのはバージョンによってプラグインのインターフェースが変わるときだよなぁ。 #rubykaigiA

2015-12-13 15:06:47
Blue Garnet @blue_garnet_

デザインパターン2 動的プラギンローダー プラグインはプラグインローダーを呼び出す、プラグインはエコシステムを作り出す #rubykaigi #rubykaigiA

2015-12-13 15:07:29
あおの @aono_ex_parrot

ダイナミックプラグインローダ カーネルとは別にプラグインローダを用意するパターン #rubykaigi #rubykaigiA

2015-12-13 15:07:35
izumin @izumin5210

例2: dynamic plugin loaderつかう plugin側からもloader呼べて,pluginがエコシステムつくりだす #rubykaigi #rubykaigiA

2015-12-13 15:07:35
黒曜@Leaner Technologies @kokuyouwind

別のデザインパターンとして、Dynamic Plugin Loaderがある。必要になったときにPluginLoaderに問い合わせてプラグインの実体を取得する。 #rubykaigi #rubykaigiA

2015-12-13 15:07:42
かるぱねるら @karupanerura

個人的には、加えて基本的なIntegration Testのテストケースをコアで提供するとより信頼性の高いプラグインであることを保証できて良いかなと思う。 #rubykaigi #rubykaigiA

2015-12-13 15:07:50
izumin @izumin5210

DIとPlugin Loaderを併用するパターン #rubykaigi #rubykaigiA

2015-12-13 15:08:08
Blue Garnet @blue_garnet_

プラギンローダープラグイン。 コアの内外にぶっささっており、コアの内外のプラグインとやりとりする #rubykaigi #rubykaigiA

2015-12-13 15:08:22
黒曜@Leaner Technologies @kokuyouwind

さらに3番目の方法として、DIとPlugin Loaderのコンビネーションが考えられる。コアアイディアはPlugin Loader自体をPluginにすること。 #rubykaigi #rubykaigiA

2015-12-13 15:08:25
あおの @aono_ex_parrot

DIとダイナミックプラグインローダの複合パターン #rubykaigi #rubykaigiA

2015-12-13 15:09:05
Blue Garnet @blue_garnet_

パターン3。DIとプラギンローダーの組み合わせ。 #rubykaigi #rubykaigiA

2015-12-13 15:09:07
Blue Garnet @blue_garnet_

従来の方式も、プラグインベースアーキテクチャもトレードオフだよね #rubykaigi #rubykaigiA

2015-12-13 15:09:12
Takuto Wada @t_wada

ソフトウエアの複雑性を上げずに拡張性を保つには core を小さく、機能の大部分を plugin で構成するような(microkernel のような)アーキテクチャがほしい。しかしそれは設計が難しく、最適化も難しい。 #rubykaigiA

2015-12-13 15:09:17
黒曜@Leaner Technologies @kokuyouwind

traditionalな方法とplugin-basedは一長一短あるから、ベストな方法はなくプロジェクトに合わせて選ぶべき、というここまでのまとめ。 #rubykaigi #rubykaigiA

2015-12-13 15:09:19
sue445 @sue445

fluentdのアーキテクチャの紹介 #RubyKaigi #RubyKaigiA

2015-12-13 15:09:19
Takuto Wada @t_wada

そのような Purely plugin based architecture を構築するにはいくつかの手段がある。ひとつは Dependency Injection(DI)。 DI コンテナを使用してインターフェイスを明示しつつ実装を疎結合化する。 #rubykaigiA

2015-12-13 15:09:27
Takuto Wada @t_wada

二つ目は dynamic loading of plugins. 一種の lookup だが、必要になったときに動的にローディング。三つ目は combination. Dependency Injection + Plugin Loader の組み合わせ。 #rubykaigiA

2015-12-13 15:10:27
黒曜@Leaner Technologies @kokuyouwind

で、Fluentdの話。ストリーミングデータはJSON、実装はC&RubyのLog Layer Data Collector。受信元と送信先が素直にやるとn*nなので、inとoutをpluginにしてfluentdで集約する。 #rubykaigi #rubykaigiA

2015-12-13 15:11:27
立花 @ke_tachibana

flexibilityだけじゃなくテストのしやすさとか単純にシンプルを保つためにもPlugin。そこまでベースを作りこむことは当面なさそうだけど、単純にコンポーネントの分離技術として聞く #rubykaigiA

2015-12-13 15:12:13
Blue Garnet @blue_garnet_

fluentdのアーキテクチャとかプラグインベースだよね パターン3。DIとプラギンローダーの組み合わせ。 従来の方式も、プラグインベースアーキテクチャもトレードオフだよね #rubykaigi #rubykaigiA

2015-12-13 15:12:15