代码能不能不要写得这么烂?!

     我是一个研二的即将实习和毕业的普通屌丝研究生,带着几个研一的同学一起做数据挖掘项目。为了在毕业的时候防止青黄不接导致老师不让我毕业,于是从他们刚进实验室起,就“开始了设计模式和代码风格的培养”。具体的做法,就是扔给他们“大话设计模式”和金旭亮老师的“.NET 4.0面向对象编程漫谈”。于是项目接着做,我也很忙没怎么看过他们写的代码,直到昨天闲的没事,翻开SVN看各种他们写的代码,然后就很崩溃… 列举如下:

1. 以前命名变量用a1,a2,a3,现在好多了,但能不能别用汉语拼音?聚类的函数就算不写ClusterMethod, 但也不要叫JuleiMethod 啊! 有了继承,那个新类怎么也得反应改进特点吧,最少也不能叫 XXXFinal, XXXTest, 或者XXX2吧?

image

我在想,这个GuoDu又是什么?过度?国度?我实在想不到数据挖掘领域还有这个拼音的东东。

2. 超大类! 大到什么程度呢? 五百行?不,一千行?不,是五千行!一个MainWindow的类里面,洋洋洒洒五千行代码,100个变量,50多个函数,功能倒是实现了,可是代码滚动条都细的看不见了,敢不敢把逻辑分开啊? “单一职责”真是发挥到淋漓尽致:一个类把一个老师的任务搞定!

3. 你是懒还是勤快?几个类的功能差不多,只有一些细节不同,就算不做继承吧,也别把一样的函数拷贝四五遍啊。下面是两个不同类的截图:

image

4. 截图同上。 一个对象可能是继承树里的叶子节点,在编程的时候这个基类没有你想要的属性,但不需要每次都as 吧? 如果是单个变量,在代码前as并判断非空不就好了?

若是个集合,在代码开始时通过LINQ语句提取集合中相应类型不就好了? 看到那么多as,你不觉得很烦么?

5. 一个类里面有很多个参数,但能不能不要把所有的参数设置都写到构造函数里面啊,你有10个参数,就要写十个参量的构造函数?能不能做成默认值?其他做成属性访问器不就好了?

image

6. 能别这么酷爱单例模式和静态变量和方法啊? 我知道你用单例和静态很爽,到处都能调用,可是,内存回收呢?代码扩展性呢?

image

大哥,怎么说这个词典也能占个200M内存,你为了方便一个单例就搞定了,你让它啥时候被GC回收啊?

7. 我要你把一个代码从JAVA移植到C#上,还真是够辛苦,JAVA没有属性访问器,但是C#里面有啊,干嘛还在C#上把所有的属性都加上个 getXXX() 和setXXX()方法。 你真勤快!而且还加上了javadoc风格的注释,真是辛苦你了

 

8. 代码注释是用来说明代码的,稍微有些个注释掉的东西还是能理解的,可是,你一个长长的代码文件里,注释比源代码多好几倍,都是以前随便写的测试代码,废弃的代码,舍不得删,可是,后来你再看过吗?你都没看过,这些大段的注释除了碍眼有什么用处?

image

9. 蛋疼的在集合中删除元素!

     你学会了foreach, 可爱的迭代器模式,于是和我一样,不喜欢写for循环了。哪天你问我,foreach中remove会报错!我说,当然会报错,于是你在外面new一个集合,把要删的全拷贝进去,然后再来个for循环拷出来,然后。。。还是不对,最后只能再用for循环了。看得我都要心碎了,咱先不说性能,用LINQ写一个扩展方法RemoveElement不就好了?

  /// /// 对集合实现删除操作//////元素类型///要删除的元素列表///过滤器///删除时执行的委托public static void RemoveElements(this IList source, Func filter, Action method){var indexs = (from d in source where filter(d) select source.IndexOf(d)).ToList();indexs.Sort();for (var i = indexs.Count - 1; i >= 0; i--){if (method != null){method(source[indexs[i]]);}source.RemoveAt(indexs[i]);}}

然后,你在实现IList接口上的集合都能删除元素了,并且还能通过一个委托做一些操作,多舒服啊…

10.  你会在一个类的成员里很高兴的定义一个变量,比如下面:

 image

   一个随机数产生器ran, 然后私有成员还很勤快的写了get,set访问器,下面诡异的arrh,这都不说啥了,关键是下面:

image

  这个变量被你在函数中轻易的覆盖了,覆盖了也不管,反正好像程序结果也是正确的,可是以后没这么走运怎么办?

