2016-04-25 3 views
-3

練習問題は以下のとおりです。Ruby OOPの正しいコンセプトは?

#Create a Tree class with a rings attribute and getter method. 
#Trees create a ring for every winter that passes 
#It should have a bear_fruit? method which should return true if the 
#has fruit that year. the tree produces fruit when it has 
#more than 7 rings but less than 15, but false otherwise. 
#The class should also have an winter_season method that increases #rings attr by 1. 

誰でもこのコードを建設的に批判することはできますか?

class Tree 

    attr_accessor :winters, :rings, :bear_fruit? 

    def initialize(winters, rings) 
    @winters = winters 
    @rings = rings 
    end 

    def rings_created 
    @winters = 0 
    @rings = 0 
    while @winters == @rings do 
     @winters +=1 
     @rings +=1 
     break if @winters == 100 
    end 
    end 
    end 

    def bear_fruit 
    if @rings > 6 || < 16 
     @bear_fruit? = true 
    else 
     @bear_fruit? = false 
    end 
    end 

def winter_season 
    @winters = 0 
    @rings = 0 
    while @winters < @rings do 
    @winters +=1 
    @rings +=2 
    break if @winters == 100 
    end 
    end 
end 

end 
+2

'レール= Ruby' –

+0

タイプミス、それはあなたが@bear_fruit'のようなインスタンス変数を作ることができない私は午前2時.. – whatabout11

+0

あります '?。メソッド名のように '? 'を使うことはできません。ここにあなたの圧痕があります。何が起きているのかを明確に把握し、間違いを特定するには、組織的で整然としたコードを作成することが重要です。これらの問題を解決する最善の方法を覚えているのは、あなたのコードが何をすべきかを表現する単純な単体テストを開発し、元に戻ってコードを適切に動作させることです。これは[テスト駆動開発](https://en.wikipedia.org/wiki/Test-driven_development)またはTDDの原則です。 – tadman

答えて

2

運動によると、あなたは、単一の属性ringsと二つの方法、bear_fruit?winter_seasonでクラスTreeを作成することになっている:

  • ringsTreeクラスを作成します

    • 属性とゲッターメソッド
    • bear_fruit?メソッド の
        true
      • 戻りツリーは、7個の以上の環が、15の未満
      • 戻りfalseさもなければ
      • 増加1
    • rings
    によって winter_season方法を有する場合

それだけです。それは木が冬を追跡し、何のループも言及していないと言うわけではありません。

は、ここで私はそれを実装する方法をです:!

class Tree 
    attr_reader :rings 

    def initialize 
    @rings = 0 
    end 

    def bear_fruit? 
    @rings > 7 && @rings < 15 
    end 

    def winter_season 
    @rings += 1 
    end 
end 
+0

'(8..14).include?(@ rings)'は少しRubyと英語です。 –

+0

@KeithBennettあなたは '@ rings.between?(8、14)'と書くこともできますが、それはコードと仕様で異なる数字につながります。 '@rings> 7 && @rings <15'は*「もっと7以上15未満」*より密接に、IMOに似ています。 – Stefan

+0

あなたが言うことは本当ですが、より自然な表記法を使用するために文字通りの仕様から逸脱する価値があると私は主張します。 (そして数字が違うにもかかわらず条件は同じです)私は> && <用語で考えることは、C、C++、Javaのような比較的低レベルの言語でプログラミングしなければならない人工物であり、このスタイルは、わずかな認知コストにもかかわらず、短期間で価値があります。 –

1

まずは動作しますか?私は推測していない。それを実行し、エラーが何であるかを確認してください。

Rubyには、ruby docsでルックアップできるさまざまな方法が用意されています。 whileループを避けることができればそれを使用しない方が好きです。なぜなら、ブレークを使用して読みにくいコードにつながる可能性があるからです。 timesメソッドやその他の列挙型を参照してください。

関連する問題