很久很久以前写了两篇设计模式乱用的文章,最近心血来潮,突然想写篇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. OpenWrt资料汇总

    上周末折腾了一下OpenWrt,打算把Facebook的网络模拟工具部署到上面,最终以失败告终.上github看,发现已经有人给作者提了issue,作者表示部署在OpenWrt上会很有用,但确实在Op ...

  2. Mac直播服务器Nginx配置对HLS的支持

    在上一篇中Mac上搭建直播服务器Nginx+rtmp,我们已经搭建了nginx+rtmp直播服务器.下面需要对Nginx服务器增加对HLS的支持.在Nginx增加对HLS种支持比较简单,只是简单的修改 ...

  3. 【HTML5】Canvas 内部元素添加事件处理

    前言 canvas 没有提供为其内部元素添加事件监听的方法,因此如果要使 canvas 内的元素能够响应事件,需要自己动手实现.实现方法也很简单,首先获得鼠标在 canvas 上的坐标,计算当前坐标在 ...

  4. 点击div外面该div消失

    <head> <meta charset="UTF-8"> <title></title> <script type=&quo ...

  5. CentOS7 修改系统时间

    yum -y install ntp [root@localhost kevin]# systemctl enable ntpdsystemctl start ntpdntpdate us.pool. ...

  6. iOS开发---集成ShareSDK实现第三方登录、分享、关注等功能。

    (1)官方下载ShareSDK IOS 2.9.6,地址:http://sharesdk.mob.com/Download (2)根据实际情况,引入相关的库,参考官方文档. (3)在项目的AppDel ...

  7. 上海邮政EMS海关清关(个人) 流程

    最近雾埋越来越严重,上个星期买了一个tacx骑行台,不料运气欠佳,被税了.那就去乖乖缴税吧. 拿着EMS的通知单(没有通知单就不要去了),到通知单指定的地址(上海有两处,我的是武定路458号)清关提货 ...

  8. Swift 必备开发库 (高级篇)

    1.CryptoSwift swift加密库, 支持md5,sha1,sha224,sha256... github地址: https://github.com/krzyzanowskim/Crypt ...

  9. 使用LS2J技术在LotusScript中使用Java

    我们可以使用LS2J技术在LotusScript中来调用Java类,下面举例说明: 1.       首先需要在代理的 (Options)部分,添加如下: Uselsx "*javacon& ...

  10. ImageEdit 展示图片(XAML, C#)

    <dxe:ImageEdit Source="/Gemr;component/Images/FakeUI/MedicalRecordFake.jpg" Stretch=&qu ...