Sto cercando di apprendere le migliori pratiche di programmazione utilizzando i principi SOLID. Qui sto lavorando ad un'applicazione di esempio di Shapes. Voglio solo sapere, sto infrangendo il principio ovunque. In basso ci sono le classi e il suo codice.Questo rompe il mio principio SOLIDO?
1. Classe Base - Dai forma
public abstract class Shape
{
public abstract double Area();
public virtual double Volume()
{
throw new NotImplementedException("You cannot determine volume from here...Method not implemented.");
}
}
2. Classi di forme come rettangolo, triangolo ecc attuazione Forma classe di base.
public class Circle : Shape
{
public int Radius { get; set; }
public override double Area() { return 3.14 * Radius * Radius; }
}
public class Triangle : Shape
{
public int Height { get; set; }
public int Base { get; set; }
public override double Area()
{
return 0.5 * Base * Height;
}
}
public class Rectangle : Shape
{
public int Length { get; set; }
public int Breadth { get; set; }
public override double Area()
{
return Length * Breadth;
}
}
public class Square : Shape
{
public Square() { }
public int Side { get; set; }
public override double Area()
{
return Side * Side;
}
}
3. Una classe factory che restituisce Shape.
internal class ShapeFactory<K, T> where T : class, K, new()
{
static K k;
private ShapeFactory() { }
public static K Create()
{
k = new T();
return k;
}
}
Fino a qui tutto sembra bello e sembra buono, ma il problema si verifica quando ho implementato esso. Sono poco confuso qui. Vediamo il codice front-end prima:
internal class Program
{
private static void Main(string[] args)
{
try
{
var c = ShapeFactory<Shape, Circle>.Create();
// this part is not clear to me. See the questions below
if(c is Circle)
{
var circle = c as Circle;
circle.Radius = 5;
Console.WriteLine(string.Format("{0}", circle.Area()));
}
}
catch (Exception ex)
{
Console.WriteLine("Error: {0}", ex.Message);
}
Console.Read();
}
}
DOMANDE
Diverse forme ha proprietà diverse, come cerchio ha Radius, triangolo ha base e altezza e così via, così ho deciso di mantenere le mie proprietà in classe bambino. Lo sapevo, posso averlo come membro virtuale nella mia classe base. Quindi c'è un modo diverso dal codice sopra.
In caso contrario, qual è l'uso della classe astratta, se continuo a digitare il mio oggetto Forma in oggetto cerchio? Posso usare semplicemente Circle c = new Circle(). Non voglio controlli indesiderati come (se c è cerchio) e tutto.
Cosa succede se, mi viene chiesto di implementare un nuovo metodo per ottenere la circonferenza di un cerchio. Devo creare una nuova classe astratta o metterla in classe Circle. Ma se lo metto Circle, penso che romperà il primissimo principio di SOLID, ad esempio SRP . Si prega di notare, io non la mia classe astratta come una classe di grasso con proprietà inutili o ripetute.
Grazie in anticipo
http://codereview.stackexchange.com/ sarebbe più adatto per questa domanda – Papa