Upgrade to Pro — share decks privately, control downloads, hide ads and more …

実際のところHanamiってどうなんですか?という話

Yuta Tokitake
December 11, 2019

 実際のところHanamiってどうなんですか?という話

LegalForce Ruby MeetUp #1 (https://legalforce.connpass.com/event/154895/) でのHanamiについての発表です。
LegalForceではHanamiフレームワークを用いてAPI開発を行っています。これまでHanamiでの開発を行ってきて溜まってきた知見や、取り組みについての話をしました。

Yuta Tokitake

December 11, 2019
Tweet

More Decks by Yuta Tokitake

Other Decks in Programming

Transcript

  1. 2019೥ 4݄ 5݄ ໿ 180ࣾ 6݄ 7݄ 8݄ 9݄ 10݄

    導⼊顧客数 100ࣾಥഁʂ
  2. 2019年のスポンサー 3⽉ ⾔語処理学会第25回年次⼤会 (NLP2019) Rails Developer Meet Up 2019 4⽉

    RubyKaigi 2019 8⽉ NLP若⼿の会 (YANS) 第14回シンポジウム 9⽉ WebDB Forum 2019 11⽉ RubyWorld Conference 2019 ICPC 2019 Asia Yokohama Regional
  3. 実際のところ Hanami Ruby on Rails 保守性 ◎ ◦ パフォーマンス ◎

    ◦ 開発速度 ◦ ◎ カスタマイズ性 ◎ △ キャッチアップ △ ◎
  4. View Action Interactor Result Interactor Interactor Input Flow of control

    Actions Interactors Entities R epositories View s rack sequel ER B
  5. Action class Web::Users::Create include Web::Action params do required(:name).filled(:str?, max_size?: 20)

    required(:gender).filled(:str?, included_in?: ["man", "woman", "other"]) required(:age).filled(:int?, gteq?: 0, lteq?: 100) end def call(params) result = UsersCreateInteractor.new.call(params) halt_by_error(result.errors) if result.failure? self.status = 201 self.body = UsersCreateResponse.create(result.output) end end
  6. Action class Web::Users::Create include Web::Action params do required(:name).filled(:str?, max_size?: 20)

    required(:gender).filled(:str?, included_in?: ["man", "woman", "other"]) required(:age).filled(:int?, gteq?: 0, lteq?: 100) end def call(params) result = UsersCreateInteractor.new.call(params) halt_by_error(result.errors) if result.failure? self.status = 201 self.body = UsersCreateResponse.create(result.output) end end パラメータバリデーション ← Interactor呼び出し ← エラーハンドリング ← レスポンス作成
  7. OpenAPI • スキーマにバリデーションが付けられる name: type: string maxLength: 20 gender: type:

    string enum: ["man", "woman", "other"] age: type: number minimum: 0 maximum: 100
  8. OpenAPI name: type: string maxLength: 20 gender: type: string enum:

    ["man", "woman", "other"] age: type: number minimum: 0 maximum: 100 required(:name) .filled(:str?, max_size?: 20) required(:gender) .filled(:str?, included_in?: ["man", "woman", "other"]) required(:age) .filled(:int?, gteq?: 0, lteq?: 100) Hanami
  9. Hanamiでよくあるコード user_repo = UserRepository.new book_repo = BookRepository.new payment_repo = PaymentRepository.new

    interactor = HogeInteractor.new( user_repo, book_repo, payment_repo ) interactor.call(params)
  10. DIコンテナ導⼊後 class HogeInteractor include Hanami::Interactor extend DIContainer include modules( :user_repository,

    :book_repository, :payment_repository ) def call(params); end end HogeInteractor.new.call(params)
  11. Repository ActiveRecord (Rails) users = User.where(age: 20).order(created_at: :desc) Hanami users

    = UserRepository.new.where(age: 20).order { created_at.desc } ほぼ⼀緒では…?
  12. Repository ActiveRecord (Rails) users = User.where(age: 20).order(created_at: :desc) Hanami users

    = UserRepository.new.where(age: 20).order { created_at.desc } ⾮推奨