Smart Init 使用教程
项目介绍
Smart Init 是一个用于简化 Ruby 初始化器样板代码的 gem。它提供了一种替代 Struct.new
的方法,不需要检查初始化器中提供的参数数量,并且不会实例化不必要的类实例。Smart Init 提供了一个统一的 API 约定,用于无状态的服务对象,这些对象在初始化时接受值,并通过一个公共类方法 call
实例化新对象并接受传递给初始化器的参数。
项目快速启动
安装
在你的 Gemfile 中添加以下内容:
gem 'smart_init'
然后运行:
bundle install
使用示例
通过扩展模块使用
require 'smart_init'
class ApiClient
extend SmartInit
initialize_with :network_provider, :api_token
end
client = ApiClient.new(network_provider: Faraday.new, api_token: 'secret_token')
# <ApiClient:0x007fa16684ec20 @network_provider=Faraday< >, @api_token="secret_token">
通过继承使用
class ApiClient < SmartInit::Base
initialize_with :network_provider, :api_token
end
client = ApiClient.new(network_provider: Faraday.new, api_token: 'secret_token')
# <ApiClient:0x007fa16684ec20 @network_provider=Faraday< >, @api_token="secret_token">
应用案例和最佳实践
应用案例
假设你有一个需要网络提供者和 API 令牌的服务对象:
class ApiService < SmartInit::Base
initialize_with :network_provider, :api_token
def call
# 使用 @network_provider 和 @api_token 进行操作
end
end
service = ApiService.new(network_provider: Faraday.new, api_token: 'secret_token')
result = service.call
最佳实践
- 参数验证:Smart Init 会自动检查所有必需的参数,并在缺少参数时抛出
ArgumentError
。 - 可调用对象:使用
is_callable
方法使对象可调用。
class Calculator < SmartInit::Base
initialize_with :data
is_callable
def call
# 计算逻辑
end
end
result = Calculator.call(data: data)
典型生态项目
Smart Init 可以与其他 Ruby 生态项目结合使用,例如:
- Faraday:用于 HTTP 请求的库。
- ActiveRecord:用于数据库操作的库。
结合这些库,可以构建更复杂的服务对象,例如:
class UserService < SmartInit::Base
initialize_with :user_repository
def call
# 使用 @user_repository 进行用户操作
end
end
service = UserService.new(user_repository: UserRepository.new)
service.call
通过这些示例,你可以看到 Smart Init 如何简化 Ruby 初始化器的样板代码,并提供一个统一的 API 约定,使服务对象的创建和使用更加简洁和一致。