带有公共方法的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
,然后直接调用私有方法?