蘭陵N梓記

一指流沙,程序年华


  • 首页

  • 归档

  • 关于

  • 搜索
close

合理有效的注释

时间: 2019-06-09   |   分类: 技术     |   阅读: 1867 字 ~4分钟

注释是什么

注释是否有用一直以来都被程序员们广泛争论。也有人说,良好的编程习惯从写注释开始;有的人说,注释是恶魔,它将我们的代码变得很难理解。那什么才是注释?

注释就是对代码的解释和说明,其目的是让人们能够更加轻松地了解代码。注释是编写程序时,写程序的人给一个语句、程序段、函数等的解释或提示,能提高程序代码的可读性。 – 百度百科

注释主要是给人看的,其目的是增加代码的可读性。不同的公司、项目,对代码注释要求不同,他们被写入到编程规范中。而大多的规范中对注释关注的是格式,却难以说明如何正确地写注释,什么样的注释不应该写,什么地方需要写注释。

阅读全文 »

不可变减少副作用

时间: 2019-06-08   |   分类: 技术     |   阅读: 2860 字 ~6分钟

可变与不可变

在JVM系统语言如Scala与Kotlin中有两个关键字定义变量

  • var是一个可变变量,可以通过重新分配来更改为另一个值的变量
  • val是一个只读变量,创建的时候必须初始化,以后不能再被改变

为什么新的语言需要强调变量不可改变? 我再来看一下Rust语言中的变量不可改变。

  • let,采用此关键字来绑定变量,变量默认不可变
  • let mut,采用此关键字来绑定可以变更的变量

Rust在mutable(可变)与immutable(不可变)上相比Scala上更进了一步:

  • Scala的val只能约束了同一个变量名不可再重新赋值,变量绑定的对象是可以改变的(如val的list对象,可以调用它的append方法修改对象内容)
  • Rust通过借用(borrow)语义与mut关键字,约束了只有声明为 mut 的变量,才能对绑定的对象是进变更(如只有是mut的vec对象,才能调用它的push方法修改其内容)
阅读全文 »

拒绝重复代码

时间: 2019-06-02   |   分类: 技术     |   阅读: 2228 字 ~5分钟

拒绝重复

软件是让机器有了指令能执行一系列的动作,可将重复的机械劳动自动化。软件工程师们大多数会对重复都深恶痛疾,一旦发现有重复的迹象,就会想尽办法用技术手段去解决它。重复代码也意味着重复劳动,每次变更都必须要同时修改好几个地方,很容易遗漏而出镨,因而我们相信没有人喜欢重复的代码。

但是,实际项目中的业务逻辑总是错综复杂,有很多看似重复的场景,却又不完全一样。虽然我们不喜欢重复,实际上受限项目时间与经验技能,又不知不觉地在制造重复。人大多都有惰性,编写代码也是从模仿开发,都会经过拷贝与粘贴的阶段,当完成了软件开发任务,再也没有回过来再看看我们写的代码。久而久之,软件中充斥着大量的重复、相似的代码。他们的持续存在造成了代码可维护性差,代码质量下降。

Robert C.Martin在他的代码整洁之道一书中写道:

重复可能是软件中一切邪恶的根源,许多原则与实践规则都是为了控制与消除重复而创建。…… 软件开发领域的所有创新都是不断在尝试从源代码中消除重复。

阅读全文 »

逐层递进地编写代码

时间: 2019-05-31   |   分类: 技术     |   阅读: 2131 字 ~5分钟

书的目录

现在的软件类的书籍是越来越厚,尤其是语言类书籍很多通篇都是代码,需要花费很长的时间去阅读,久而之对厚厚的书就有一种莫名的恐惧感。个人看书喜欢先看一本书的目录,快速了解整本书的内容,挑选自己最感兴趣的章节直接开始阅读。

目录是什么?一本书的大纲,它的精炼所在,好的目录如点睛之笔,将书中内容尽是涵盖:

  • 让人清楚地知道书所讲的框架内容,一目了然
  • 让人知道章节之间的逻辑关系,主次之分
  • 让人了解体察作者写作该书的思想和行文脉络
阅读全文 »

编写短小的函数/方法

时间: 2019-05-29   |   分类: 技术     |   阅读: 2426 字 ~5分钟

函数与方法

我们经常会遇到两个词,函数(Function)与方法(Method),简言之:

  • 函数不属于任何对象
  • 方法是关联到对象内的函数

他们的区别:

  • 函数是面向过程编程中,为解决问题划分每个步骤的体现
  • 方法是面向对象编程中,对象能提供的能力或行为的体现

