robot-cleaner学習ruby

4048 ワード

ruby learn
ruby learn
Table of Contents
  • 1. 反復1
  • 2. 反復2
  • 最近、rubyを勉強したいと思っています.私にとって、勉強の最善の方法は実践にすぎません.そこで以前コンテストに参加していたテーマをめくってみると、当時はc++で実現していたのですが、今回はルビーで実現して、言語の天上と地下の違いを体験してみるつもりです
    1反復1
    このテーマは掃除ロボットを実現し、移動ステアリング、反復特性を制御することができ、最初の反復の需要は左折右折機能を提供し、東南北西のステアリングに限られ、デフォルトは北方向、座標(0,0)である.ステアリング時に座標は変化しません.何度もプログラマーとして、ルビーの文法を見たことがあるので、上手になりました.robotオブジェクトは必ずありますが、前にやった経験に基づいて、positionオブジェクトも位置を比較するために使用しなければなりません.前から思っていたのにすごいというbddでテストケースをやっていて、もう一度Rspecを試してみたら、諦めていました.正直にXUnit方式を使いましょう、自分はやはりこのような用例をよく知っていますが、ルビー新兵としては、やはり歩く道がたくさんあるので、あまり大きくはできません.
    def test_turn_left
      assert((Robot.new.onCmd($turnLeft) == Position.new(Point.new(0,0),$west)))
    end
    
    def test_turn_right
      assert((Robot.new.onCmd($turnRight) == Position.new(Point.new(0,0),$east)))
    end

    ここではテストが簡単であることを考慮して、故犯がrobotをoncmdの後で直接positionと比較したことを知っていて、仕事の中でやはりこのような曖昧さを避けなければならない.最初の需要はよくできていて、前にc++で一度実現したことがあるので、直接commondモードになりました.
    class Robot
      def initialize()
        @position = Position.new(0,0, $north)
      end
    
      def onCmd(cmd)
        @position = cmd.call(@position)
        return @position; 
      end
    end

    方向と動作はいずれも単例として設計され,この需要については単純な列挙として定義され,すなわち列挙の数値を加減することに転向する.コードは非常に簡単で説明しない.
    2反復2
    反復2の必要性はrobotの移動をサポートすることであり、もちろん方向に基づいて行わなければならない.例えば、現在北に向かっている場合、前と後ろに移動するのはy軸で加減される.需要は難しくないように見えますが、これは確かに設計が凝っているところで、どのように移動と方向をうまく結びつけるかをよく考えなければなりません.当時、c++でこのニーズをやっていたとき、いろいろな方法を試してみましたが、実はすぐに良い方法が現実的ではなく、私たちの限界プログラミングの理念にも合っていません.私たちはまず、動作可能なコードを迅速に駆動し、使用例を通過し、再構築しなければなりません.先着例
    def test_move_forward
      assert((Robot.new.onCmd($forward) == Position.new(Point.new(0,1),$north)))
    end
    
    def test_move_backward
      assert((Robot.new.onCmd($backward) == Position.new(Point.new(0,-1),$north)))
    end

    例の再設計から,ここでpointという概念は抽出され,Positionはdirectとpointの2つの概念からなり,値オブジェクトとして設計されることが分かる.Directのpointへの影響はx,y軸への作用オフセット量として設計されている
    class Point
      attr_reader:x
      attr_reader:y
      def initialize(x, y)
        @x = x;
        @y = y;
      end
    
      def ==(rhs)
        return @x == rhs.x && @y == rhs.y;
      end
    end
    
    class Direct
      attr_reader:index
      def initialize(index,  x, y)
        @index = index
        @x_offset = x
        @y_offset = y
      end
    
      def forward(point)
        return Point.new(point.x + @x_offset, point.y + @y_offset)
      end
    
      def backward(point)
        return Point.new(point.x - @x_offset, point.y - @y_offset)
      end
    
    end

    ポイントはもちろん、初期化、読み取り可能、等しい判断インタフェースを提供します.Directは、スケールの独自の方位インデックスを提供し、移動可能な操作後に新しいpointを形成するように設計されています.このように設計された4つの方向は、以下のような表に設計されています.
    $north = Direct.new(0,0,1);
    $east = Direct.new(1,1,0);
    $south = Direct.new(2,0,-1);
    $west = Direct.new(3,-1,0);
    $directs = [
      $north, $east, $south, $west
    ]

    この表に基づいて需要1のステアリングインタフェースを再設計し,需要2の移動インタフェースを実現する
    $turnLeft = lambda{|pos| return Position.new(pos.point, $directs[(pos.direct.index + 3) %4]);}
    
    $turnRight =lambda{|pos| return Position.new(pos.point, $directs[(pos.direct.index + 1) %4])}
    
    $forward = lambda{|pos|   return  Position.new(pos.direct.forward(pos.point),pos.direct)
    }
    
    $backward = lambda{|pos| return Position.new(pos.direct.backward(pos.point),pos.direct)}

    本来は関数オブジェクトとして設計されていたが,rubyを用いる以上,関数式プログラミングの影もいくつか試み,lambdaが立ち上がり,もちろんc++11にも導入された.各動作の結果は新しいpositionオブジェクトに戻り,これも当時のc++実装時とは大きく異なる.ほとんどのc、c++から歩いてきた兄弟たちに比べて、このような時、私たちは必ずポインタやアプリケーションの方法で伝達して、コピーのオーバーヘッドを減らすことを考えています.このような思考は私たちが設計の上で行き詰まりに陥って、耻ずかしいと言って、今度rubyで実現する时、まだどのように引用を伝えますかを探しています.の人ruby動的言語にはgcがあるので、これを全然考えません.これにより,かえって設計が簡略化されることが分かった.動作の実装を設計するとき、新しいPositionは動作を実行するたびに新しいPositionを生成し、これは1つの動作が元のpositionを修正するよりも意味理解に合致する.pointの移動は必ず方向に基づいており、転向時のpointは変わらず、移動時の方向が変わらないという概念はlambdaで一目瞭然であり、現在位置が直面している方向に基づいて移動後の新しい11.の座標を得ることは、より合理的である.Directは4種類しかなく、4つの単例に設計されています.今日はまず最初の2つの反復の内容をやり終えて、後で勉強を続けます.まとめてみると、rubyの学習面ではlambda、block、proc、関数オブジェクトなどの違いを認識し、何度もミスを犯してデバッグした後も、ついに技術@と$の違いで、クラスオブジェクトの制度属性の生命を学んだ.デザインに対する考え方もc++の影から飛び出し始めた.
    Author: zhangchao
    Created:2015-05-29五22:43
    Emacs 24.4.1 (Org mode 8.2.10)
    Validate