11.  你不懂什么叫写“库”,只知道写代码,代码重用就是代码搬运工,从这边拷贝到那边。真正的库是什么?稳定,高效,好用,扩展性强。 到现在都没写过一个库,老师布置什么任务,新开一个工程,名字命名成XXXTest, 然后一顿狂敲,毕业时候,工作就是那么20多个不同的文件夹,所有代码都是给自己写给自己看,到最后连自己都看不懂了… 那些能够重用的功能,为什么不好好重构一下,以后肯定还能用得着啊!

12. Console.WriteLine(“xxxxxxxx”)

    Console.WriteLine(“xxxxxxxx”)

    Console.WriteLine(“xxxxxxxx”)

    你给写的类库,里面全是这些控制台输出,做Console程序还好,一个大黑框哗哗哗的输出出来,可是,做WPF界面程序和WCF呢?你总不至于输出到VS里那个小小的调试窗口吧!我哪天想让你输出到txt文件,你是不是就傻眼了?  敢不敢用用专门的日志组件,比如log4net!

13.  C风格的C#, 里面全是数组,数组,数组。。。。。。太怨念了。.NET疯了会搞那么多集合和接口进去?全用数组不就得了?

   两个集合的对应元素需要做加法,你是这么做的:

image

  可是,如果这个代码被执行1000遍,你就要new一千次数组,且不管GC效率如何,这种需求你完全可以返回一个IEnumerable过去,通过类似LINQ的延迟计算进行,也不用生成这么多数组啊啊啊。。。。

13. for循环啊!

   image

     能不能写个for循环?敢不敢? 不仅如此,你都愿意为一块仅仅有细微差别的代码复制十遍,却不敢写一个for循环?

14. 做界面时候的事件引用器…

    在界面上,你会在每个按钮,每个菜单双击一下,然后在C#代码中,敲事件处理程序,无非就是一堆变量赋值,一堆初始化等等,若你是做Winform,那我也就勉强不说什么了,可是你做的是WPF,这么紧密的耦合,让以后我改界面或者改逻辑的时候怎么办? 敢不敢去学一下绑定和MVVM?

15. 还有无数的槽点,比如你会在程序位置输出几百兆的txt文件方便你调试,然后就都被你无良的上传到SVN上面去了,SVN也从来不正确使用,也不管冲突不冲突就直接点确定,最最让我不能忍受的是:

image

     哼!明天开会收拾你!

 

     学弟们如果看到这篇文章,千万别记恨我,或者到导师那边告我状,我还是很想正常毕业的啊…

转载于:https://www.cnblogs.com/buptzym/archive/2013/05/25/3099389.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/400592.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Kali 树莓派版学习笔记】安装系统和VNC服务

目录下载固件和烧录系统第一次开机SSH连接换源设置语言安装VNC平台:树莓派3B 版本: Linux kali 5.4.83-Re4son-v7 #1 SMP Sat May 15 03:22:58 UTC 2021 armv7l GNU/Linux 下载固件和烧录系统 Get Kali 格式化TF卡 使用Win32DiskImager刷入镜像 第…

第15章:模板匹配

第15章:模板匹配一、模板匹配基础:1. cv2.matchTemplate()函数:2. 匹配原理:3. 查找最值:二、多模版匹配:1. 获取匹配位置集合:2. 循环:3.调整坐标4.标记匹配图像的位置​ 模板匹配是…

第16章:霍夫变换

第16章:霍夫变换一、霍夫直线变换:1. 霍夫直线变换原理:2. HoughLines函数:3. HoughLinesP函数:2. 霍夫圆环变换:霍夫变换是一种在图像中寻找直线、圆形以及其他简单形状的方法。霍夫变换采用类似于投票的方…

一个java处理JSON格式数据的通用类(三)

