在面试时我被问及我得到的反馈是我缺乏OOD技能。所以我想知道我的建议设计有什么问题。
问题陈述: 设计一个系统,帮助计算购物车中物品的总成本。 您将获得购物车折扣中的商品列表,如下例所示。该清单将包含项目或折扣,顺序很重要:
示例购物车 $ 10预订xyz,所有商品均可享受10%折扣,固定价格为20美元,下一件商品可享20%折扣,100美元衬衫,第5件类型书可享15美元折扣。
折扣类型: 所有商品均可享九折优惠 下一个项目20%的折扣 在类型书的第5项上减$ 15 (以后可以在系统中添加更多类型的折扣)
我给出的解决方案:
这是TotalCost()算法:
public decimal TotalCost(List<CartItem> cartItems)
{
var totalCost =0.0;
var items = cartItems.where(c => c.Item!=null).Select(c.Item);
foreach(var cartItem in cartItems)
{
if(cartItem.Coupon != Null)
{
cartItem.CouponType.CalculateDiscounts(items);
}
}
foreach(var item in items)
{
totalCost += item.DiscountedCost;
}
return totalCost;
}
答案 0 :(得分:3)
在我看来,您的解决方案的主要缺陷是您的商品类正在聚合折扣类。我认为无论谁看过你的解决方案都没有继续通过这一点。
按项目折扣(优惠券)的汇总表明商品只能有一个折扣,而在您的情况下并非如此。拥有优惠券列表也不会有好处,因为他们确实推出了购物车中包含包含商品或折扣的列表。这通常表明多态性和基础(超级)类型。
他们可能寻找的解决方案看起来或多或少如下:
类层次结构 -
interface CartItem {
}
interface Product extends CartItem {
public int price();
public void updatePrice(int updatedPrice);
}
interface Discount extends CartItem {
public void applyDiscount(List<CartItem> cartItems);
}
算法 -
List<CartItem> cartItems = cart.getItems();
List<Discount> discounts = extractDiscountsFromItems(cartItems);
applyDiscountsOnCartItems(discounts, cartItems);
List<Products> discountProducts = extractProductsFromItems(cartItems);
int totalAmount = calculateAmount(discountProducts);
return totalAmount;
在不支持过滤集合的语言中,您可以使用访问者模式过滤掉项目。
答案 1 :(得分:0)
该列表将包含项目或折扣,并且顺序很重要
从您的设计中不清楚您是如何迎合这部分问题的。我想知道问题是否暗示多态性与顺序处理相结合?像Composite
或Strategy
设计模式之类的东西可能是他们想要的东西吗?