很久很久以前写了两篇设计模式乱用的文章,最近心血来潮,突然想写篇OOP乱用。

最近在移植一个旧项目,接手过程很多嘈想吐,开一篇谈一下OOP的乱用。

大多数公司用MVC是为了解耦合,但是这套代码的MVC明显是不解耦的,例如View1可以直接拿view2单例如调用里面的方法。v可以调用c,c可以随意调用v。不同人写的c和v可以随意调用。看起来写得爽,但是修改起来就各种吐了,当你修改一个v的时候,我还得读一下耦合的另一个v的相关代码。这段话说得晕晕的,下面直接说简单的OOP的乱用吧。

继承和复盖,相信写过代码的人都懂,也很简单。但是真正写代码的时候,什么情况下用继承呢?直接说反例得了。例如项目有一个加速的界面,很多模块会用到,但是各模块对这个界面的显示有一些不一样,例如A模块比B模块多一个按钮。很多人的想到的方法是在这个加速界面里面加type处理,不同模块有不同的type,然后再加一个param,处理不同模块的逻辑,想到这个方法的人面壁去吧。这个就是当前我接手的项目的最大问题了。这种做法实际上是乱用工厂模式,简单的说,问题就是去别人的加速模块加type处理自己的逻辑。当新项目想移植加速面板的时候,发现这个加速面板耦合大量模块,移植的时候,我要移A的加速面板,还得考虑B的加速逻辑。所以很多人说改别人的代码还不如自己写一个新的来得快。

既然说出了问题,我们再说说解决方案,相信有经验的人早就想到了。把加速面板做成一个基类,不同模块新建一个自己的面板继承那个基类加速板,处理逻辑如果有少量不同的地方就复盖继承处理就行了。思路很简单,下面看看好处吧,各模块写自己的加速面板时,就是自己写自己的,完全不会跟别人的加速面板有关,也不需要去改别人的模块。移植新项目的时候,移一个模块就看一个模块的代码,移植A模块的加速面板就完全不需要管B怎么写的(除非改动基类加速面板)。这样看谁还敢说自己全新写的快。

旧代码虽然用了mvc,虽然对象都继承了基础的view,基础的model,基础的ctrl,然并卵。M和C都是单例,view虽然不是单例,但是放在单例上面给其它单例调用,代码依然还是像没用oop一样,很过程式的写法。既然不做解耦,那何必花这么多码量写这么多继承做什么。直接搞全局方法不还写得快。

吐嘈完毕,本来还想吐mvc的,发现文字量不少,今天先不吐先,下一篇我要吐乱用注入函数。

谈一下OOP的乱用现象的更多相关文章

  1. APP内计费规范出台 手游乱收费现象能被遏制?

    手游乱收费现象能被遏制?" title="APP内计费规范出台 手游乱收费现象能被遏制?"> 在一个混乱.无秩序的环境中竞争,虽然有可能不择手段地获取更多的利益,但 ...

  2. struts2多线程数据乱窜问题

    转自:http://love398146779.iteye.com/blog/1781680 1.struts2为每个线程提供一个action实例,多线程访问时不会出现问题.当使用spring管理st ...

  3. 浅谈OPP

    了解Java或C#等面向对象编程语言的的程序员比较熟悉类和对象以及OOP. 一谈起OOP,就会想起教科书式的OOP概念:封装.继承.多态.粗浅的解释封装就是对数据进行隐藏:继承就是子类继承父类(cla ...

  4. Apache Flink:特性、概念、组件栈、架构及原理分析

     2016-04-30 22:24:39    Yanjun Apache Flink是一个面向分布式数据流处理和批量数据处理的开源计算平台,它能够基于同一个Flink运行时(Flink Runtim ...

  5. flink 入门

    http://ifeve.com/flink-quick-start/ http://vinoyang.com/2016/05/02/flink-concepts/ http://wuchong.me ...

  6. 怒转一波,此人整理的Flink特别好

    Apache Flink:特性.概念.组件栈.架构及原理分析 Apache Flink是一个面向分布式数据流处理和批量数据处理的开源计算平台,它能够基于同一个Flink运行时(Flink Runtim ...

  7. Apache Flink:详细入门

    Apache Flink是一个面向分布式数据流处理和批量数据处理的开源计算平台,它能够基于同一个Flink运行时(Flink Runtime),提供支持流处理和批处理两种类型应用的功能.现有的开源计算 ...

  8. 从js向Action传中文参数出现乱码问题的解决方法

    Action获取jsp表单中的中文参数,只要整个项目都采用UTF-8编码格式都不会出现乱码问题:但JSP中用到JS,并从JS向Action传中文参数,就会出现中文乱的现象     做项目的时候,发现A ...

  9. 专题:Channel Bonding/bonding

    EtherChannel最初是由cisco提出,通过聚合多条物理链路为单条逻辑链路,从而实现高可用及提高吞吐量等目的.AgP(Port Aggregation Protocol,Cisco专有协议). ...

随机推荐

  1. ubuntu 12.04 安装 redis

    原文地址:http://ijonas.com/software-development/nosql/412/ 1 Installing Redis 2.6.x on Ubuntu 12.04 and ...

  2. [游戏模版18] Win32 五子棋

    >_<:Learning its AI logic. >_<:resource >_<:code: #include <windows.h> // C ...

  3. paip.c3p0 数据库连接池 NullPointerException 的解决...

    paip.c3p0 数据库连接池 NullPointerException 的解决... 程序ide里面运行正常..外面bat运行错误.. 作者Attilax  艾龙,  EMAIL:14665198 ...

  4. iOS开发---百度地图配置流程,2.6.0 版本 支持64位

      1.首先需要在百度地图下载最新SDK:地址: http://developer.baidu.com/map/index.php?title=iossdk/sdkiosdev-download 2. ...

  5. maven源码分析- mvn.bat分析

    第一次知道MAVEN是在2008年,当时想分析geoserver这个开源项目,发现该项目采用了maven进行项目管理,当时粗略的学习了一下.真正在工作中使用是在09年下半年,个人感觉使用起来还是非常好 ...

  6. 取消 virtualStore 注册表[启用和禁止 UAC虚拟化]

    近日发现,在win2008R2 x64下运行的服务器程序,其注册表读取路径为: [HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\SZDomain\itvc1] 但是经 ...

  7. 单元测试 mock EF 中DbContext 和DbSet Include

    现在EF越来越流行了,很多时候业务成都是直接访问DbContext 和DbSet来操作数据的. 那么我们测试的时候如何来mock这2个对象了?现在时间很晚了, 就直接贴code吧 首先看看的我们DbC ...

  8. linux C++ 获取文件绝对路径

    提供ftp服务时需要获取文件绝对路径,这里记录一下. #include <stdlib.h> #include <stdio.h> #include <limits.h& ...

  9. ZooKeeper典型应用场景一览

    原文地址:http://jm-blog.aliapp.com/?p=1232 ZooKeeper典型应用场景一览 数据发布与订阅(配置中心) 发布与订阅模型,即所谓的配置中心,顾名思义就是发布者将数据 ...

  10. Linux2.6 内核的 Initrd 机制解析(转)

    from: https://www.ibm.com/developerworks/cn/linux/l-k26initrd/ 简介: Linux 的 initrd 技术是一个非常普遍使用的机制,lin ...