专家解析如何有效的简化你的软件开发

开发 项目管理
在工作中经常能找到软件设计复杂的地方。对于这样情况的原因多种多样,但是可以集中几点主要的原因:不恰当的使用设计样式,“not invented here”综合症,以及当雪弗莱(Chevy)做这个工作的时候却构建了一个卡迪拉克(Cadillac)。你可以通过很多种方法来解决这些问题。所有这些只需要重新思考一下如何构建你的软件。本文提供了关于怎样简化你的软件开发过程的指导。

当设计一个问题的解决方案的时候,你应该努力让所有的事情尽可能的变得灵活。但是,太灵活会导致难以理解的代码出现。相反,考虑编写一个类,它可以用最简单的方法(Chevy方法)来解决问题。让你的类可以通过其他类的继承而得到扩展。让你的方法虚拟化,所以你或是其他人在重新使用你的部分代码之后还可以返回,然后添加额外的灵活性和复杂性,如果有必要的话(Cadillac)。毕竟,这是OPP所涉及的——扩大并覆盖未来所出现的新需求的能力。尝试编写最少的代码来完成工作。不多不少,刚刚合适。

当设计你的类的时候,对类本身,方法和属性使用描述性好的名字。一个类通过定义,而且本身有很好的描述,使用起来也非常简单。尽量避免行话和缩写。使用完整的,长的单词让方法或是属性呈现得清晰明确。

在有些不好理解的代码上添加注解。但是,如果注解的行数比代码本身还要多,你就要想一想怎样让你的方法变得简单一些。

设计样式

是的,有很多种设计样式。这些样式本身就是很好的工具。但是,你会发现很多的执行非常复杂;大多数情况下它们是有过度的杀伤威力。你需要试着找到刚好为你需要的解决方案所工作的一些东西。不要尝试创建那些现在不存在而且也不会发生的问题的解决方案。最好是采用极简单的方法,使用一个基本的设计样式,而且找到一种产品而不是花很多时间去试图完成一个样式,最后,对解决当前的业务问题也是毫无意义。

不要再去发明轮子

对于编程者最好的事情就是他们喜欢编程。最坏的事情也是他们喜欢编程。编程有很多乐趣;那么我们为什么要做这个工作呢?但是,不要忽略这个事实就是你的工作是来支持你所工作的行业的。你真正的工作是创建应用程序来为你的公司赚钱。如果那意思就是说你需要重新使用别人的代码,那就这样做。不要有“not invented here”综合症。如果你这样做了,你就不是在为你的公司做事情了。

商业应用程序编程者没有理由去重塑每个解决方案。一个业务编程者的首要任务就是来支持业务。你的工作不只是有很有趣的编程过程。不过那样也很好,但是如果你所工作的公司需要程序来赚钱,你的工作就是越快越有效的完成程序。如果你不这样做,你的公司就会因为缺少软件而失去生意,那么你也会发现你要重新找工作了!

紧密围绕Microsoft

不要误解我的意思。我是真的喜欢Microsoft,而且喜欢使用他们的工具。但是,当你选择使用一个新技术的时候,你需要小心,因为你的决定会导致代码在未来可能不会工作。考虑一下在.NET 1.x和2.0之间发生了什么事情。很多Microsoft建议你使用的事情都没有了。过去这样的事情我看到过好多。看一看在过去15年里他们有多少让我们使用的数据访问技术啊!

在我的研讨小组中,我总是告诉人们"put a wrapper around Microsoft."。就是说不要直接去调用他们的技术,你可以为LINQ to SQL, LINQ to XML, Entity Framework ,ConfigurationManager和其他的技术构建wrapper类,并且从你的自定义类和方法中调用它们的功能。围绕这些技术意思是当Microsoft决定改变它的技术的时候,你只需在一个地方改变代码就可以了。它确保你可以保证其他的应用程序代码都一致——只不过就是使用了一种不同的技术。

团队编程

我很喜欢code review和团队编程。如果我没有在一两分钟之内给别人解释好我的代码,那说明我的代码太复杂了。每天,你都和你的同伴一起检查你的代码以确保它们不是太复杂。如果你是自己一个人工作,你就去抓一个朋友,你的伴侣或是你的狗,把代码解释给他们听。

由于我教很多的研讨小组成员并且撰写了很多文章和书籍,我知道我的代码总是成为一个显微镜。我很努力的让我的代码对大范围的编程者来说要易读并且易懂。如果一个初学者可以理解我的变量的名字,方法的名字和我的逻辑,我想一个有经验的编程者就更能懂了。你也要想一想你的代码可以帮助你编写更简单,易懂的代码。

“正确”设计

如果你看一看这两段代码。你会立即区分出哪个是初学者编写的代码,哪个是有经验的编程者编写的代码。初学者会有设计不足的代码。但是,一个有经验的编程者可能会有过度设计的代码。当一个人没有在解决问题上有足够想法的时候,设计不足的代码就会产生。

