私はSOLIDの原則を使用してより良いプログラミングの習慣を学ぼうとしています。ここでは、Shapesのサンプルアプリケーションを扱っています。私はちょうど知りたいです、私はどこでも原則を破っています。下はクラスとそのコードです。これは私のSOLID Principleを破っていますか?
1.基本クラス - ベースクラス形状を実現するなど長方形、三角形のような形状に対して
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クラスの形状を有します。
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. 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;
}
}
ここティルすべてが罰金だとよさそうだが、私はそれを実装したときに問題が発生します。私はここで少し混乱しています。
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();
}
}
質問
円は半径を有するように異なる形状が三角形ようにベースと高さを持っていると、異なる特性を持っているので、私は自分の特性を維持することを決定した:最初のフロントエンドのコードを見てみましょう子クラスで。私は基本クラスの仮想メンバーとしてそれを持つことができることを知っていました。だから上にコード化された以外の方法がありますか?
もし私がShapeオブジェクトをサークルオブジェクトに型キャストしているのであれば、抽象クラスの使用は何ですか? Circle c = new Circle()を簡単に使うことができます。私は(cが円であれば)望ましくない小切手を望んでいません。
どうすれば、円の円周率を得るための新しい方法を実装するように求められますか。新しいAbstractクラスを作成するか、Circleクラスに配置する必要がありますか?しかしサークルを入れれば、ソリッドの最初の原則、すなわちSRP を破ると思います。 私の抽象クラスは、不必要または繰り返しのプロパティを持つファットクラスではありません。事前に
おかげ
http://codereview.stackexchange.com/は、あなたの入力のための – Papa