方法底层实现本质还是函数,只是隐式传递了对象引用或指针,方法最终通过转化为函数的形式进行调用。为了简化后面的叙述,方法与函数统一称函数,不再区分。

他们的必要性:

  • 让代码可以重复使用,他们是”积木“
  • 函数黑盒特性,有效封装,隐藏细节
阅读全文 »

类的职责单一

时间: 2019-05-26   |   分类: 技术     |   阅读: 2670 字 ~6分钟

理解类

类(实例化产生对象)是面向对象编程中最基本的组成单元,将逻辑和数据封装其中,以提高软件的重用性、灵活性和扩展性等。它相比人类社会组成,系统/子系统、组件/(微)服务、模块/包这些相当于社会中不同层次的实体或虚拟的组织机构;而类则相当于一类自然人,一个对象相当一个自然人。一个类在系统中承担着一种的 ”角色“ ,从事一种职业。

单一职责

大多数人只从事一种职业,也就是单一职责原则。若一个类只关注的就是自身职责的完成,也就是单一职责原则。

面向对象设计的五个基本原则(SOLID),排在第一就是单一职责原则(SRP:Single responsibility principle)。SRP的原话解释是:There should never be more than one reason for a class to change。应该有且仅有一个原因引起类的变更。

阅读全文 »

降低模块间耦合

时间: 2019-05-23   |   分类: 技术     |   阅读: 3505 字 ~7分钟

提到耦合,必须先提依赖。依赖不可避免,而是尽可能地降低耦合。

依赖

模块依赖指模块之间发生了关系,如模块A调用了模块B的接口,则模块A依赖了模块B。依赖的英语是Dependency。

模块依赖是系统内不可避免的,复杂的系统都是分而治之,软件架构活动中最重要的事就是如何正确把系统分解,并定义他们之间关系。存在关系就会存在依赖,依赖是系统分解的必然产物。如果一个系统内的模块间不存在任何的关联,那他们应该划分为不同的系统;一个模块没有与其它的模块发生关联,那这个模块就应该不存在这个系统中。

模块的依赖关系,按生命周期阶段可分为:

  • 开发态依赖:如开发模块A时,需要依赖其它模块提供的接口,数据结构等文件依赖;还有一种如测试依赖,仅仅发生在开发阶段,在测试时,需要依赖测试数据,测试框架等,测试完成就不需要了。
  • 运行态依赖:在系统运行时,模块A必须依赖其它模块提供能力才能完成某种完整的功能或服务,依赖的形态可能是本地或远程接口,集中配置数据,模型数据信息等。

开发态依赖可能引发运行态依赖,但运行态依赖不一定需要在开发态就依赖。我们经常关注的是运行态依赖导致的问题,目前的微服务架构设计,减少了开发态的依赖,把依赖导致的问题后移到运行态。

模块之间最好还是单向的依赖,如果出现A依赖B,B也依赖A,那么要么是A、B应该属于一个模块,要么就是系统整体拆分有问题。一个完整的软件系统的模块依赖应该是一张有向无环图。

阅读全文 »

清晰的代码结构

时间: 2019-05-19   |   分类: 技术     |   阅读: 2380 字 ~5分钟

问题

架构设计中常常关注几个视图,如功能视图、逻辑视图、运行视图与部署视图。但架构师们由于层次较高,长期缺少代码编写能力,往往就直接忽视了开发视图。开发视图主要描述软件的开发工程结构、代码规范,以及构建技术等。代码结构和构建关系到项目的可持续维护以及维护的周期,非常重要。但实现开发活动,架构到开发中间层的GAP,真正重视并落地的很少很少。

清淅明确的代码结构,是软件项目成功的重要开始。

代码结构不应该仅仅归纳为 “代码编码风格” 一类,它是架构在代码层次的真实反应,架构是否能落地,代码结构的良好设计起着至关重要的作用。软件是有生命力的,需要考虑其可持续性发展。一个结构层次非常不好软件,它的逻辑可能并不一定复杂,但随着时间的推移,需要花费非常长的时间去理解它表达的的意思。同样不好的代码结构,让构建变得困难或效率低下,进一步降低了它的生命力。

阅读全文 »
4 5 6 7 8 9 10 11 12
兰陵子

兰陵子

Programmer & Architect

164 日志
4 分类
57 标签
RSS 订阅
GitHub 知乎
© 2009 - 2022 蘭陵N梓記
Powered by - Hugo v0.101.0
Theme by - NexT
0%