새롭고 흥미로운 보석을 찾고 계십니까?
그런 다음 dry-rb를 살펴보세요. , 일반적인 문제에 대한 솔루션을 제공하는 보석 세트. Dry-rb는 함께 또는 단독으로 작동할 수 있는 18개 이상의 Ruby 보석으로 구성됩니다.
이러한 보석 중 일부는 다음과 같습니다. :
- 드라이 이니셜라이저
- 건조 구조
- 건조 검증
- 드라이 이벤트
- 드라이 트랜잭션
이 게시물에서는 이 보석 중 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: [])
이제 속성 중 하나를 놓치면 다음 오류가 발생합니다.
[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")
드라이 이벤트로 관찰자 패턴 구현
관찰자 디자인 패턴은 하나의 소스일 때 많은 청취자에게 업데이트를 게시합니다. , 뉴스 업데이트, 주식 알림, 그룹 채팅의 새 메시지 등이 될 수 있습니다.
일반적인 패턴입니다.
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')
이 보석에서 내가 발견한 한 가지는 존재하지 않는 이벤트를 구독하거나 게시하면 자동으로 실패한다는 것입니다. .
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이 필요하지는 않지만, 다른 방법을 사용하는 것이 흥미롭습니다.
요약
코드의 특정 디자인 문제를 해결하는 데 사용할 수 있는 흥미로운 Ruby 보석 세트인 dry-rb에 대해 배웠습니다.
이제 여러분이 연습하고 시도해 볼 차례입니다!
읽어주셔서 감사합니다.