同样是写代码,你和大神究竟差在哪里?
很多程序员都有这么一个梦想——自己写的代码,可以像诗一样优美;自己做的设计,能恰到好处,既不过度,也无不足。
这种带有一点洁癖的完美主义就像一把达摩克利斯之剑,仿佛时刻在提醒着:不能将就、不能妥协。完美主义的代价是会在很长时间里持续的迷茫和焦虑。
每每看到这些像面条一样缠绕在一起代码,都会令人感到气愤、懊恼和羞愧。
怎么办?一边是无止尽的业务需求,一边是补丁加补丁的业务代码,开发人员被夹在中间像一只困兽,向左走,还是向右走?方向在哪里?不明白为什么花了那么多时间来学习技术,可还是写不好代码;为什么花了这么多时间加班,还是应对不了复杂度。
代码精进之路
就像Robert C. Martin说的:“不管你们有多敬业,加多少班,在面对烂系统时,你任然会寸步难行,因为你大部分的精力不是在开发需求,而是在应对混乱。”
其实,造成软件复杂性的罪魁祸首主要来自以下因素:
● 软件的本质复杂性——《人月神话》的作者Fred Brooks曾说:“软件的复杂性是一个基本特征,而不是偶然如此”。因为问题域有其复杂性,而软件在实现过程中又有很大的灵活性和抽象性,导致软件具有天然的复杂属性。
中间变量
我们可以通过添加中间变量让代码变得更加自明,即将计算过程打散成多个步骤,并用有意义的变量名来命名中间变量,从而把隐藏的计算过程以显性化的方式表达出来。
例如,我们要通过Regex来获得字符串中的值,并放到map中。
用中间变量,可以写成如下形式:
中间变量的这种简单用法,显性地表达了第一个匹配组是key,第二个匹配组是value。只要把计算过程打散成一系列良好命名的中间值,不透明的语义自然会变得透明。
领域驱动
领域驱动设计关心的是业务中的领域划分(战略设计)和领域建模(战术设计),其开发过程不再以数据模型为起点,而是以领域模型为出发点,研发过程如下图所示。领域模型对应的是业务实体,在程序中主要表现为类、聚合根和值对象,它更加关注业务语义的显性化表达,而不是数据的存储和数据之间的关系。这是“领域驱动设计”和“数据驱动设计”之间显著的区别。
仍以上面的CRM为例。假如我们先不考虑数据模型,而是采用面向对象分析(Object Oriented Analysis,OOA)对这个场景进行领域建模,那么可以得到下图所示的领域模型。
可以看到,领域模型的描述更加贴近业务,一些重要的业务术语和概念没有丢失,更完整地表达了业务语义。即使是产品经理或者业务人员,也不难看懂这样的领域模型,甚至他们可以和技术人员一起参与到梳理领域模型和创建活动中来。
通过DDD的战略设计和战术设计,我们可以为问题域划分出合适的子域,并对域中的业务进行建模。下图是我们在实际工作中为CRM进行的领域战略设计。
资深大牛,良心创作
这是一本为专业程序员而写的书,写好代码、追求卓越和工匠精神是每个程序员都应该具备的优秀品质。
扫描下方二维码
进入码书购买
本书简介,提纲挈领
👇下滑看目录:
-END-
福利
参与方式:本文留言参与话题【分享一下迄今为止,你们遇到或者看到的最难搞的代码的经历】即可有机会获得本文书籍一本,2个名额哦
抽奖时间:1月8日14:00
加入码书秒杀群
加入码书秒杀群,秒杀书籍、电子产品等,价格低到亏本,入群名额有限,满100人就不加了哦,群有时效性,秒杀活动结束即解散!
- Java那位大神帮我看看代码哪里出错了?
- HDU Today(自己的代码不知道哪里错了一直没A抄袭大神的)
- 代码干货|小白一夜变身前端大神,究竟经历了什么
- CCF-201812-2-小明放学 JAVA代码20分求大神看看哪里错了
- Java 报了个空指针,但是我不明白是哪里出问题,新手,请大神look look
- 我们的差距究竟在哪里
- 多线程的代码究竟怎么写
- 看大神是如何使用jstack跟踪异常代码
- 又一个java大神(提高篇,有代码)
- “菜鸟”程序员和“大神”程序员差距在哪里
- 库克究竟与乔布斯差在哪里?
- “菜鸟”程序员和“大神”程序员差距在哪里
- 怎么使用Java对象序列化获得本地C/C++代码同样的性能?
- Stringstr=new String("abc") 这行代码究竟创建了几个对象?
- 林大神代码
- 求大神们解答同样的Springboot项目同样的代码同事的电脑可以正常运行,我的电脑挂在SqlSession事务创建失败
- 求大神看看这个代码的问题,明明打的一样,为什么就是不行
- 有没有大神能够逐行解释一下代码?Delphi
- [置顶] 用IDEA写代码究竟有多爽
- 我们的网站压力究竟在哪里