/** *//** * 从json数组中解析出java Integer型对象数组 * param jsonString * return */ public static Double[] getDoubleArray4Json(String jsonString)...{ JSONArray jsonArray JSONArray.fromObject(jsonString); Doubl…

【树莓派学习笔记】九、C语言寄存器操作控制GPIO

目录CPU型号确定寄存器的地址问题GPIO寄存器GPFESLnGPSETnGPCLRn重要函数mmap函数munmap函数点灯程序平台:树莓派3B 版本: 2021-05-07-raspios-buster-armhf CPU型号确定 由 pinout命令可知,所用的板子Soc型号为BCM2837 寄存器的地址问题…

bzoj2527

首先环可以变成链来处理,对于l>r的情况就是修改区间[1,r],[l,mx]然后不难想到整体二分,二分答案k,然后算1~k场流星雨对国家的贡献然后判定将国家划分变成子问题解决,没什么难的终于不是tle,poi良心了一把 1 type wayrecord2 …

第17章:图像分割提取

第17章:图像分割提取一、用分水岭算法实现图像分割提取:1. 算法原理:2. 相关函数介绍:(1) 形态学函数回顾:(2) 距离变换函数distanceTransform:(3) 确定未知区域:(4) 函数connectedComponents对…

[转]可伸缩系统的架构经验

最近,阅读了Will Larson的文章Introduction to Architecting System for Scale,感觉很有价值。作者分享了他在Yahoo!与Digg收获的设计可伸缩系统的架构经验。在我过往的架构经验中,由于主要参与开发企业软件系统,这种面向企业内部…

【Linux技巧】cmake、make命令多线程编译,大大提高编译速度

目录获取最大可用线程数自动以最大线程数编译makecmake效果系统:Debian 获取最大可用线程数 nprocnproc命令可返回当前可用的最大线程数 树莓派3B (BCM2837):4 RK3399 Pro:6 自动以最大线程数编译 make sudo make -j $(nproc)cmake su…

redis学习(九)——数据持久化

一、概述 Redis的强大性能很大程度上都是因为所有数据都是存储在内存中的,然而当Redis重启后,所有存储在内存中的数据将会丢失,在很多情况下是无法容忍这样的事情的。所以,我们需要将内存中的数据持久化!典型的需要持久…

【机器视觉学习笔记】生成高斯滤波器掩膜(C++)

目录原理二维高斯分布生成高斯掩膜(小数形式)源码及效果平台:Windows 10 20H2 Visual Studio 2015 OpenCV 4.5.3 本文算法摘自高斯滤波(GaussianFilter)原理及C实现 —— 小武~~ 原理 高斯滤波和均值滤波一样,都是利用一个掩膜…

第18章:视频处理

第18章:视频处理一、VideoCapture类:1. VideoCapture类中相关方法介绍:(1) 初始化:(2) 初始化判断方法:(3) 捕获帧:(4) 释放:(5) 属性设置:(6) 捕获多摄像头(视频文件)数据&#xff…

C++的常量折叠(一)

前言 前几天女票问了我一个阿里的面试题,是有关C语言的const常量的,其实她一提出来我就知道考察的点了:肯定是const常量的内存不是分配在read-only的存储区的,const常量的内存分配区是很普通的栈或者全局区域。也就是说const常量只…

【机器视觉学习笔记】二值图像和灰度图像的膨胀、腐蚀、开运算、闭运算算法(C++)

目录二值图像原理腐蚀结构的原点设置在结构内部情况举例结构的原点设置在结构的外部情况举例膨胀结构的原点设置在结构的内部情况举例结构的原点设置在结构的外部情况举例开闭运算完整源码效果原图腐蚀运算膨胀运算开运算闭运算灰度图像原理腐蚀膨胀开闭运算完整源码效果原图腐…

【机器视觉学习笔记】二值图像连通区域提取算法(C++)

目录原理二值图像连通区域(Connected Component)连通区域分析(Connected Component Analysis,Connected Component Labeling)算法:Two-Pass(两遍扫描法)思路:Two-Pass算法的简单步骤…

【机器视觉学习笔记】Harris 角点检测算法(C++)

目录原理算法步骤优缺点源码效果原图输出平台:Windows 10 20H2 Visual Studio 2015 OpenCV 4.5.3 本文摘自2、Harris角点检测算法 —— 诺亚方舟369 原理 Harris算子是对Moravec算子的改进,包括: (1)Harris算子用…

剖析ASSERT函数

2019独角兽企业重金招聘Python工程师标准>>>  搜集与总结了assert函数的用法,记于此,以备后续与查找使用: ****身在Windows的世界,但还是深爱着我的它---Linux****I love Linux forever***** …

MSP430G2553 移植 Contiki RTOS 实时操作系统

目录新建工程移植过程关于时间多任务示例main.c内存使用情况效果平台:Code Composer Studio 10.4.0 MSP-EXP430G2 LaunchPad 试验板 MSP430G2553 LaunchPad™ Development Kit (MSP‑EXP430G2ET) contiki下载:contiki-os Github 本文参考自二、Contiki…

Raphael JS 矢量客户端开源框架

之前有基于svg进行矢量绘制,当时是自己写的一些js类库,最近项目中需要,对Raphael做了一些了解,总体不错。 Raphael可以对浏览器的兼容做的不错,基于IE的会自动使用vml进行绘制,其他浏览器基于svg进行绘制&a…

mac os x10.8下如何使用git与github

2019独角兽企业重金招聘Python工程师标准>>> 1、准备工作: 下载安装git客户端 http://code.google.com/p/git-osx-installer/downloads/list?can3(安装了git客户端,命令行中才有git命令) 注册github账号 https://github.com/ -->Pricing …