@程序员,代码清理有必要吗?

640?wx_fmt=gif

【CSDN编者按】日常编程工作中,程序员经常面临各种代码bug。但是是否所有项目都适合清理重构?bug修复的手段又是否合理?本文的作者以原型设计、新项目、紧急bug修复、新功能开发、项目维护等各阶段为例,分别给出了相应的解决方法,希望能对你有所帮助。

640?wx_fmt=jpeg

以下为译文:

你的项目截止时间就要到了,你有一个紧急的 bug 需要修复,你的项目需要快速迭代输出产品。

虽然你很忙,但是你也必须考虑你的未来:你现在引入的每一个 bug,都会给以后修复带来巨大的时间成本。因此我们不应该使用过时的API、过时的版本依赖、或者一些老旧的做事方法。

所以,我们什么时候来清理我们的代码呢?

  • 现在就做?

  • 以后需求少了再做?

  • 还是永远不做?

本文,我将告诉你该在什么时间去用以下三种方法来清理你的代码:

  • 更新项目依赖和废弃的API;

  • 重构不合适的抽象设计;

  • 编码规范和日常编程习惯等杂项清理。


640?wx_fmt=png

解决方法


原型设计

在工程构建之前,你会做一些技术调研,做一些原型设计(或者极限编程中的Spike解决方案),但你不会长期保留使用这些代码,你仅仅是使用这些代码来验证是否能解决问题。考虑到你有可能会废弃掉这些代码,更新和规范没有什么需要值得特别注意的事项。如果你也想尝试理解学习那些已经存在的API,你也不需要对代码进行重构。

但是,如果你是想通过原型设计找到更好的抽象方式,你就必须进行大量的重构了。

最佳实践:

  • 更新:不需要处理;

  • 重构:如果你需要找到更好的架构方式,你就需要重构,反之,你就不用在意重构的问题;

  • 杂项清理:不需要处理。

新项目

如果你正在着手搭建一个全新的项目,你的任何一个决定都会给以后带来很大的维护成本。

当然,这也是一个机会,让你可以使用最新的框架,最佳的解决方案,最好的编程规范和最好的架构。虽然你不一定能做到完美,但是你可以使它尽可能的接近完美。

最佳实践:

  • 更新:从现在开始;

  • 重构:从现在开始;

  • 杂项清理:从现在开始。

紧急的bug修复

在这个时候,你需要快速为用户修改 bug。如果你看到了问题需要解决,但是这个问题和当前需要修复的bug无关,我建议你暂时不要动它,等 bug 修复结束了再来处理它。

有些时候,bugfix 有两层含义: 一次是快速解决问题,另一次是你需要让代码更整洁。

最佳实践:

  • 更新:稍后;

  • 重构:稍后;

  • 杂项清理:稍后。

新功能开发中或者不紧急的bug修复

当你有一个正常迭代开发的一个项目,不管你是在做新功能开发,还是bug修复,这个时间是你做代码清理的最佳时机。

在这个时候,你并不需要修复所有你接触到的代码,你需要做的是整理你处理中的代码,并且使你的代码库更加的整洁。详情参考https://ronjeffries.com/xprog/articles/refactoring-not-on-the-backlog/。

最佳实践:

  • 更新:立即更新你用到的代码;

  • 重构:立即重构你用到的代码;

  • 杂项清理: 在你用到的代码中,立即使用新的代码规范等。

项目维护阶段

当你的项目已经开发完成,没有什么新的开发任务的时候,经常几个月才有一些给菜单多加一个选项等这种小的需求修改。

现阶段,你的目标是做少量的修改,让项目稳定运行。重构和杂项清理在现阶段是不必要的,但是你项目需要你及时更新一些框架库的依赖 —— 某些框架库不在提供服务,或者有安全更新。经常更新依赖显然要比5年才更新一次容易得多。

所以不管你是不是因为有bug要修复,你都应该及时的去更新你的依赖项 —— 理想情况下,长期发布更新,以减少对API使用的更新需求。

最佳实践:

  • 更新:现在更新,并且长期发布版本支持;

  • 重构:不需要;

  • 杂项清理: 不需要。


640?wx_fmt=png

现在与未来的平衡


软件开发是一个持续的过程,不是做完就没事了。现在着手去清理代码,将会为你以后节省时间,尽管你现在赶项目的截止时间,现在着手去做也比放在以后多花几周时间去做要好。

本文只是做一个开篇,与任何其它方法一样,也都有不适用的时候,所以,你需要根据你项目中的实际情况和目标来做一些调整。

原文: https://codewithoutrules.com/2018/11/02/when-clean-up-your-code/

译者:罗昭成

责编:郭芮


推荐阅读:

640?wx_fmt=gif

640?wx_fmt=gif

展开阅读全文

初始化有必要吗

