با اجازه دوست عزیزم مهندس فتح الهی
من به نظرم Helpers رو اگه به شکل زیر Re factor کنیم بهتر باشه :)
اول یه کلاس تعریف میکنیم و اطلاعات لازم برای ترسیم پیش نمایش رو تو اون کلاس میزاریم
public class ShapeSpecification
{
public PointF StartPoint{get;set;}
public PointF EndPoint{get;set;}
public Color ForeColor{get;set;}
public byte Thickness{get;set;}
public bool IsFill{get;set;}
public Brush BackgroundBrush{get;set;}
}
یه کلاس دیگه هم نقاط ابتدا و انتها و طول و عرض رو تو خودش داره
public class StartPoints
{
public float XPoint { get; set; }
public float YPoint { get; set; }
public float Width { get; set; }
public float Height { get; set; }
}
حالا یه اینترفیس تعریف میکنیم که فقط یه متد داره به نام Draw
public interface IPeiview
{
void Draw(ShapeSpecification shapeScepification);
}
حالا میرسیم به کلاس Helpers اصلیمون که میتونه هم استاتیک باشه و هم معمولی به دو شکل زیر
public class Helpers
{
private readonly IPeiview peiview;
public Helpers(IPeiview peiview)
{
this.peiview = peiview;
}
public void Draw(ShapeSpecification shapeSpecification)
{
peiview.Draw(shapeSpecification);
}
}
public static class Helpers
{
public static void Draw(ShapeSpecification shapeSpecification, IPeiview peiview)
{
peiview.Draw(shapeSpecification);
}
}
که فقط یه متد ساده Draw داره و اونم تابع Draw اینترفیسی که بش دادیم رو صدا میزینه
یه کلاس دیگه هم تعریف میکنیم که مسئولیتش تشخیص بومهای چهارگانه است برای شروع نقطهی ترسیم
public static class AreaParser
{
public static StartPoints Parse(PointF startPoint, PointF endPoint)
{
var startPoints = new StartPoints();
startPoints.Width = Math.Abs(endPoint.X - startPoint.X);
startPoints.Height = Math.Abs(endPoint.Y - startPoint.Y);
if (startPoint.X <= endPoint.X && startPoint.Y <= endPoint.Y)
{
startPoints.XPoint = startPoint.X;
startPoints.YPoint = startPoint.Y;
}
else if (startPoint.X >= endPoint.X && startPoint.Y >= endPoint.Y)
{
startPoints.XPoint = endPoint.X;
startPoints.YPoint = endPoint.Y;
}
else if (startPoint.X >= endPoint.X && startPoint.Y <= endPoint.Y)
{
startPoints.XPoint = endPoint.X;
startPoints.YPoint = startPoint.Y;
}
else if (startPoint.X <= endPoint.X && startPoint.Y >= endPoint.Y)
{
startPoints.XPoint = startPoint.X;
startPoints.YPoint = endPoint.Y;
}
return startPoints;
}
}
نکته: این کلاس رو اگه با Func ایجاد کنیم خیلی بهتر و تمیزتر وقشنکتر هم میشد که من میگزرم فعلا ازش
حالا ما هر شکل جدید که اضافه کنیم به پروژه Paint خودمون و قصد پیش نمایش اونو داشته باشیم فقط کافیه یه کلاس برا پیش نمایشش ایجاد کنیم که کلاس Ipreview رو Implement کنه و متد Draw مخصوص به خودش را داشته باشه و از شر Swithهای طولانی خلاص میشیم مثلا من برای دایره اینکارو کردم
public class CirclePreview:IPeiview
{
private readonly Graphics graphics;
public CirclePreview(Graphics graphics)
{
this.graphics = graphics;
}
public void Draw(ShapeSpecification shapeScepification)
{
var startPoints = AreaParser.Parse(shapeScepification.StartPoint, shapeScepification.EndPoint);
float raduis = Math.Max(startPoints.Width, startPoints.Height);
if (shapeScepification.IsFill)
this.graphics.FillEllipse(shapeScepification.BackgroundBrush, startPoints.XPoint, startPoints.YPoint, raduis, raduis);
else
this.graphics.DrawEllipse(new Pen(shapeScepification.ForeColor, shapeScepification.Thickness), startPoints.XPoint, startPoints.YPoint, raduis, raduis);
}
}