编程到底难在哪里?

最近接到需求,写一个运费计算器,逻辑上很简单,输入一件物品的重量和体积,根据价格表,自动计算出两者的价格,并取两者中的运费高的价格,这个价格需要用韩元和人民币来表示。(比如运一车棉花,输入棉花的体积和重量,自动计算出价格。运费可以按照体积算,也可以按照重量算,棉花密度低,体积大,重量轻,如果按照重量计费,运输公司得赔死),但代码量挺大, 小一千行。

运费计算器

这个需求,提出来当天,代码基本就在脑子里写完了。只是还没定设计图,也没定用什么语言,Java,python,C#都能写,需求说越快越好,那我就用C#写了,至于原因,一是因为业务人员的操作系统都是Windows,C#是微软亲儿子;二是因为Visual Studio是宇宙第一IDE,写起来最舒服。三是因为C#的语法最优雅,写C#,跟写诗一样,没事还能押个韵。

开发周期,一共用了三天,第一天了解业务,第二天写完代码,发布上线,第三天,写产品文档。

写的时候,觉得没什么好讲的,但是复盘时,发现这个程序还是很经典,就像一条线,能串起很多孤立而基础的知识点,非常适合作为编程的入门训练,我来讲讲实现思路。并且提出一些问题,下面的问题可以想一下,这些在这个简单的程序里,就可以找到问题的答案。

①如何让计算器一直运行,而不是每计算一次,就重启一次程序?

②一个程序里,如果有几百个变量和上百行的if else语句,怎么写?一行行复制粘贴吗?

③如果用户没有输入,而是直接按回车怎么办?如果用户输入的是负数,不是正数怎么办?如果用户输入的是字母,而不是数字,怎么办?

④面向对象有三大特性,封装、继承、多态。封装的意义,到底是什么?那么封装的应用场景在哪里?

⑤当实际需求与教科书的话产生冲突,怎么办?

⑥编程,学什么?怎么学?如何学?写代码,最重要的,是什么?

⑦提高代码的最佳方式,究竟是什么?

一、 计算器的实现思路

运费计算器-代码结构

交互界面-代码架构

价格计算的逻辑代码

根据重量寻找价格

两数比较,返回大值

二、代码的细节

①如何让计算器一直运行,而不是每计算一次,就重启一次程序?

while循环最常见的用法,只要条件为真,循环体的语句就一会一直执行。

②一个程序里,如果有几百个变量和上百行的if else语句,怎么写?一行行复制粘贴吗?

为什么这里有大量的if else if?如何写这么多行的else if

首先,一定会有很多人,觉得这里用大量的else if 太土了,想用表驱动或是策略模式来消除这些if else语句。

没必要。

从业务的角度出发,这里的逻辑,很清晰;变量名,很易懂;计重区间不会变,硬编码,写死;价格会变,用变量保存。这样一旦价格发生变动,可以快速定位,维护价格。从开发的角度讲,这样写比较快。

第二,快速写if else。

CV大法,复制粘贴,可以,再手动改值,但是太慢了。

先观察,条件语句中,大部分内容都是一样,只有条件与变量名需要变动,而且规律性极强。

再动手,把语句理解为普通的文本,写个辅助方法,用for循环,生成拼接字符串就可以了。

观察与动手-寻找共性与特性

枚举类的变量,亦如是。

观察与动手-寻找共性与特性

③如果用户没有输入,而是直接按回车怎么办?如果用户输入的是负数和0,不是正数怎么办?如果用户输入的是字母,而不是数字,怎么办?

这里,就需要对用户的输入做一步预处理和判断。直接按回车,这里要判空。输入非正数,也要做一层判断。如果输入带字母,要用正则表达式做判断。只要条件不满足,就返回,重新执行。我这里,特地少写了正则,因为要演示try catch。用try catch 把代码包裹起来,可以提高代码的健壮性,这样哪怕程序出现异常,输入了字母,程序也不会崩溃。

判空

过滤非正数

try-catch

面向对象有三大特性,封装、继承、多态。封装的意义,到底是什么?封装的应用场景在哪里?

在这个程序里,很明显了,封装的作用,就是为了隐藏细节。对于调用者来说,只需要传入体积和重量,其他的都不用管。对于开发者来说,封装可以提高维护性和可复用性,当价格更新时,只需要对改动的进行更新,数据的改动,不会影响业务代码的运行。当另外一条线路也需要计算价格时,也不需要再写一个新程序,如果逻辑不变,仅仅改动参数就可以了。

