谈一下OOP的乱用现象
很久很久以前写了两篇设计模式乱用的文章,最近心血来潮,突然想写篇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的乱用现象的更多相关文章
- APP内计费规范出台 手游乱收费现象能被遏制?
手游乱收费现象能被遏制?" title="APP内计费规范出台 手游乱收费现象能被遏制?"> 在一个混乱.无秩序的环境中竞争,虽然有可能不择手段地获取更多的利益,但 ...
- struts2多线程数据乱窜问题
转自:http://love398146779.iteye.com/blog/1781680 1.struts2为每个线程提供一个action实例,多线程访问时不会出现问题.当使用spring管理st ...
- 浅谈OPP
了解Java或C#等面向对象编程语言的的程序员比较熟悉类和对象以及OOP. 一谈起OOP,就会想起教科书式的OOP概念:封装.继承.多态.粗浅的解释封装就是对数据进行隐藏:继承就是子类继承父类(cla ...
- Apache Flink:特性、概念、组件栈、架构及原理分析
2016-04-30 22:24:39 Yanjun Apache Flink是一个面向分布式数据流处理和批量数据处理的开源计算平台,它能够基于同一个Flink运行时(Flink Runtim ...
- flink 入门
http://ifeve.com/flink-quick-start/ http://vinoyang.com/2016/05/02/flink-concepts/ http://wuchong.me ...
- 怒转一波,此人整理的Flink特别好
Apache Flink:特性.概念.组件栈.架构及原理分析 Apache Flink是一个面向分布式数据流处理和批量数据处理的开源计算平台,它能够基于同一个Flink运行时(Flink Runtim ...
- Apache Flink:详细入门
Apache Flink是一个面向分布式数据流处理和批量数据处理的开源计算平台,它能够基于同一个Flink运行时(Flink Runtime),提供支持流处理和批处理两种类型应用的功能.现有的开源计算 ...
- 从js向Action传中文参数出现乱码问题的解决方法
Action获取jsp表单中的中文参数,只要整个项目都采用UTF-8编码格式都不会出现乱码问题:但JSP中用到JS,并从JS向Action传中文参数,就会出现中文乱的现象 做项目的时候,发现A ...
- 专题:Channel Bonding/bonding
EtherChannel最初是由cisco提出,通过聚合多条物理链路为单条逻辑链路,从而实现高可用及提高吞吐量等目的.AgP(Port Aggregation Protocol,Cisco专有协议). ...
随机推荐
- Twitter API升级至1.1
Twitter API 1.1是至今最大的一次升级,从3月份提出,到6月11日1.0版本已经全面停止调用.关于1.1版本升级特性可访问: https://dev.twitter.com/docs/ap ...
- AngularJS应用页面切换优化方案
葡萄城的一款尚在研发中的产品,对外名称暂定为X项目.其中使用了已经上市的Wijmo中SpreadJS产品,另外,在研发过程中整理了一些研发总结分享给大家.如本篇的在页面切换的过程中优化方案,欢迎大家跟 ...
- HTTP协议之chunk编码(分块传输编码
Transfer-Encoding: chunked 表示输出的内容长度不能确定,普通的静态页面.图片之类的基本上都用不到这个. 但动态页面就有可能会用到,但我也注意到大部分asp,php,asp.n ...
- cmd命令生成android签名证书
cmd命令生成android签名证书,有空在写一篇eclipse导出带签名的apk,这里面包括生成新的签名.现在还是讲讲在cmd怎么操作生成签名证书. 1.dos下进入JDK的bin目录 运行如下命令 ...
- web前端基础——补充
1 布局和事件 布局效果如下(标题和内容都居中,两边留空白) 布局代码如下 <!DOCTYPE html> <html lang="en"> <he ...
- 如何设置缺省路由 route hosts(仅助记) 马连洼 马连洼 马连洼
linux下添加路由的方法:一:使用 route 命令添加使用route 命令添加的路由,机器重启或者网卡重启后路由就失效了,方法://添加到主机的路由# route add –host 192.16 ...
- 如何在安装程序中判断操作系统是否是64位 inno
[Setup]; 开启64位模式ArchitecturesInstallIn64BitMode=x64 [Run] ;根据是否是64位进行不同的操作Filename: "..."; ...
- 高可用性、负载均衡的mysql集群解决方案
高可用性.负载均衡的mysql集群解决方案 一.mysql的市场占有率 二.mysql为什么受到如此的欢迎 三.mysql数据库系统的优缺点 四.网络服务器的需求 五.什么是mysql的集群 六.什么 ...
- 如何将 DVD 转成 ISO
Windows 电脑 + 光驱(Mac 下没找到类似 UltraISO 这么好用的软件,知道的朋友推荐一下哈) 安装 UltraISO 软件(试用版即可),http://baoku.360.cn/so ...
- 使用Enitity Framework实现增删改查服务中的一些通用思路
添加 → 方法参数中有一个有关添加视图模型类型的形参,比如vm→ 根据vm的某个属性,比如Name判断在上下文中是否存在,如果不存在就抛EntityNotFoundException异常→ 判断vm所 ...