Witam
Zacząłem zabawę z MVP i mam pewną wątpliwość. Zrobiłem prosty program do obracania wektorów. Wygląd jest przedtawiony poniżej:
Model & Presenter:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace VectorRotation
{
public struct SPoint
{
public double X { get; set; }
public double Y { get; set; }
}
public interface IView
{
List<SPoint> InputVectorCoordinates {get;}
double Angle { get; }
List<SPoint> OutputVectorCoordinates { set; }
event EventHandler<EventArgs> CalculateTask;
}
#region Presenter
public class TPresenter
{
private readonly IView _view;
public TPresenter(IView view)
{
this._view = view;
this._view.CalculateTask += this.CalculateT;
}
private void CalculateT(object sender, EventArgs e)//button click event
{
this.TransformCoordinates();
}
private void TransformCoordinates()
{
List<SPoint> inputList = this._view.InputVectorCoordinates;
if (inputList.Count == 0)
return;
double angle = this._view.Angle;
if (angle == double.NaN)
return;
TCalculations calcs = new TCalculations();
List<SPoint> resultList = calcs.TransformVector(angle, inputList);
this._view.OutputVectorCoordinates = resultList;
}
}
#endregion
#region Model
public class TCalculations //model class
{
public List<SPoint> TransformVector(double pAngle, List<SPoint> pCoordinates)
{
double x, y;
double xp,yp;
SPoint point = new SPoint() ;
List<SPoint> TransformedCoord = new List<SPoint>();
for (int i = 0; i <= pCoordinates.Count - 1; i++)
{
x = pCoordinates[i].X;
y = pCoordinates[i].Y;
xp = x * Math.Cos(pAngle) - y * Math.Sin(pAngle);
yp = x * Math.Sin(pAngle) + y * Math.Cos(pAngle);
point.X = xp;
point.Y = yp;
TransformedCoord.Add(point);
}
return TransformedCoord;
}
}
#endregion
}
View:
namespace VectorRotation
{
public partial class Form1 : Form, IView
{
private TPresenter presenter;
#region Properties
public List<SPoint> InputVectorCoordinates
{
get
{
List<SPoint> tempList = new List<SPoint>();
SPoint point = new SPoint();
double x, y;
for (int i =0;i<=this.dgvInputData.Rows.Count-2;i++)
{
try
{
x = double.Parse(this.dgvInputData.Rows[i].Cells[0].Value.ToString());
y = double.Parse(this.dgvInputData.Rows[i].Cells[1].Value.ToString());
point.X = x;
point.Y = y;
tempList.Add(point);
}
catch
{
this.ThrowErrorMessage("Wprowadzaj wyłącznie liczby.");
}
}
return tempList;
}
}
public double Angle
{
get
{
double a = double.NaN;
try
{
a = double.Parse(this.txtRotationAngle.Text) * Math.PI / 180;//converted to radians
}
catch
{
this.ThrowErrorMessage("Wprowadzaj wyłącznie liczby");
}
return a;
}
}
public List<SPoint> OutputVectorCoordinates
{
set
{
List<SPoint> tempList = value;
this.dgvOutputData.Rows.Clear();
for (int i = 0; i <= tempList.Count - 1; i++)
{
this.dgvOutputData.Rows.Add();
this.dgvOutputData.Rows[i].Cells[0].Value = tempList[i].X;
this.dgvOutputData.Rows[i].Cells[1].Value = tempList[i].Y;
}
}
}
#endregion
#region Events
public event EventHandler<EventArgs> CalculateTask;
#endregion
private void ThrowErrorMessage(string pMsg)
{
MessageBox.Show(pMsg, "Błąd", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
public Form1()
{
InitializeComponent();
}
private void btnCalculations_Click(object sender, EventArgs e)
{
if (this.CalculateTask != null)
{
this.CalculateTask(this, EventArgs.Empty);
}
}
private void Form1_Load(object sender, EventArgs e)
{
this.presenter = new TPresenter(this);
}
}
}
Poprzez właściwość
List<double> InputVectorCoordinates {get;}
pobieram dane z DataGridView. Mam pewną wątpliwość.
- Czy transformacja danych z DataGridView do listy powinna odbywać się w View (tak jak zrobiłem) czy w Presenter?
- Czy sprawdzenie danych (czy są liczbami) powinno odbywać się w View czy w Presenter?
Dziękuje za sugestie
Pozdrawiam