gpt4 book ai didi

ruby - 在 ruby​​ 中构建对象关系时隔离依赖关系

转载 作者:太空宇宙 更新时间:2023-11-03 17:44:16 25 4
gpt4 key购买 nike

我第一次通过将我的应用程序域(公立高中)建模为对象来练习 OOP,并且我一直在研究如何在不引入大量外部依赖项的情况下创建类之间的关系。

我有很多我想要构建的关系,所以为了学习一般原则,我在这里给出了两个类和示例对象来说明我遇到的困难。

我有两个类(class) GradeTranscriptTranscript 的每个实例都有一个实例变量 @mark,它现在是一个字符串。我收集了每个类(class)的所有实例,一个 grades 散列和一个 transcripts 散列。

问题:如何修改这些类,使 @mark 引用相应的 Grade 实例?

(或者,这完全是错误的方法吗?)

Grade 有一个实例,表示学生可以收到的每个可能的最终成绩

class Grade
attr_accessor :mark, :alpha_equivalent, :numeric_range_low, :numeric_range_high, :numeric_qquivalent, :pass_fail_equivalent, :description

def initialize(args)
@mark = args["Mark"]
@alpha_equivalent = args["AlphaEquivalent"]
@numeric_range_low = args["NumericRangeLow"]
@numeric_range_high = args["NumericRangeHigh"]
@numeric_equivalent = args["NumericEquivalent"]
@pass_fail_equivalent = args["PassFailEquivalent"]
@description = args["Description"]
end
end

成绩哈希中的示例对象:

grades["100"] =>
#<Grade:0x007f9fcb077d68
@alpha_equivalent="100",
@description="100 out of 100",
@mark="100",
@numeric_equivalent="100",
@numeric_range_high="100",
@numeric_range_low="100",
@pass_fail_equivalent="P">

Transcript 包含学生在他们学习的所有类(class)中获得的每个最终成绩的实例

class Transcript
attr_accessor :student_id, :last_name, :first_name, :grade, :official_class, :school, :year, :term, :course, :course_title, :mark, :pass_fail, :credits

def initialize(args)
@student_id = args["StudentID"]
@last_name = args["LastName"]
@first_name = args["FirstName"]
@grade = args["Grade"]
@official_class = args["OffClass"]
@school = args["school"]
@year = args["Year"]
@term = args["Term"]
@course = args["Course"]
@course_title = args["Course Title"]
@mark = args["Mark"]
@credits = args["Credits"]
@grade_entry_cohort = args["GEC"]
end
end

来自成绩单哈希的示例对象:

transcripts["foobar-COURSE1-100"] =>
#<Transcript:0x007f9fce8786b8
@course="COURSE1",
@course_title="Example Course",
@credits="5",
@first_name="FOO",
@grade="100",
@grade_entry_cohort="V",
@last_name="BAR",
@mark="100",
@official_class="000",
@school="1",
@student_id="0123",
@term="1",
@year="2000">

我正在实例化 CSV 源文件中的所有对象,然后将它们收集到哈希中,因为我希望能够直接对它们进行寻址。

最佳答案

听起来您需要让 Transcript#grade 返回一个 Grade 实例。因此,让我们为此制定一个方法:

class Grade
def self.all
@all ||= {}
end

def self.find(mark)
all[mark]
end
end

现在,需要填充 Grade.all。这可以通过您的 CSV 实现:

grade_args = %w[alpha_equivalent description mark numeric_equivalent numeric_range_high numeric_range_low pass_fail_equivalent]
CSV.parse { |row| Grade.all.merge(csv['mark'] => Grade.new(row.slice(*grade_args)}

现在,我们可以像这样修改Transcript:

class Transcript
def initialize(args)
@args = args
end

def grade
@grade ||= Grade.find(args['mark'])
end

private

attr_reader :args
end

关于ruby - 在 ruby​​ 中构建对象关系时隔离依赖关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44099449/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com