11-22

描述:rn 程序的初始化的代码TForm1.FormClick()在程序运行时没有体现原本的功能。即把初始化代码注释后,程序的功能没有任何变化。rn问:初始化有必要吗?rn源代码如下:rnDFM代码附后:rnunit textf;rnrninterfacernrnusesrn Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,rn Menus, StdCtrls;rnrntypern TForm1 = class(TForm)rn MainMenu1: TMainMenu;rn OpenDialog1: TOpenDialog;rn SaveDialog1: TSaveDialog;rn Memo1: TMemo;rn File1: TMenuItem;rn Edit1: TMenuItem;rn Style1: TMenuItem;rn New1: TMenuItem;rn Open1: TMenuItem;rn Save1: TMenuItem;rn Exit1: TMenuItem;rn Cut1: TMenuItem;rn Copy1: TMenuItem;rn Paste1: TMenuItem;rn Delete1: TMenuItem;rn SelectAll1: TMenuItem;rn Left1: TMenuItem;rn Center1: TMenuItem;rn Right1: TMenuItem;rn Bold1: TMenuItem;rn Italic1: TMenuItem;rn Underline1: TMenuItem;rn procedure FormClick(Sender: TObject);rn procedure New1Click(Sender: TObject);rn procedure Open1Click(Sender: TObject);rn privatern Private declarations rn publicrn Public declarations rn end;rnrnvarrn Form1: TForm1;rnrnimplementationrnrn$R *.DFMrnrnprocedure TForm1.FormClick(Sender: TObject);rnbeginrn form1.Memo1.Clear;rn //清空文本框rn form1.OpenDialog1.InitialDir:='e:\paul';rn form1.SaveDialog1.InitialDir:='e:\paul';rn //初始化打开和保存的目录rn form1.OpenDialog1.Filter:='Word File(*.doc)|*.doc';rn // form1.SaveDialog1.Filter:='Word File(*.doc)|*.doc';rn //初始化打开和保存的类型rnend;rnrnprocedure TForm1.New1Click(Sender: TObject);rnbeginrn form1.Memo1.Clear;rn //清空rnend;rnrnprocedure TForm1.Open1Click(Sender: TObject);rnbeginrn form1.OpenDialog1.Execute;rn form1.Memo1.Lines.LoadFromFile(form1.OpenDialog1.FileName);rnend;rnrnend.rn***********************************************************************************************rnDFM代码rnobject Form1: TForm1rn Left = 251rn Top = 118rn Width = 696rn Height = 480rn Caption = 'Form1'rn Color = clBtnFacern Font.Charset = DEFAULT_CHARSETrn Font.Color = clWindowTextrn Font.Height = -13rn Font.Name = 'MS Sans Serif'rn Font.Style = []rn Menu = MainMenu1rn OldCreateOrder = Falsern OnClick = FormClickrn PixelsPerInch = 120rn TextHeight = 16rn object Memo1: TMemorn Left = 16rn Top = 56rn Width = 657rn Height = 377rn Lines.Strings = (rn 'Memo1')rn TabOrder = 0rn endrn object MainMenu1: TMainMenurn Left = 376rn Top = 16rn object File1: TMenuItemrn Caption = 'File'rn object New1: TMenuItemrn Caption = 'New'rn OnClick = New1Clickrn endrn object Open1: TMenuItemrn Caption = 'Open'rn OnClick = Open1Clickrn endrn object Save1: TMenuItemrn Caption = 'Save'rn endrn object Exit1: TMenuItemrn Caption = 'Exit'rn endrn endrn object Edit1: TMenuItemrn Caption = 'Edit'rn object Cut1: TMenuItemrn Caption = 'Cut'rn endrn object Copy1: TMenuItemrn Caption = 'Copy'rn endrn object Paste1: TMenuItemrn Caption = 'Paste'rn endrn object Delete1: TMenuItemrn Caption = 'Delete'rn endrn object SelectAll1: TMenuItemrn Caption = 'Select All'rn endrn endrn object Style1: TMenuItemrn Caption = 'Style'rn object Left1: TMenuItemrn Caption = 'Left'rn endrn object Center1: TMenuItemrn Caption = 'Center'rn endrn object Right1: TMenuItemrn Caption = 'Right'rn endrn object Right2: TMenuItemrn Caption = '-'rn endrn object Bold1: TMenuItemrn Caption = 'Bold'rn endrn object Italic1: TMenuItemrn Caption = 'Italic'rn endrn object Underline1: TMenuItemrn Caption = 'Underline'rn endrn endrn endrn object OpenDialog1: TOpenDialogrn Left = 168rn Top = 8rn endrn object SaveDialog1: TSaveDialogrn Left = 248rn Top = 16rn endrnend 论坛

设置CLASSPATH环境变量真的有必要吗

