对象具体还是抽象?

在开发中,我们经常会把变量设置为私有(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();
}

我们看到这两种定义的本质是截然对立的。过程式代码便于在不改动既有数据结构的前提下添加新函数,而面向对象代码便于在不改动既有的函数下添加新类。
所以在具体的业务场景在来决定使用哪种方式,需要添加新数据类型而不是新函数的时候可以使用面向对象;需要添加新函数而不是数据类型使用过程式比较合适。一切都是对象只是一个传说。具体的使用方式需要根据当前业务场景来决定。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值