2017-05-21 3 views
1

私はアプリケーションドメイン(公立高校)をオブジェクトとしてモデリングすることで初めてOOPを練習しています。クラス間の関係を作成する方法については、外部依存関係。Rubyでオブジェクト関係を構築するときに依存関係を分離する

私は構築したい関係がたくさんあるので、一般的な原則を学ぶことを願って、私が持っている難しさを説明するためにここで2つのクラスとサンプルオブジェクトを挙げています。

私には2つのクラスGradeTranscriptがあります。 Transcriptの各インスタンスには、インスタンス変数@markがあります。これは現在ストリングです。私は、各クラスのすべてのインスタンスを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 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ソースファイルからすべてのオブジェクトをインスタンス化して、ハッシュにそれらを収集しています。

答えて

2

Transcript#gradeGradeインスタンスを返す必要があるように思えます。それでは、そのための方法を作ってみよう:

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を変更することができます:あなたはgradesハッシュ以前に作成したと仮定すると

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

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

    private 

    attr_reader :args 
end 
+0

あなたが言った '|| = '演算子は本当に便利だと思います、ありがとう!私はメソッドを定義する2番目のアプローチを間違いなく使用したいと思いますが、私が直面している課題は、グレードに関する属性が 'Grade'クラスのインスタンスに含まれていることです。私が 'args'をトランスクリプトに送るとき、グレードの値は文字列です。 私がする必要があるのは、すべてのインスタンスのグレードを持つグレードのハッシュで正しいインスタンスを検索するためにargsの文字列を使用するメソッドを記述する方法です。 – zqe

+0

基本的には私のプログラムには2つのソースファイルがあるので、すべての成績の意味に関する情報があり、もう1つは成績が – zqe

+0

に更新されています。 – Zubin

2

# read args from csv 
# id built from first, last, course, and grade 
transcripts[id] = Transcript. 
    new(args.merge('Mark' => grades[args['Mark']]) 

Hash#mergeを使用して、先に作成したGradeのインスタンスでargsを拡張します。

+0

あなたの説明から、これは基本的にidにマッチするレコードを検索し、 'mark'インスタンス変数の新しい値を設定することで既存のインスタンスを修正するのでしょうか? 'Transcript.new'呼び出しを見ると、新しいインスタンスを構築しているようですが、' transcripts'ハッシュにあるインスタンスを拡張していると言いますか? – zqe

+0

@zqeこのコードはあなたがすでにやっている '転写物'の建物を置き換えるでしょう。 –

+0

そうだよね。ありがとう! – zqe

関連する問題