04-24

看到很多介绍Java运行环境的文章,都说到ClassPath环境变量的设置。而且每每遇到如java.lang.NoClassDefFoundError的错误,一般也都归结为ClassPath环境变量没有设置正确。不巧,今天我也遇到了同样的问题。rnrn我需要运行某个程序,需要Java3D的支持。然而当我把Java3D SDK安装完成之后,出现了java.lang.NoClassDefFoundError错误。那么,我应该在哪里设置ClassPath呢?通过Google搜索,我按照很多人的经验设置ClassPath环境变量了,问题没有解决!rnrn而且,还有一个困扰的问题是我的系统里有很多个Java库,Runtime一个,SDK一个,还有JBuilder也带了一个。绝望之余,我甚至把Java3D往每一个地方都安装了一次,一切依然无用!最后,我的解决办法是把Path的路径修改!把Jre\Bin改为\Jre\Bin,也就是统一使用SDK附带的数据!问题随之解决了,虽然有点莫名其妙。rnrn现在,我已经把ClassPath,Java_Home等环境变量都去掉了!程序依然能够很好的运行!rnrn由此得出结论,除了Path路径,其他的Java环境变量都是无用的!另外,我在Sun的文档里也没有看到ClassPath的设置说明,在《Core Java2 Volume2 Fundamentals》一书中也没有提及!或许,这些变量仅仅是以前版本的遗留?rnrn另外一个疑问,Java对公共包的管理似乎有点随意。虽然可以避免"DLL HELL",但随之而来的是数据冗余,经常可以看到一些开放源码的包被很多应用程序附带。rnrn对于Java我是菜鸟,不当之处,请高手指正。rnrnrn运行环境:Win2K+Java2 1.4rnrnrnrn 论坛

阴影算法alpha/1有必要吗???

01-31

[code=c]rnrn void DrawShadow(CDC* pDC,CRect rect)rnrn COLORREF oldcolor = RGB(255,255,255);rn BYTE newValR,newValG,newValB;rn BYTE AlphaArray[] = 140,170,212,240;rn BYTE AlphaArray2[] = 170,205,220,240,240,250,255;rnrn int i,j;rn for(j=0;j<4;j++)rn rn for(i=6;i<=rect.right - 5;i++)rn rn oldcolor = pDC -> GetPixel(i,rect.bottom - (4 - j));rn newValR = GetRValue(oldcolor) * AlphaArray[j] / 255;rn newValG = GetGValue(oldcolor) * AlphaArray[j] / 255;rn newValB = GetBValue(oldcolor) * AlphaArray[j] / 255;rn pDC->SetPixel(i,rect.bottom - (4 - j),RGB(newValR,newValG,newValB));rn rn rnrn for(i = 0;i<4;i++)rn rn for(j=6;j<= rect.bottom - 5;j++)rn rn oldcolor = pDC ->GetPixel(rect.right - (4 - i),j);rn newValR = GetRValue(oldcolor) * AlphaArray[i] / 255;rn newValG = GetGValue(oldcolor) * AlphaArray[i] / 255;rn newValB = GetBValue(oldcolor) * AlphaArray[i] / 255;rn pDC -> SetPixel(rect.right - (4-i),j,RGB(newValR,newValG,newValB));rn rn rnrn for(i=0 ; i<4 ;i++)rn rn for(j=0;j<4;j++)rn rn if((i+j) > 6)rn break;rn BYTE alpha = AlphaArray2[i + j];rn oldcolor = pDC ->GetPixel(rect.right - 4 + i,rect.bottom - 4 + j);rn newValR = GetRValue(oldcolor) * alpha/1;rn newValG = GetGValue(oldcolor) * alpha/1;rn newValB = GetBValue(oldcolor) * alpha/1;rn pDC ->SetPixel(rect.right - 4+i,rect.bottom - 4+j,RGB(newValR,newValG,newValB));rnrn oldcolor = pDC->GetPixel(rect.right-4+i,rect.top+5-j);rn newValR = GetRValue(oldcolor) * alpha/1;rn newValG = GetGValue(oldcolor) * alpha/1;rn newValB = GetBValue(oldcolor) * alpha/1;rn pDC -> SetPixel(rect.right-4+i,rect.top+5-j,RGB(newValR,newValG,newValB));rnrn oldcolor = pDC->GetPixel(rect.left - i+5,rect.bottom-4 +j);rn newValR = GetRValue(oldcolor) * alpha/1;rn newValG = GetGValue(oldcolor) * alpha/1;rn newValB = GetBValue(oldcolor) * alpha/1;rn pDC -> SetPixel(rect.left - i+5,rect.bottom - 4+j,RGB(newValR,newValG,newValB));rn rn rnrn[/code] 论坛

没有更多推荐了,返回首页