对象具体还是抽象?

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

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

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 13,871评论 1 32
  • 面向对象编程(OOP) 在前面的章节中,我们学习了Kotlin的语言基础知识、类型系统、集合类以及泛型相关的知识。...
    Tenderness4阅读 9,952评论 1 6
  • 一、基础知识:1、JVM、JRE和JDK的区别:JVM(Java Virtual Machine):java虚拟机...
    杀小贼阅读 7,061评论 0 4
  • 整理来自互联网 1,JDK:Java Development Kit,java的开发和运行环境,java的开发工具...
    Ncompass阅读 5,431评论 0 6
  • 一:java概述: 1,JDK:Java Development Kit,java的开发和运行环境,java的开发...
    慕容小伟阅读 5,805评论 0 10

友情链接更多精彩内容