Computer >> Máy Tính >  >> Lập trình >> Ruby

Dry-rb là gì?

Bạn đang tìm kiếm một số đá quý mới và thú vị để thử?

Sau đó, hãy xem dry-rb , một bộ đá quý mang lại giải pháp cho các vấn đề chung. Dry-rb bao gồm hơn 18 viên ngọc Ruby có thể kết hợp với nhau hoặc tự chúng.

Một số loại đá quý này bao gồm :

  • bộ khởi tạo khô
  • cấu trúc khô khan
  • xác thực khô
  • sự kiện khô khan
  • giao dịch khô khan

Trong bài đăng này, bạn sẽ tìm hiểu về 3 trong số những loại đá quý này để bạn có thể thưởng thức dry-rb phải cung cấp!

Cách tạo cấu trúc tốt hơn với cấu trúc khô

Ruby Struct là một loại đối tượng mà bạn có thể tạo từ lớp Struct, nhưng chúng có một số hạn chế.

Ví dụ :

Bạn có thể tạo một cấu trúc với một số đối số bị thiếu và không nhận được khiếu nại từ Ruby.

Với dry-struct bạn có thể tạo cấu trúc chặt chẽ hơn.

Đây là cách thực hiện :

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: [])

Bây giờ nếu bạn bỏ lỡ một trong các thuộc tính, bạn sẽ gặp lỗi sau:

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

Không phải là thông báo lỗi thân thiện với người dùng nhất, nhưng nó sẽ giải quyết được mọi việc.

Bạn có thể tạo các loại của riêng mình &thêm các ràng buộc cho chúng:

module Types
  include Dry::Types.module

  Age = Integer.constrained(gt: 0)
end

"Gt" này có nghĩa là "lớn hơn".

Vì vậy, Age phải là một số nguyên lớn hơn 0.

Bạn có thể có giá trị mặc định không?

Có, đây là cách thực hiện :

module Types
  include Dry::Types.module

  Name = String.default('')
end

Có một phiên bản ngắn hơn để tạo cấu trúc Dry, giống như cấu trúc Ruby thông thường.

Ví dụ :

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

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

Triển khai mô hình trình quan sát với các sự kiện khô

Mẫu thiết kế Người quan sát là khi một nguồn xuất bản bản cập nhật cho nhiều người nghe , đây có thể là cập nhật tin tức, cảnh báo về kho hàng, tin nhắn mới trong cuộc trò chuyện nhóm, v.v.

Đó là một mô hình chung.

Ruby bao gồm một mô-đun có thể quan sát được giúp bạn thực hiện điều này.

Nhưng dry-events là một tùy chọn khác.

Bạn có thể tạo một nhà xuất bản như thế này :

require 'dry/events/publisher'

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

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

Bây giờ :

Bất kỳ lớp nào cũng có thể tự đăng ký để nhận các sự kiện này khi chúng xảy ra.

Đây là cách thực hiện :

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)

Bạn có thể phát sự kiện với publish phương pháp:

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

Một điều tôi nhận thấy với viên ngọc này là nếu bạn đăng ký hoặc xuất bản một sự kiện không tồn tại thì sự kiện đó sẽ không tồn tại một cách âm thầm .

Tiêm phụ thuộc với dry-auto_inject

Phụ thuộc là gì?

Phụ thuộc là thứ mà một lớp cần để hoạt động, giống như các đối tượng và lớp khác.

Bạn có thể tạo các đối tượng này trực tiếp trong lớp của mình ...

Hoặc bạn có thể sử dụng tiêm phụ thuộc .

Việc tiêm phụ thuộc là khi các phụ thuộc được "tiêm" vào lớp. Nói cách khác, chúng được chuyển vào dưới dạng tham số.

Ví dụ :

require 'faraday'

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

Làm điều này cho phép bạn kiểm soát sự phụ thuộc và làm cho việc kiểm tra dễ dàng hơn.

Bây giờ :

dry-auto_inject tạo các đối tượng này cho bạn. Tất cả những gì bạn phải làm là khai báo những phụ thuộc nào cần thiết.

Trong ví dụ này Fruit phụ thuộc vào 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

Bạn phải cho biết đối tượng được tạo ra như thế nào:

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

Và cung cấp nó cho lớp học:

include Import['store']

Sau đó, bạn có thể tạo một Fruit với một Store khác như thế này:

Fruit.new(store: MyStore.new)

Bạn không cần đá quý để sử dụng tính năng tiêm phụ thuộc, nhưng thật thú vị khi xem một cách khác để thực hiện điều đó.

Tóm tắt

Bạn đã tìm hiểu về dry-rb, một tập hợp các viên ngọc Ruby thú vị mà bạn có thể sử dụng để giải quyết các vấn đề thiết kế cụ thể trong mã của mình.

Bây giờ đến lượt bạn thực hành và thử cái này!

Cảm ơn vì đã đọc.