我有一个名为 product 的类,我的问题是我以各种方式处理产品,通过产品列表、产品本身以及将产品插入数据库。每个处理不同的属性。
例如,在页面上显示产品将由名称、描述、ID、价格、品牌名称、类别、图像组成,但产品列表仅显示名称、缩略图。每个都有自己的方法,例如,一个会获得前 5 个产品,但另一个只显示一种产品。
我的问题是如何为此创建类,我是为每个产品变体创建一个不同的类,还是创建一个包含每个方法和属性的类,因此将包含一个非常庞大的类。
从一个名为 Product 的抽象类开始。
在这个类中拥有所有产品的共同特征/属性/常用方法。
从这个抽象类派生新的产品类型。
使抽象类中的属性/方法虚拟化,因此派生产品类型可以根据产品类型表现出不同的行为。
看看您是否需要派生产品类型显式展示特定行为。在你的抽象类中声明抽象类方法。因此派生类负责实现该行为。
抽象类产品{
//成员字段 //方法
}
product1:product{
//product specific implementation
}
product2:product{
//product specific implementation
}
使用具有所有属性的单个 Product 类,并简单地显示在给定情况下所需的属性(数据库字段)。例如,您可以将产品创建为购物车项目:
public class ShoppingCartItem
{
private int productID;
private string productCategory;
private string subCategory;
private string productName;
private string productDescription;
private decimal productPrice;
private double productWeight;
private int units;
public int ProductID
{
get { return productID; }
}
public string ProductCategory
{
get { return productCategory; }
}
public string SubCategory
{
get { return subCategory; }
}
public string ProductName
{
get { return productName; }
}
public string ProductDescription
{
get { return productDescription; }
}
public decimal ProductPrice
{
get { return productPrice; }
}
public double ProductWeight
{
get { return productWeight; }
set { productWeight = value; }
}
public int Units
{
get { return units; }
set { units = value; }
}
public decimal Total
{
get { return Units * ProductPrice; }
}
public ShoppingCartItem(int productID, string farm, string productCategory,
string subCategory, string productName, string productDescription,
decimal productPrice, double productWeight, int units)
{
this.productID = productID;
this.productCategory = productCategory;
this.subCategory = productCategory;
this.productName = productName;
this.productDescription = productDescription;
this.productPrice = productPrice;
this.productWeight = productWeight;
this.units = units;
}
}
[Serializable()]
public class ShoppingCart : CollectionBase
{
public ShoppingCartItem this[int index]
{
get { return ((ShoppingCartItem)List[index]); }
set { List[index] = value; }
}
public int Add(ShoppingCartItem value)
{
return (List.Add(value));
}
public int IndexOf(ShoppingCartItem value)
{
return (List.IndexOf(value));
}
public void Insert(int index, ShoppingCartItem value)
{
List.Insert(index, value);
}
public void Remove(ShoppingCartItem value)
{
List.Remove(value);
}
public bool Contains(ShoppingCartItem value)
{
return (List.Contains(value));
}
}
每个场景都需要不同的模型。如果您要持久化一个产品,那么它将是 ProductDto 或 PersistableProduct。或者您可以使用诸如 Shopping.Dto.Product 之类的命名空间来限定它
如果您要查看产品,那么我会想到 ProductViewModel。如果您使用的是 ASP.NET MVC,则模型目录将包含一个名为 Product 的类,该类仅具有有限的页面显示属性。
Bob 大叔在他的博客中提倡 DTO 和 Business Objects 是不同的东西。
http://blog.cleancoder.com/uncle-bob/2019/06/16/ObjectsAndDataStructures.html
我们在选择类的时候还需要注意设计。
设计一个具有应用程序所需的所有属性/方法的类。