以下是一个示例案例:
public list getPizzaIngredients(pizzaName) { if pizzaName = HAWAIIAN return [ CHEESE, TOMATO SAUCE, PINEAPPLE, HAM]; if pizzaName = ITALIAN return [ CHEESE, TOMATO SAUCE, PEPPERONI, OLIVES]; if pizzaName = MEATLOVERS return [ CHEESE, TOMATO SAUCE, PEPPERONI, BACON, SAUSAGE, OLIVES]; return null; }
这里我们重复每个列表中的成分。另一种方法是:
public list getPizzaIngrediants(pizzaName) { ing = []; ing.add(CHEESE) ing.add(TOMATO SAUCE); if pizzaName in (HAWAIIAN) ing.add(PINEAPPLE); if pizzaName in (HAWAIIAN) ing.add(HAM); if pizzaName in (ITALIAN, MEATLOVERS) ing.add(PEPPERONI); if pizzaName in (ITALIAN, MEATLOVERS) ing.add(OLIVES); if pizzaName in (MEATLOVERS) ing.add(BACON); if pizzaName in (MEATLOVERS) ing.add(SAUSAGE); return ing;
或者我们可以使它更简洁:
public list getPizzaIngrediants(pizzaName) { ing = []; ing.add(CHEESE,TOMATO SAUCE) if pizzaName in (HAWAIIAN) ing.add(PINEAPPLE, HAM); if pizzaName in (ITALIAN, MEATLOVERS) ing.add(PEPPERONI, OLIVES); if pizzaName in (MEATLOVERS) ing.add(BACON, SAUSAGE); return ing;
现在就个人而言 - 虽然第一个例子比较单一,并且涉及重复变量,但它比其他两个解决方案更易读,更易于修改。
是否存在围绕这种编程风格/问题的约定?
答案 0 :(得分:2)
如果您只有常数HAWAIIAN ITALIAN MEATLOVERS,请将它们放入枚举中,最好采用第一种格式 - 简洁易读。
如果比萨饼和配料很可能会成为具有未来更改(VEGGIE?!?种类奶酪?)潜力的真实概念,所有这些都会破坏,感觉你的代码没有任何变化。除了原料(price()?tasty()?)之外,所需要的只是比萨饼的第二个属性,并且对于每个新的比萨饼,您必须在多个地方编写代码。然后你应该使用一个适当的面向对象的设计,一个带有摘要披萨和成分的子类的层次结构。
在头部设计模式的工厂章节中,有一个很长的披萨店例子涵盖了非常相似的地面。