MST
星途 面试题库

面试题:Ruby流畅接口在复杂业务场景的应用

假设你正在开发一个电商系统,其中涉及商品管理模块。要求使用Ruby的流畅接口设计模式来实现一个商品查询功能,能够支持按商品类别、价格范围、库存状态等多个条件进行链式查询,并最终返回符合条件的商品列表。请详细说明设计思路并给出核心代码实现。
42.2万 热度难度
编程语言Ruby

知识考点

AI 面试

面试题答案

一键面试

设计思路

  1. 定义商品类:首先定义一个 Product 类来表示商品,包含商品的各种属性,如类别、价格、库存状态等。
  2. 定义查询构建器类:创建一个 ProductQueryBuilder 类,这个类将使用流畅接口模式。它内部维护一个符合条件的商品列表以及查询条件。通过方法链来设置不同的查询条件,最后通过一个方法返回符合条件的商品列表。
  3. 链式调用方法:在 ProductQueryBuilder 类中定义方法来设置按商品类别、价格范围、库存状态等查询条件,每个方法返回 self 以支持链式调用。

核心代码实现

class Product
  attr_accessor :category, :price, :stock_status

  def initialize(category, price, stock_status)
    @category = category
    @price = price
    @stock_status = stock_status
  end
end

class ProductQueryBuilder
  def initialize(products)
    @products = products
    @filtered_products = @products.dup
  end

  def by_category(category)
    @filtered_products.select! { |product| product.category == category }
    self
  end

  def by_price_range(min, max)
    @filtered_products.select! { |product| product.price >= min && product.price <= max }
    self
  end

  def by_stock_status(status)
    @filtered_products.select! { |product| product.stock_status == status }
    self
  end

  def build
    @filtered_products
  end
end

# 示例使用
products = [
  Product.new('electronics', 100, 'in_stock'),
  Product.new('clothing', 50, 'out_of_stock'),
  Product.new('electronics', 150, 'in_stock')
]

result = ProductQueryBuilder.new(products)
         .by_category('electronics')
         .by_price_range(100, 150)
         .by_stock_status('in_stock')
         .build

result.each do |product|
  puts "Category: #{product.category}, Price: #{product.price}, Stock Status: #{product.stock_status}"
end