C#でもGenericタイプが使えるようになりました。Javaよりやや遅れて。コレクションでは、わかりやすく、その恩恵にあやかることができます。
private List<M2DVertex> _lstVertex;
型パラメータとしてM2DVertexを指定しますので、このListはM2DVertex用のリストということになります。いちいちキャストしなくて済むのでとっても便利な機能。
ただ非ジェネリックなリストがArrayListで、ジェネリックなリストがListっていうのがしっくこない。
JavaではListはArrayListのインタフェースクラスなので。GenericArrayListというネーミングにすればよかったのでは?
パスファインダー、コース、論理的なモーターなどを設計します。
と最初はこうしましたが、
無意味に一般化してもしょうがないので、下のような現実案とすることにします。またSensorは分け合って独立事象にしました。
あとでC++用にさらにWrapperをかぶせる予定なので、あまりしつこい設計にしたくないというのが今回の現実案の理由です。
さらに、パスファインダーの動作を計算する運動学用(切り替え可能)のクラスを追加しました。切り替え可能ですが現状ではAggregateではなくNavigate扱いにしておきます。設計をややこしくしたくないので、物理計算を切り替えたいときはこのクラスのサブクラスをつくっていって、PathFinderからつかうときは、クラス名そのものを書き換えることにします。
ModelBaseのModelは物理モデルを意識しています。
delegateを使って。トリッキーな継承をやってみました。
従来のC++とかだと、オブジェクトを作ってから、メソッドの関数ポインタを取得してきて、それを使用側であてがって使ったりしたところが、delegateと親クラスをあらわすbaseの柔軟性により1つにまとめて書くことができました。なんとなく地雷を踏んでいるようで怪しげなコードかも。。
Motor.cs
using System; using System.Collections.Generic; using System.Text; namespace Misawat.Etrobo.Simulator { public class Motor { //SetMotorSpeedメソッドのデリゲート変数 SetMotorSpeed _func_SetMotorSpeed; //回転方向 1:正転 -1:逆転 int _direction = 1; //回転速度 int _speed = 0; public Motor(SetMotorSpeed func_SetMotorSpeed) { _func_SetMotorSpeed = func_SetMotorSpeed; } public void Foward(int speed) { _speed = speed; _direction = 1; _func_SetMotorSpeed((double)(_direction * _speed)); } public void Reverse(int speed) { _speed = speed; _direction = -1; _func_SetMotorSpeed((double)(_direction * _speed)); } public void Speed(int speed) { _speed = speed; _func_SetMotorSpeed((double)(_direction * _speed)); } public void Brake() { //TBD } public void Off() { //TBD } } }
SteeringMotor.cs
using System; using System.Collections.Generic; using System.Text; namespace Misawat.Etrobo.Simulator { public class SteeringMotor : Motor { public SteeringMotor(PathFinder pathFinder) : base(pathFinder.SetSteeringMotorSpeed) { } } }
昨日実装したところの修正をかけていて、クラス図の修正をしてみました。
グラフィックパーツはそれぞれ子要素をもっています。1つのモデルをくみ上げるときには複数のグラフィックパーツの親子関係を設定してツリーを作っていきます。
つまり、再帰的にツリーを構成していく部分(build())をcompositeパターンとして実現しているので、昨日のクラス図に少し補足をいれておきました。
赤い点が旋回中心、円が定常円旋回軌道です。
ステアリングの角度に対して定常円旋回計算式は正常に動作したようです。
最後はステアリングの限界舵角を超えているので、旋回円は無効です。
明日は、コースとのインタラクションをやります。おやすみなさい。