列出某些对象的变量时,重复变量是否可以接受?

时间:2013-09-20 00:31:18

标签: coding-style conventions

以下是一个示例案例:

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; 

现在就个人而言 - 虽然第一个例子比较单一,并且涉及重复变量,但它比其他两个解决方案更易读,更易于修改。

是否存在围绕这种编程风格/问题的约定?

1 个答案:

答案 0 :(得分:2)

如果您只有常数HAWAIIAN ITALIAN MEATLOVERS,请将它们放入枚举中,最好采用第一种格式 - 简洁易读。

如果比萨饼和配料很可能会成为具有未来更改(VEGGIE?!?种类奶酪?)潜力的真实概念,所有这些都会破坏,感觉你的代码没有任何变化。除了原料(price()?tasty()?)之外,所需要的只是比萨饼的第二个属性,并且对于每个新的比萨饼,您必须在多个地方编写代码。然后你应该使用一个适当的面向对象的设计,一个带有摘要披萨和成分的子类的层次结构。

在头部设计模式的工厂章节中,有一个很长的披萨店例子涵盖了非常相似的地面。