使用抽象类来处理数据对象有多糟糕

时间:2011-11-23 11:14:31

标签: java

在编写UI自动化测试时,我遇到了包含许多字段的表单,而不是将大量参数传递给测试方法,而是创建了快速设置表单数据的类。因此,如果有一个注册表单,我创建SignUpDataObjectClass,它将具有对应于表单字段的实例变量,即

public class SignUpFormObject() {
 private username;
 private password;

 public SignUpFormObject setUsername(String username) {
  this.username = username;
  return this;
 }

 public String getUsername() {
  return username;
 }

 public SignUpFormObject setPassword(String password) {
  this.password = password;
  return this;
 }

 public String getPassword() {
  return password;
 }

 // Util method to set signup test data. Test method can use it on the fly
 public static SignUpFormObject setSignUpData() {
  SignUpFormObject dataObject = new SignUpFormObject();
  dataobject.setUsername("test user").setPassword("password");

  return dataobject;    
 }   
}

然后我遇到了一个场景,即为表单创建单个数据对象类没有意义。该表格与优惠券的创建有关,然后可能有不同类别的优惠券。为简洁起见,我会限制这里的字段数量。所以会有两种优惠券 - 优惠和可打印。它们都有优惠券名称和一个特定的字段 (让我们考虑一下 - 提供过期日期)和另一个用于打印(让我们考虑一下 - 可打印的代码)

所以我决定创建Coupon抽象类,它将拥有所有常见字段,然后CouponOffer和CouponPrintable类将扩展Coupon类并添加自己的字段,即

public abstract class Coupon {
 private String couponname;

 public Coupon setCouponname(String couponName) {
  this.couponname = couponname;
 }  

 public String getCouponname() {
  return couponname;
 }

CouponOffer课程来到这里 -

public class CouponOffer extends Coupon {
 private String offerExpireDate;

 public CouponOffer setOfferExpireDate(String offerExpireDate) {
  this.offerExpireDate = offerExpireDate;
  return this;
 }  

 public String getOfferExpireDate() {
  return offerExpireDate;
 }

 // Util method to set coupon offer data
 public static CouponOffer setCouponOfferData() {

  CouponOffer couponOffer = new CouponOffer();    
  couponOffer.setCouponname("test coupon");    
  couponOffer.setOfferExpireDate("31/12/2013");   
  return couponOffer();
 }
}

我愿意知道在这里使用抽象类是不好的方法,并且有更好的解决方案可用。

2 个答案:

答案 0 :(得分:3)

我认为这是一个很好的解决方案。

您的班级CouponOffer只会添加offerExpireDate功能。 Coupon的任何其他功能(属性)都可以被其他实现重用。

无需为每个实现重复简单的Coupon字段

答案 1 :(得分:0)

我认为这是一个很好的解决方案,但基础Coupon类不需要abstract。您正在创建一个类层次结构,这是OO编程应该完成的主要部分。