美文网首页
对象具体还是抽象?

对象具体还是抽象?

作者: fomin | 来源:发表于2019-07-09 23:23 被阅读0次

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

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

    相关文章

      网友评论

          本文标题:对象具体还是抽象?

          本文链接:https://www.haomeiwen.com/subject/umyqkctx.html