1

我正在编写一个函数,我基本上一遍又一遍地做同样的事情。我有下面列出的功能

public String buildGarmentsString(List<Garment> garments)
{
    StringBuilder garmentString = new StringBuilder(10000);
    for(int i=0;i<4;i++)
    {
        garmentString.append(this.garmentProductId(i,garments.get(i).getProductId()));
        garmentString.append(this.garmentColor(i,garments.get(i).getColor()));
        for(int j=0;j<garments.get(i).getSizes().size();j++)
        {
            //check xxsml
            if(garments.get(i).getSizes().get(j).getXxsml() >0)
            {
                garmentString.append(this.garmentSizes(i, Size.xxsml(),garments.get(i).getSizes().get(j).getXxsml()));

            }

            //check xsml
            if(garments.get(i).getSizes().get(j).getXsml() > 0)
            {
                garmentString.append(this.garmentSizes(i,Size.xsml(),garments.get(i).getSizes().get(j).getXsml()));
            }

            //check sml
            if(garments.get(i).getSizes().get(j).getSml() > 0)
            {
                garmentString.append(this.garmentSizes(i,Size.sml(),garments.get(i).getSizes().get(j).getSml()));
            }

            //check med
            if(garments.get(i).getSizes().get(j).getMed() > 0)
            {
                garmentString.append(this.garmentSizes(i,Size.med(),garments.get(i).getSizes().get(j).getMed()));
            }

            //check lrg
            if(garments.get(i).getSizes().get(j).getLrg() > 0)
            {
                garmentString.append(this.garmentSizes(i,Size.lrg(),garments.get(i).getSizes().get(j).getLrg()));
            }

            //check xlrg
            if(garments.get(i).getSizes().get(j).getXlg() > 0)
            {
                garmentString.append(this.garmentSizes(i,Size.xlg(),garments.get(i).getSizes().get(j).getXlg()));
            }

            //check xxlrg
            if(garments.get(i).getSizes().get(j).getXxl() >0)
            {
                garmentString.append(this.garmentSizes(i,Size.xxlg(),garments.get(i).getSizes().get(j).getXxl()));
            }

            //check xxxlrg
            if(garments.get(i).getSizes().get(j).getXxxl() >0)
            {
                garmentString.append(this.garmentSizes(i,Size.xxxlg(),garments.get(i).getSizes().get(j).getXxxl()));
            }


        }
    }
}

这是我的服装尺寸功能:

public String garmentSizes(int garmentNumber, String size,int numberToSend)
{
    String garmentSizes = "&garment["+garmentNumber+"][sizes]["+size+"]="+numberToSend;
    return garmentSizes;
}

我试图弄清楚如何用更少的代码完成这项工作。我已经读过,通过函数式编程,您可以执行诸如将函数传递给其他函数的参数之类的事情。在网上做了一些阅读之后,我想我想做这样的事情,但我不确定如何或最好的方法是什么。

我在这里阅读了一些关于堆栈溢出的内容,并且我看到人们提到使用命令模式、FunctionalJava 或 LambdaJ 来尝试在 Java 中逼近这个特性。我已经阅读了这两个库的文档并阅读了关于命令模式的 Wikipedia 文章,但我仍然不确定如何使用其中的任何一个来解决我的特定问题。有人可以向我解释一下吗?作为从未做过任何函数式编程的人,这有点令人困惑。

4

3 回答 3

3
  • 您可以使用局部变量来减少重复次数。比如说bySize = garments.get(i).getSizes().get(j)
  • 而不是等size.getXxsml()size.getXsml()您可以使用枚举来表示大小并循环使用大小。

整个事情看起来像:

for(int j=0;j<garments.get(i).getSizes().size();j++) {
    bySize = garments.get(i).getSizes().get(j);
    for (Size s : Size.values()) {
        if (bySize.get(s) > 0)  {
            garmentString.append(garmentSizes(i, s, bySize.get(s)));
        }
    }
}

bySize.get(s)方法可以使用指向正确方法的开关或直接在枚举中实现,您可以摆脱getXsml等方法。

于 2014-02-08T22:52:06.040 回答
1

所有支票之间唯一不同的是:

getXxsml/xxsml, getXsml/xsml, getSml/sml, etc.

如果您可以将这些值(作为字符串)传递给某个上层方法,并且如果
该上层方法可以 eval 即执行这些字符串,那么您可以只
拥有这些值的数组并将该数组传递给该上层方法。

在 Java 中,您可以使用反射做类似的事情。 通过使用反射,
所有这些检查确实可以简化为更少的代码。

看看:
java.lang.Class
java.lang.reflect.Method
java.lang.reflect.Field
java.lang.reflect.Constructor
你就会明白我的意思。

于 2014-02-08T22:47:42.727 回答
0

从您的代码看来,某些类具有以下方法:

 xxsml(), xsml(), sml(), med(), ..., xxxlg()

获取每种尺寸的可用数量(?)。

您可以更好地设计数据,如下所示:

  • Have a "Size" type, that enumerates all sizes (could be Enum or some class with attribute String key)
  • Have a method that returns a List of all known sizes.
  • replace the above methods with amountFor(Size) This could be backed by a Map<Size, Integer>

For backward compatibility, you could rewrite the old methods along the lines:

int xxsml() {
    return amountFor(Size.XXSML);  // assuming you have a singleton instance
                                   // for each well known size
}

Of course, in getGarmentString, you would then loop through the List of all known sizes:

for (Size sz : Size.getAllKnownSizes()) {
    if (garments.get(i).getSizes().get(j).amountFor(sz) > 0) {
          ... do whatever must be done here
    }
 }
于 2014-02-09T10:10:49.360 回答