相比于寒假里几乎每天都在疯狂学习开发debug,开学之后着实放松了不少。刚开始还会顺手改一改博客,后来样式也差不多改到了一个段落了,一时间竟有点无所事事。所以开学的前两周做得最多的事就是快乐刷b站和微博吃瓜。时间来到三月,每天玩耍的愧疚感实在是顶不住,于是重新以「学习平台」的方式打开b站。一周过去了,收获不少。
在选择要学什么的时候,其实我是没什么方向的,只是想着不要无所事事就好了。偶然想到上学期末看到舍友在用C#做调试串口的GUI,还说超简单的(福福老师也ddw),那就决定是你了,C#!遂以开发桌面GUI为目标从零开始学C#。安装.NET,打开教程,运行测试,一气呵成!语言都是相通的,怎么说我也草草用过三四种语言,最简单的赋值条件循环这些,全都可以光速过。半天下来进度飞快,但总觉得没新学到什么,因为绝大多数我都在其他语言里用到了。到了第二天开始看类,这才开始打起精神认真理解。
类和对象的概念在我接触过的语言里,好像除了C都有吧,之前做博客的时候其实也用到了很多,但其实我并不了解,只是机械化地重复在React和php里创建组件和操作数据库。「面向对象」这个词也很早就听过了,但是也从来都不清楚到底什么是OOP,和OPP区别到底在哪,我只知道我以前自己写的代码肯定都是面向过程的,完全没有一点点面向对象的思想。学完了C#里的类和对象,现在我也终于把这一块知识给补上了。
以前我总觉得,面向对象和面向过程是相互矛盾的两个东西,但其实不然,这只是编程思想上的区别,具体到执行动作的时候,谁还不是一步步操作过程的?以我的理解,OOP就是把动作指派给动作的执行者,然后以执行者为主语来执行动作。相比于OPP以具体动作为主语,其实OOP就是把动作包装了一层,动作M不再是公共的了,也不用为了不同的执行者在M的内部重写方法,A有自己的M,B也有自己的M。效果相同的动作在不同的执行者手里,可能会存在不同的执行方法,OOP的写法能更加明确地隐藏具体动作的差异,而强调执行者的差异。
举一个粗糙的例子。老师和学生都有上课这个动作,但显然老师的上课和学生的上课在做不同的事情。
OPP写法把上课的差异表现在函数内部,主语是动作:
上课(执行者){switch(执行者){case老师:讲课();break;case学生:听课();break;}}上课(老师A);上课(学生B);
而OOP写法则强调执行者的差异,即对象的差异,主语是对象:
老师{上课(){讲课();}}学生{上课(){听课();}}老师A.上课();学生B.上课();
当然了,面向对象能做到的远远不止这些,但这个例子我觉得最能体现OOP和OPP的差异。目前我也仅仅是刚接触面向对象,也还没有在哪个项目里大量地使用过,还待我继续熟悉类和发掘OOP的妙处。
本来C#的教程看到这儿就结束基础部分了,接下来会开始讲winform,这才是我最开始想做的东西,但到了这里我却犹豫了。一般来说我主动想去学什么东西之前,总是会先去了解一下,这个东西是什么,能做什么,好不好做,做的效果怎么样。尤其是像编程语言和开发技术这一类,本身可选择的种类非常多,而且自身和环境的发展还贼快。既然要花时间学东西,干嘛不找一个流行的好用的呢?Fortran也很出名,但我现在绝对不会花时间去研究这个玩意儿。
为了得到「年学winform值不值得」的答案,我花了一整天查阅桌面GUI的各种技术(主要是Windows平台下的),它的发展,还有一些我觉得不错的软件是用什么写的,这个过程也了解了不少东西。winform和WPF绝对是成功的代表,快速开发用得挺多的,而且也方便,但Web开发的模式也逐渐在桌面GUI里站住脚了。虽然内存开销和应用本身的大小会因为浏览器内核的原因显得庞大,但Web应用的平台兼容性和其他的一些特性,在客户端越来越不注重性能的趋势下,会作为Web应用的优势逐渐体现出来。
查了一下,VSCode就是用Electron写的界面,再深入了解一下Electron,发现这就是Node.js那一套啊。对我而言,选择Electron代表着我几乎没有学习成本,因为才刚刚用React搭了这个博客出来,至少基础是过关了。所以我又花了一天时间找到了一个React搭配Electron开发桌面应用的流程,已经发布到了GitHub上,我估计应付我这种图一乐级别的塑料开发者应该是没有问题的。目前的计划是,尝试用这一套流程随便写点什么东西出来,熟悉一下Electron的特性。另外就是学一手Typescript,这绝对是不吃亏的决定。之后再回来学学WPF,它简单的开发流程我也还是当感兴趣的。