对象具体还是抽象?
2019-07-09 本文已影响0人
fomin
在开发中,我们经常会把变量设置为私有(private),不想使用者依赖这些变量,但很多程序员也会给对象自动添加get/set方法,将私有变量公之于众。
具体点
public class User {
private int userId;
private String userName;
}
抽象点
public interface User {
int getUserId();
String getUserName();
void setUser(int userId, String userName);
}
抽象点优势在于使用者不知道该User信息是如何实现的,并明白无误地呈现了一种数据结构;而具体点暴露了具体实现,即便是私有变量,通过get/set还是会暴露具体实现。
所以隐藏实现不是单单的把变量之间放上一个函数层那么简单。隐藏实现关乎于抽象,类并不简单地用get/set将变量推向外间,而是暴露抽象接口,以便使用者无需了解数据的实现就能操作数据本地。
当然在具体实现中,这种并不是绝对的,对象和数据结构有相关的反对称性。
过程式代码
public class PercentDiscount {
private float percent;
private float price;
}
public class ReductionDiscount {
private float reduction;
private float price;
}
public class Discount {
public float getPrice(Object obj) throws NoSuchFieldException {
if (obj instanceof PercentDiscount) {
PercentDiscount pd = new PercentDiscount();
return pd.percent * pd.price;
} else if (obj instanceof ReductionDiscount) {
ReductionDiscount rd = new ReductionDiscount();
return rd.price - rd.reduction;
} else {
throw new NoSuchFieldException();
}
}
}
多态式代码
public class PercentDiscount implements Discount {
private float percent;
private float price;
@Override
public float getPrice() {
return price * percent;
}
}
public class ReductionDiscount implements Discount {
private float reduction;
private float price;
@Override
public float getPrice() {
return price - reduction;
}
}
public interface Discount {
float getPrice();
}
我们看到这两种定义的本质是截然对立的。过程式代码便于在不改动既有数据结构的前提下添加新函数,而面向对象代码便于在不改动既有的函数下添加新类。
所以在具体的业务场景在来决定使用哪种方式,需要添加新数据类型而不是新函数的时候可以使用面向对象;需要添加新函数而不是数据类型使用过程式比较合适。一切都是对象只是一个传说。具体的使用方式需要根据当前业务场景来决定。