Ruby
 Computer >> コンピューター >  >> プログラミング >> Ruby

Dry-rbとは何ですか?

試してみる新しい面白い宝石をお探しですか?

次に、 dry-rbをご覧ください。 、一般的な問題の解決策をもたらす宝石のセット。 Dry-rbは、一緒にまたは単独で動作できる18を超えるRubygemで構成されています。

これらの宝石には次のものが含まれます

  • ドライイニシャライザー
  • ドライ構造体
  • ドライ検証
  • ドライイベント
  • ドライトランザクション

この投稿では、これらの宝石のうち3つについて学び、 dry-rbを味わうことができます。 提供する必要があります!

dry-structを使用してより良い構造体を作成する方法

Ruby Structは、Structクラスから作成できるオブジェクトの一種ですが、いくつかの制限があります。

いくつかの引数が欠落している構造体を作成して、Rubyからの苦情を受け取らないようにすることができます。

dry-structを使用 より厳密な構造体を作成できるgem。

方法は次のとおりです

require 'dry-struct'

module Types
  include Dry::Types.module
end

class Video < Dry::Struct
  attribute :title, Types::String
  attribute :views, Types::Views
  attribute :comments, Types::Array
end

Video.new(title: "abc", views: 10, comments: [])

属性の1つを見逃すと、次のエラーが発生します:

[Video.new] :comments is missing in Hash input

最もユーザーフレンドリーなエラーメッセージではありませんが、それは物事を成し遂げます。

独自のタイプを作成できます &それらに制約を追加します:

module Types
  include Dry::Types.module

  Age = Integer.constrained(gt: 0)
end
が含まれます。

この「gt」は「より大きい」を意味します。

つまり、Age 0より大きい整数である必要があります。

デフォルト値を設定できますか?

はい、方法は次のとおりです

module Types
  include Dry::Types.module

  Name = String.default('')
end
が含まれます

通常のRuby構造体に似たDry構造体を作成するための短いバージョンがあります。

Book = Dry::Struct(title: Dry::Types["string"])

Book.new(title: "Computer Science 101")

ドライイベントを使用したオブザーバーパターンの実装

オブザーバーのデザインパターンは、1つのソースの場合です。 多くのリスナーにアップデートを公開します 、これはニュースの更新、株式アラート、グループチャットの新しいメッセージなどである可能性があります。

これは一般的なパターンです。

Rubyには監視可能なモジュールが含まれています これを実装するのに役立ちます。

しかし、dry-events 別のオプションです。

このようなパブリッシャーを作成できます

require 'dry/events/publisher'

class Blog
  include Dry::Events::Publisher[:blog]

  register_event('article.published')
  register_event('article.upated')
end

どのクラスも、イベントが発生したときにこれらのイベントを受信するために自分自身を登録できます。

方法は次のとおりです

class Reader
  def on_article_published(event)
    puts "New article published: #{event[:title]}"
  end

  def on_article_updated(event)
    puts "Article has been updated: #{event[:title]}"
  end
end

blog   = Blog.new
reader = Reader.new

blog.subscribe(reader)

publishを使用してイベントをブロードキャストできます 方法:

blog.publish('article.published', title: 'How to Use The dry-events Gem')

このgemで私が気づいたことの1つは、存在しないイベントをサブスクライブまたは公開すると、サイレントに失敗するということです。 。

dry-auto_injectによる依存性注入

依存関係とは何ですか?

依存関係は、他のオブジェクトやクラスと同様に、クラスが機能するために必要なものです。

これらのオブジェクトは、クラスで直接作成できます...

または、依存性注入を使用できます 。

依存性注入とは、依存性がクラスに「注入」されることです。つまり、パラメータとして渡されます。

require 'faraday'

class GitHubAPI
  def initialize(http_client = Faraday.new)
    @http_client = http_client
  end
end

これにより、依存関係を制御し、テストを容易にすることができます。

dry-auto_inject これらのオブジェクトを作成します。必要な依存関係を宣言するだけです。

この例では、Fruit Storeに依存します

require 'dry/auto_inject'

class Store
  def bananas
    puts 'Have some organic bananas!'
  end
end

Import = Dry::AutoInject({ 'store' => Store.new })

class Fruit
  include Import['store']

  def eat
    store.bananas
  end
end

fruit = Fruit.new
fruit.eat

オブジェクトがどのように作成されるかを言う必要があります:

Import = Dry::AutoInject({ 'store' => Store.new })

そしてそれをクラスで利用できるようにします:

include Import['store']

次に、Fruitを作成できます 別のStore このように:

Fruit.new(store: MyStore.new)

依存性注入を使用するためにgemは必要ありませんが、それを行う別の方法を見るのは興味深いことです。

概要

コード内の特定の設計上の問題を解決するために使用できる興味深いRubygemのセットであるdry-rbについて学習しました。

今度はあなたが練習してこれを試してみる番です!

読んでくれてありがとう。


  1. C ++の矢印演算子`->`とは何ですか?

    ドットと矢印の演算子はどちらもC++で使用され、クラスまたは構造体のメンバーにアクセスします。これらはさまざまなシナリオで使用されます。 C ++では、class、struct、またはunionとして宣言された型は、「クラス型」と見なされます。したがって、以下は3つすべてを指します。 a.bは、bがオブジェクトのメンバー(またはオブジェクトへの参照)である場合にのみ使用されます。したがって、a.bの場合、willは常にクラスの実際のオブジェクト(またはオブジェクトへの参照)になります。 bisはポイントするオブジェクトのプロパティbにアクセスします。 をオーバーロードするクラスの

  2. なぜクラスを作成するのですか?

    前回の記事に続いて、なぜnilを使用するのか、私たちが当たり前と思っている他のことについてこの質問をするのは良い考えだと思いました。 いいね… 醜いコードの巨大なブロブを1つだけ持つのではなく、なぜクラスを使用するのですか? 基本的なレベルでは、クラスを使用してコードとデータを論理ユニットに編成します。 しかし、それだけではありません。 クラスを使用すると、抽象化を作成できます 。 抽象化とは何ですか? 毎日、1分ごとに抽象化を使用します。 キーボード 私はこれを入力しています: ケーブル チェリーMXブラックスイッチ すべてをまとめるプラスチックケース 電気信号をコンピュータ