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
(或更有意义的名称),这将提高可读性。
作为参数的成员字段看起来很奇怪,因为成员方法已经可以访问它,因此它们不需要显式提供作为参数。
现在,我在公司里写了很多单元测试。
在编写它们时,我遇到了关于在我的测试中将成员字段用作方法参数的问题 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
(或更有意义的名称),这将提高可读性。
作为参数的成员字段看起来很奇怪,因为成员方法已经可以访问它,因此它们不需要显式提供作为参数。