java 中的成员字段作为方法参数

member field as method parameter in java

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

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

事情是这样的。

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 提取为 class 中的成员字段,因为它们在 class 中被广泛使用。

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

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

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

是否常用成员字段作为成员方法的参数来提高代码的可读性?

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

一个"simple"解法:

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

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

并且由于该方法仍然是 私有的,您不会 运行 进入 "but static is considered bad practice"。

然后问你的问题(可能是自以为是):我认为不好的做法,方法的参数是字段。 fields 的全部要点是您不需要 pass 它们到内部方法。

除此之外:如果在阅读测试用例时很容易获得 "lost",请考虑重新构建代码。

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

作为参数的成员字段看起来很奇怪,因为成员方法已经可以访问它,因此它们不需要显式提供作为参数。