考虑Listing 1中的代码,检查是否有文件存在。你可以看到这个显然没有将足够的想法融入重用此代码中,没有异常处理。现在,如果你看到由一个编程者过度设计的代码来解决同样的问题,你可以使用Listing 2中的方法。

  1. .NET languages   
  2. Listing 1. Under-Engineering:  
  3. Inexperienced programmers may not put enough thought into the code's intended use and exception handling.  
  4. // C# implementation  
  5. private bool FileExists()  
  6. {  
  7. if (System.IO.File.Exists(@"C:\MyFile.txt"))  
  8. return true;  
  9. else  
  10. return false;  
  11. }  
  12. ' VB.NET implementation  
  13. Private Function FileExists() As Boolean  
  14. If System.IO.File.Exists("C:\MyFile.txt" Then  
  15. Return True  
  16. Else  
  17. Return False  
  18. End If  
  19. End Function  
  20. .NET languages  
  21. Listing 2. Over-Engineering:  
  22. While this method may handle every conceivable error, it's overkill for the business problem at hand.  
  23. // C# implementation  
  24. private bool FileExists(string fileName)  
  25. {  
  26. System.Diagnostics.Debug.Assert(  
  27. string.IsNullOrEmpty(fileName),  
  28. "The 'fileName' parameter must be passed " +  
  29. "into the FileExists method");  
  30. try {  
  31. return (System.IO.File.Exists(fileName));  
  32. }  
  33. catch (System.IO.DirectoryNotFoundException ex) {  
  34. throw new Exception("The directory from the file name: " +  
  35. fileName + " does not exist.", ex);  
  36. }  
  37. catch (System.IO.DriveNotFoundException ex) {  
  38. throw new Exception("The drive from the file name: " +  
  39. fileName + " does not exist.", ex);  
  40. }  
  41. catch (System.IO.PathTooLongException ex) {  
  42. throw new Exception("The path from the file name: " +  
  43. fileName + " is too long.", ex);  
  44. }  
  45. catch (Exception ex) {  
  46. throw new Exception("The file: " + fileName +  
  47. " was checked to see it is exists, but some unknown " +  
  48. "problem occurred when calling the File.Exists method", ex);  
  49. }  
  50. }  
  51. ' VB.NET implementation  
  52. Private Function FileExists(ByVal fileName As String) As Boolean  
  53. System.Diagnostics.Debug.Assert( _  
  54. String.IsNullOrEmpty(fileName), _  
  55. "The fileName parameter must be passed into " & _  
  56. "the DoesFileExist method")  
  57. Try  
  58. Return (System.IO.File.Exists(fileName))  
  59. Catch ex As System.IO.DirectoryNotFoundException  
  60. Throw New Exception("The directory from the file name: " + _  
  61. fileName + " does not exist.", ex)  
  62. Catch ex As System.IO.DriveNotFoundException  
  63. Throw New Exception("The drive from the file name: " + _  
  64. fileName + " does not exist.", ex)  
  65. Catch ex As System.IO.PathTooLongException  
  66. Throw New Exception("The path from the file name: " + _  
  67. fileName + " is too long.", ex)  
  68. Catch ex As Exception  
  69. Throw New Exception("The file: " + fileName + _  
  70. " was checked to see it is exists, but some unknown " & _  
  71. "problem occurred when calling the File.Exists method", ex)  
  72. End Try  
  73. End Function 

是的,在Listing 2中的代码是非常好的,而且通过尝试检查文件是否存在而解决了所有可能发生的问题,但是这个代码就是要解决业务问题的代码吗?是有可能的,这个代码只用简单的一个单一的catch块,其中包括文件名和从.NET返回的错误信息,这已经足够了。有些人花费大量时间来创建这个过度设计的方法并且还要测试它。有那些时间可以更好的用在解决业务问题的上面。

拥有强大,灵活而且可以再度使用的软件是一个伟大的目标。但是,如果你不能交付一个产品来帮助你的业务,那么这个目标是无法实现的。开始研发你所需要的软件吧。让你的代码可以扩展以适应未来的需要。使用简单的设计样式,编写你的代码,如果你要把它展示给一个大集团的同行们。如果你遵循这些技术,你会发现你的代码是简单的而且是“正确”的设计。

【编辑推荐】

  1. 高手Java核心技术学习笔记
  2. 开发人员最欠缺哪些测试知识?
  3. Java程序开发中代理技术的使用方法
  4. 软件开发中的模式和框架概念浅析
  5. JAVA环境变量的设置
责任编辑:彭凡 来源: IT专家网
相关推荐

2019-07-30 08:00:00

机器学习AI软件开发

2022-03-09 10:18:48

UnixC语言软件

2021-08-31 08:00:00

开发软件框架

2022-08-07 23:41:42

工具GitHub开发

2023-08-01 15:24:18

DevOps自动化软件开发

2009-08-12 18:39:01

软件开发的生命周期

2020-12-18 08:10:02

软件开发C++技术

2020-12-03 15:54:15

软件开发工具

2009-02-10 17:11:53

SaaSSaaS开发PaaS

2015-03-02 09:35:07

软件开发

2011-06-13 10:28:45

JAVA

2017-04-12 09:24:45

开发编程Java

2017-05-18 16:13:43

软件开发软件开发

2022-03-14 22:54:57

软件开发性能

2011-08-31 10:04:22

日本软件开发

2023-02-09 16:48:12

软件开发测试结对测试

2022-07-19 16:31:29

软件开发Kubernetes容器

2015-07-02 10:06:27

软件开发软件工程

2021-12-13 10:50:24

软件开发 技术

2021-05-11 10:12:06

CIO软件开发首席信息官
点赞
收藏

51CTO技术栈公众号