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について学習しました。
今度はあなたが練習してこれを試してみる番です!
読んでくれてありがとう。
-
C ++の矢印演算子`->`とは何ですか?
ドットと矢印の演算子はどちらもC++で使用され、クラスまたは構造体のメンバーにアクセスします。これらはさまざまなシナリオで使用されます。 C ++では、class、struct、またはunionとして宣言された型は、「クラス型」と見なされます。したがって、以下は3つすべてを指します。 a.bは、bがオブジェクトのメンバー(またはオブジェクトへの参照)である場合にのみ使用されます。したがって、a.bの場合、willは常にクラスの実際のオブジェクト(またはオブジェクトへの参照)になります。 bisはポイントするオブジェクトのプロパティbにアクセスします。 をオーバーロードするクラスの
-
なぜクラスを作成するのですか?
前回の記事に続いて、なぜnilを使用するのか、私たちが当たり前と思っている他のことについてこの質問をするのは良い考えだと思いました。 いいね… 醜いコードの巨大なブロブを1つだけ持つのではなく、なぜクラスを使用するのですか? 基本的なレベルでは、クラスを使用してコードとデータを論理ユニットに編成します。 しかし、それだけではありません。 クラスを使用すると、抽象化を作成できます 。 抽象化とは何ですか? 毎日、1分ごとに抽象化を使用します。 キーボード 私はこれを入力しています: ケーブル チェリーMXブラックスイッチ すべてをまとめるプラスチックケース 電気信号をコンピュータ