⑤当实际需求与教科书的话产生冲突,怎么办?

以实际需求和业务场景为准。

在一些古老的教科书里,都提到了函数的单一原则。即为了保证函数出口的统一,一个函数只能有一个return。但在实际的开发里,为了函数的可读性和执行效率,我们会选择“早早返回,多多返回”。即在函数的开头,就返回不满足条件的输入。

尽早return

⑥编程,学什么?怎么学?如何学?写代码,最重要的,是什么?

编程学的是思路,解决问题的思路,实现目的的思路,学习如何利用脑袋里的知识和手上的工具,去解决现实生活中的实际问题。

多动手,多实践,遇到不懂的地方,多查、多问,对自己写的每一行代码。都要刨根问题,为什么这么写?

如果有条件,可以找个人一对一教,手把手教,可以带你一步一步,捋思路,及时反馈的效果,最好!

关于写代码,什么最重要?有人认为效率最重要,执行的越快越好;有人认为代码的健壮性最重要,遇到一些问题,程序也能跑。个人拙见,这些都是次要的,写代码最重要的,是代码的可读性,你写的代码,可以见名知意,哪怕没有没学过编程的人,也能读懂你的代码。

客户不会编程,提需求时往往不会很明确,不会面面俱到,不知道痛点在哪里。如果说作家的工作,是言人之所欲言,言之所不敢言;那作为开发,得想人之所欲想,想人之所不敢想,一步步帮客户捋清逻辑,帮客户发现爽点,解决痛点。后续的维护人员,不一定是程序猿,也有可能就是没写过代码的业务人员。

⑦提高代码的最佳方式,究竟是什么?

重构。

提高代码的质量。我个人认为,最重要的方法,就是重构。一步步优化,一步步解耦,一步步触碰到自己知识的边界和盲区。多看看优秀的开源代码。不夸张的讲,刚学编程时,我就像小学生改作文一样,改自己的代码,从改变量名,到改代码逻辑,从更易懂,到更高效。否定之否定,在曲折的道路上,螺旋上升。

就拿我写的这段代码来说,现在实现功能了,但有没有可以提升的地方?

有,而且太多了。

不过业务急着用,先打包发布,装个.net6.0运行时,先跑起来,先用着,后续再慢慢优化。

在重构代码的过程中,非常锻炼逻辑思维能力,别人没想到的,你得想到;你想不到的,在请不到测试前,自己多写测试用例,打上断点,一步步试。在开发团队中,Code Review,也是必不可少的环节,不仅能找bug,多听听别人意见,自己的思路会更开阔。

我写代码时,一句话也不想说,满脑子都在想问题,导致刚工作时,大家都觉得我很内向。但其实相反,在不写代码的时候,我很能讲话,特别喜欢交流,每次交流完,总能从别人那学到东西。

三、为什么没用Python?

代码交付给业务后,才发现业务人员也会编程,虽是文科生,但上学时学了200多个小时的python,考了几次计算机二级,科目是python程序语言设计,没过,后续就没有继续学python,但掌握python基本的数据结构和基本语法。说到这,其实也有些惭愧,我们学校算学分,计算机专业的学生考计算机二级,没有学分,就像英语专业的学生考四六级没有学分一样。我就没报,因为我考四六级给学分,反倒拿出了这两张证。

考试考的,和实际开发,往往存在着很大差距。考试没过,并不代表编程能力不行。

这也是学习编程的难点,书本上的知识点,往往是孤立的。知识,只有在真实的项目里,才能串起来。就拿着个计算器来说,真的很简单了,但能串起While循环和for循环的用法,if的使用场景,快速生成多行if条件语句,要明确输入输出的原因,使用三元表达式简化if else条件。面向对象的封装,让写程序变得像搭积木。写完程序后,又该如何打包发布,让这个程序在别人的电脑上也跑起来。

至于没用Python,并不是Python没用。还是看需求,我也用Python帮助业务实现办公自动化,试着写出最佳实践。

当时这个需求,也想过用Python写的,毕竟写起来很快,学的人也多。Python作为动态语言,简单却强大,写起来极其灵活。虽然Python写起来很爽,但涉及到很多计算和数据类型之间的转换时,静态语言的在初始化变量前必须声明类型的特性,会给我一些安全感,出错的时候,会更好排查。

这篇文章里,用的最多词,是一步步,step by step,我想,这就是编程学习的关键吧。


  • 22
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值