Foreword

抽象和接口是Java中的两个关键字,也是两种最基本的优化软件项目手段。为什么说它们是一种优化项目的手段?

人分三六九等,不同等级的人,所接触的事和处理的事是不一样的。同理,项目也分大项目和中项目和小项目,大、中、小项目所承载的目标也是不一样的。

先说小项目,如果你使用Java只是写一个小脚本,比如更新一下系统时间,自动点击某个软件按钮,修改表格数据...类似这样的功能。对于这种小项目,项目里无非三、两个功能函数,有个Main按照顺序调用一下即可,那么这种项目就永远都不需要使用到抽象和接口。用了反而是累赘,有画蛇添足的味道。

但是对于大项目就不同了,比如一个大型的电商系统,用户的需求多、使用人群广、数据类型多且需要一定关联度。商品种类多、店铺的类型各异...,当然这些都是在系统设计阶段的麻烦。在开发阶段的麻烦是,不同项目组的人都做不同的模块,一个项目组的人怎么配合也是麻烦,最后数据对接起来也是麻烦、前后端之间的数据对接...,怎么样,想想都头疼了吧。

为什么说有了抽象和接口,能给大型项目带来便利、优化?

Abstraction and Interface

一些前人留下了一些经典的设计模式,比如单一模式,指在设计的时候要保证类的单一功能,如果完全按照这种模式,那么业务的实现会变成无数个类,并且代码间非常耦合,在修改业务需求和代码的时候,都是一场灾难。

接口则是解耦的最基本工具,接口允许将方法的定义与其实现分开,这种分离使得多个不相关的类能够实现同一组方法,从而保证了项目中不同部分之间的相互通信。

抽象类非常适合多个子类共享共同特征和属性,但也兼容自己独有的行为情况,同时为子类的定制实现留出空间。

这个现象让我想到对有序数组的排序:

就类似对有序数组进行排序,使用冒泡排序和二分查找算法去实现,虽然都能完成这个效果。但是它们的时间复杂度差异也很大,差了一个数量级。

  • 冒泡排序的时间复杂度为O(n);
  • 二分查找的时间复杂度为O(logn);

同样的,你不使用抽象和对象也一样能实现大型项目,但是效果不一样,在管理的复杂度上也不一样。

如果说冒泡和二分体现的差异在时间和空间上。那么设计不合理的项目,就体现在在代码的工作量上。

当然,项目中增加了抽象和接口,新人的理解难度也直线上升,这也逼迫这个项目的程序员都必须得安装OOP思想,才能上手这种项目。

Understand Abstraction and Interface的更多相关文章

  1. Google C++ Style Guide

    Background C++ is one of the main development languages used by many of Google's open-source project ...

  2. How I explained OOD to my wife(转)

    How I explained OOD to my wife Learning Object Oriented Design principles through interesting conver ...

  3. Google C++ 代码规范

    Google C++ Style Guide   Table of Contents Header Files Self-contained Headers The #define Guard For ...

  4. How I explained OOD to my wife

    Introduction My wife Farhana wants to resume her career as a software developer (she started her car ...

  5. IOS8Preview-xCode_6

    IOS8Preview-xCode_6 what's new What's new in xCode 6 Xcode 6 introduces a radically new way to desig ...

  6. Android Volley源码分析

    今天来顺手分析一下谷歌的volley http通信框架.首先从github上 下载volley的源码, 然后新建你自己的工程以后 选择import module 然后选择volley. 最后还需要更改 ...

  7. TCP keepalive under Linux

    TCP Keepalive HOWTO Prev   Next 3. Using TCP keepalive under Linux Linux has built-in support for ke ...

  8. TCP Keepalive HOWTO

    TCP Keepalive HOWTO Fabio Busatto <fabio.busatto@sikurezza.org> 2007-05-04 Revision History Re ...

  9. Understanding and Creating OWIN Middlewares - Part 1

    In my previous article, What is OWIN? A Beginners Guide we learned the basics of OWIN and the benefi ...

  10. Design Pattern ->Bridge

    Layering & Contract Philosophy With additional indirection. class CWindowImp { public: virtual v ...

随机推荐

  1. MediaCodec硬解流程

    一 MediaCodec概述 MediaCodec是Android 4.1(api 16)版本引入的低层编解码接口,同时支持音视频的编码和解码.通常与MediaExtractor.MediaMuxer ...

  2. 洞元智维产品上线:江浙沪PV访问量飙升背后的深层逻辑与未来发展趋势

    洞元智维产品自上线以来,凭借其卓越的智能化产品性能和出色的用户体验,迅速在市场上崭露头角,特别是在上海.江苏.浙江等经济发达地区,其PV访问量持续飙升.这不仅反映了用户对智能化产品的强烈需求,更揭示了 ...

  3. 对象池Pools优化

    目录介绍 01.什么是对象池 02.glide哪里用到对象池 03.多条件key缓存bitmap 3.1 多条件key创建 3.2 key值的复用 04.glide对象池总结 05.学以致用对象池 5 ...

  4. 浅析JS原型链

    目录 实例对象 原型对象 对象原型 短暂总结一下 constructor 原型链 何为原型链呢? 就是实例对象和原型对象之间的链接,每一个对象都有原型,原型本身又是对象,原型又有原型,以此类推形成一个 ...

  5. Non-local Network:人类早期在CV驯服Transformer尝试 | CVPR 2018

    Non-local操作是早期self-attention在视觉任务上的尝试,核心在于依照相似度加权其它特征对当前特征进行增强,实现方式十分简洁,为后续的很多相关研究提供了参考   来源:晓飞的算法工程 ...

  6. 关于Guava ForwardingMap

    ForwardingMap是什么? ForwardingMap 是一个装饰器 负责把所有的map操作转发到所代理的map. 操作转发是直接的,不经任何中间操作的. 对方法的覆写要慎重,比如关联的put ...

  7. 11 CSS盒子模型(重点)

    11 CSS盒子模型(重点) 盒模型是CSS的核心知识点之一,它指定元素如何显示以及如何相互交互.HTML页面上的每个元素都可以看成一个个方盒子,这些盒子由元素的content(内容).padding ...

  8. 4 CSS属性选择器

    4 属性选择器 属性选择器是通过元素的属性及属性值来选择元素的.下面介绍属性选择器的用法. 第一种用法 作用:选择含有指定属性的元素. 语法:[属性名]{} 示例如下: <!DOCTYPE ht ...

  9. #阶梯NIM#Poj 1704 Georgia and Bob

    题目 有\(n\)个棋子摆放在x轴的正半轴上, 每次将棋子最多向左移动至上一个棋子之后(不能不移动), 不能操作为败,问先手是不是必胜 分析 这个模型可以转换成阶梯NIM的形式, 那么将奇数位置做NI ...

  10. 数据驱动ddt简单使用

    安装 pip install ddt 数据驱动 ddt  可以使用的地方很多 比如: 1. 做接口测试的参数化 2. 读取自动化测试关键字模型的测试用例 等 demo import ddt, unit ...