命名不同的文件.处理器?IO?流?处理器?控制器?

  • 本文关键字:处理器 IO 控制器 文件 ruby
  • 更新时间 :
  • 英文 :


我在命名我写的一些文件时遇到了一些问题。我真的不知道流,I/O,处理程序,处理器(这是一个真正的概念吗?(和控制器之间的区别。这些是我的文件在 Ruby 中的样子:

从耙子文件开始:

desc "Calculate chocolate totals from a CSV of orders"
task :redeem_orders, [:orders_csv_path, :redemptions_csv_path] do |t, args|
args.with_defaults(:orders_csv_path => "./public/input/orders.csv", :redemptions_csv_path => "./public/output/redemptions.csv")
DataController.transfer(
input_path: args[:orders_csv_path],
output_path: args[:redemptions_csv_path],
formatter: ChocolateTotalsFormatter,
converter: ChocolateTotalsConverter
)
end

然后是控制器(在我看来,它使用从rakefile获得的数据在不同的类之间进行委派(:

class DataController
def self.transfer(input_path:, output_path:, formatter:, converter:)
data_processor = DataProcessor.new(
input_path: input_path,
output_path: output_path,
formatter: formatter
)
export_data = converter.convert(data_processor.import)
data_processor.export(export_data)
end
end

处理器(根据传递到此文件的各种文件执行导入和导出(:

class DataProcessor
attr_reader :input_path,
:output_path,
:formatter,
:input_file_processor,
:output_file_processor
def initialize(input_path:, output_path:, formatter:)
@input_path = input_path
@output_path = output_path
@formatter = formatter
@input_file_processor = FileProcessorFactory.create(File.extname(input_path))
@output_file_processor = FileProcessorFactory.create(File.extname(output_path))
end
def import
formatter.format_input(input_file_processor.read(input_path: input_path))
end
def export(export_data)
output_file_processor.write(
output_path: output_path,
data: formatter.format_output(export_data)
)
end
end

控制器中引用的converter如下所示(它将传入的数据转换为不同的格式...我对这个命名更有信心(:

class ChocolateTotalsConverter
def self.convert(data)
data.map do |row|
ChocolateTotalsCalculator.new(row).calculate
end
end
end

上面代码片段中的FileProcessorFactory创建了一个像这样的文件,它实际上执行了对 CSV 的读取和写入:

需要"csv">

class CSVProcessor
include FileTypeProcessor
def self.read(input_path:, with_headers: true, return_headers: false)
CSV.read(input_path, headers: with_headers, return_headers: return_headers, converters: :numeric)
end
def self.write(output_path:, data:, write_headers: false)
CSV.open(output_path, "w", write_headers: write_headers) do |csv|
data.each do |row|
csv << row
end
end
end
end

我在命名时遇到问题。看起来我命名正确吗?应该命名什么,例如DataIOvsDataProcessor?名为DataStream的文件应该做什么?那converter的东西呢?

Ruby 不是一个名词王国。一些程序员听到"一切都是对象",并认为"我正在处理数据,因此我需要DataProcessor对象!但在 Ruby 中,"每件东西都是一个对象"。在你的例子中只有一件新奇的"东西":巧克力订单(也可能是兑换(。所以你只需要一个自定义类:ChocolateOrder。我们已经有对象的其他"事物":CSV表示CSV文件,Array(或SetHash(可以表示巧克力订单的集合。

将CSV行处理为订单,将订单转换为可行的数据,并将这些数据汇总为结果不是"事情"。他们是行动!在 Ruby 中,操作是方法、块、进程、lambda 或顶级函数*。在您的情况下,我看到了一种像ChocolateOrder#payment这样的方法,用于获取要加起来的价格,然后可能是用于其余处理的一些块。

在伪代码中,我想象这样的东西:

# input
orders = CSV.foreach(input_file).map do |row|
# get important stuff out of the row
Order.new(x, y, z)
end
# processing
redemptions = orders.map { |order| order.get_redemption }
# output
CSV.open(output_file, "wb") do |csv|
redemptions.each do |redemption|
# convert redemption to an array of strings
csv << redemption_ary
end
end

如果您的行非常简单,我什至会考虑在 CSV 上设置headers:true,以便它返回Hash并保留订单。

* 进程、lambda 和顶级函数也是对象。但这是无关紧要的。

这似乎是一种相当"java"的思维方式 - 在Ruby中,我还没有看到经常使用这样的模式。CSVProcessor 和 ChocolateTotalsConverter 只有类方法,如果它们是 DataProcessor 的实例方法,则可能更习惯。我会从那里开始,看看你对此有何感受。

最新更新