带有公共方法的Ruby类

带有公共方法的Ruby类,ruby,class-design,Ruby,Class Design,我有一个带有公共方法的类,例如: class CsvParse def initialize(csv_file) @csv_file = csv_file end def parse ... end end csv_parse = CsvParse.new('csv_file.csv') csv_parse.parse 但课程的设计也可以是这样的: class CsvParse def initialize(csv_file) @csv_file

我有一个带有公共方法的类,例如:

class CsvParse
  def initialize(csv_file)
    @csv_file = csv_file
  end
  def parse
    ...
  end
end

csv_parse = CsvParse.new('csv_file.csv')
csv_parse.parse
但课程的设计也可以是这样的:

class CsvParse
  def initialize(csv_file)
    @csv_file = csv_file
    parse
  end

  private
  def parse
    ...
  end
end

csv_parse = CsvParse.new('csv_file.csv')

最佳实践是什么?

在这种特殊情况下,有一个helper方法公开,它将文件解析为它的csv表示形式(不管它是什么)

从语义上讲,最好的调用是:

csv_parse = CsvParser.parse 'csv_file.csv'
因此,我将声明构造函数私有,防止直接创建这些对象:

class CsvParser
  def initialize ...
  end
  private_class_method :new

  def self.parse *args
    CsvParser.send(:new, *args).send(:parse)
  end
private
  def parse ...
end 

通常情况下,您不应该在初始化时开始解析-根据单一责任原则,一个方法应该做一件事。

这取决于您的用例。为您的类编写一个测试-它通常会揭示您设计中的问题。(更好的是:写下)这一主张的众多反例中有一个是
Time.parse
@sawa,
Time.parse
不是一个初始值设定项,也不是一个实例方法-我是从
初始化
作为一个实例的角度讲的method@SpeedyWizard它返回一个时间实例。无论是从
.new
还是
#initialize
@sawa调用OP的
parse
都没有区别,是的,它有区别-我仍然在谈论直接初始化,而不是通过类方法。而
Time.parse
仍然遵循单一责任原则-它在解析某些数据后初始化一个新对象
initialize
通常不打算由用户直接/显式调用。它打算从
new
调用。所以这没什么区别。为什么要用
send
调用
#new
,然后直接调用私有方法?