member字段作为java中的方法参数

时间:2017-08-07 13:33:07

标签: java readability

如今,我在公司里写了很多单元测试。

在编写它们时,我遇到了关于使用成员字段作为我的测试类中的方法参数的问题。那是因为我的同事无法理解代码的上下文。

这就是事情。

public class OrderBOTest{
    private Map<Integer, CartProduct> orderProductMap;
    private Map<Integer, ProductLicenseInfo> licenseInfoMap;
    private OrderSheet orderSheet;

    private User orderedUser;

    @Before
    public void createFixtures() {
        ...

        initializeOrderProductAndLicenseInfoMap();

        ...
    }

    ...

    private void initializeOrderProductAndLicenseInfoMap(){
        orderProductMap = MapUtils.collectionToMap(new ArrayList<CartProduct>(), "productNo");
        licenseInfoMap = MapUtils.collectionToMap(new ArrayList<ProductLicenseInfo>(), "productNo");
    }

    ...

    @Test
    public void shouldAddProductToOrderSheetIfAgeOfUserIsOverThanProductGrade() {
        // Given
        CartProduct product = getCartProduct(PRODUCT_NO);
        setOrderable(product, BUYING_PRODUCT);
        setGradeOfProductAndAgeOfUser(product, gradeCodeTypeOfProduct, ageTypeField, globalAgeOfUser);

        addProduct(product);


        // When
        orderSheet = orderBO.getValidOrderSheet(orderedUser, orderProductMap, agentInfo);          

        // Then
        List<Integer> orderedProducts = new ArrayList<Integer>(orderSheet.getOrderProducts().keySet());
        assertThat(orderedProducts, hasSize(greaterThan(0)));
    }

    private void addProduct(int productNo){
        CartProduct product = createCartProduct(productNo);
        orderProductMap.put(product.getProductNo(), product);
    }

    private void addProductLicenseInfo(int productNo, License license){
        ProductLicenseInfo licenseInfo = new ProductLicenseInfo();
        licenseInfo.setProductNo(productNo);
        licenseInfo.setRightType(license.getCode());

        licenseInfoMap.put(licenseInfo.getProductNo(), licenseInfo);
    }
}

我已经将orderProductMap和licenseInfoMap提取为类中的成员字段,因为它们在类中被广泛使用。

问题是,我的同事(甚至我)无法弄清楚方法addProduct(int productNo)在orderProductMap中添加CartProduct

给我的一条建议是将orderProductMap传递给addProduct(int productNo)作为方法参数。

当我听到这个建议时,我认为这听起来很奇怪,因为使用成员字段作为成员方法的参数。

使用成员字段作为成员方法的参数是否常见,以便提高代码的可读性?

(添加了更多源代码信息。)

2 个答案:

答案 0 :(得分:1)

一个&#34;简单&#34;溶液:

private static void addProduct(Map<Integer, CartProduct> orderProductMap, int productNo){ ...

这使您的意图非常明确。你知道有一个小助手方法可以帮助代码重复;另一方面,现在非常清楚,帮助程序会更新到方法的任何内容。

由于该方法仍然是私有,您不会遇到&#34;但静态被视为不良做法&#34;。

并提出你的问题(可能是自以为是的):我认为不好的做法是让方法具有作为字段的参数。 字段的重点在于,您不需要传递给内部方法。

除此之外:考虑重新构建代码,如果它很容易获得&#34;丢失&#34;在阅读测试用例时。

答案 1 :(得分:1)

您可以将addProduct重命名为addProductToMemberFieldMap(或更有意义的内容),这样可以提高可读性。

成员字段作为参数似乎很奇怪,因为成员方法已经可以访问它,所以不需要它们显式提供参数。