这些简单的步骤使您的iOS应用程序易于阅读。
优秀的程序员会以最简单的方式解释自己的工作。 甚至物理学家也用一张纸和一根铅笔在虫洞中进行解释。 是什么使我们与众不同?
我一直试图编写尽可能简单易读的代码,从为变量选择正确的名称到使用代码约定,但是仍然缺少某些东西,这是一种无需试图理解“如何我做到了,但我却想实现这一目标。
您甚至可能会说 将代码读为一个故事 ,而不是一堆代码。
让我们解决3个主要主题:
阅读其他程序员的代码可能是一场真正的斗争。 如果没有提供适当的上下文,人们只会发现他迷失了寻找功能或特性的含义。
从1和0到底层代码再到高级语言,值得注意的是,代码语法变得越来越人性化,从而吸引了新的程序员进入开发人员的视野。 随着语法变得更加清晰,以通俗易懂的英语阅读,所以我们的代码应该简单明了并且易于说明。
编写良好的代码会将自己掩盖为一个故事,使其易于阅读和理解(即使没有上下文)。
命名功能
如何正确使用它:
当我们编写函数时,我们假设阅读函数的人有足够的背景知识来理解我们试图实现的目标。 用“ handleRedView()”来命名我们的函数会引起很多关于“ RedView”代表什么的问题? 此功能的主要目标是什么?
似乎在某些情况下 , 功能目的含糊且过于复杂,无法在不提供上下文的情况下进行理解。
我们可以将功能建议分为4类:
1.线人功能
2.管理职能
3.路由器功能
4.执行功能
1.线人功能
通常触发路由器/管理功能。
功能示例:
回调函数,通知发生了某些事情/将要发生的事情,并为您提供了做出反应的选项。
通常用作委托触发操作或通知处理功能。
2.管理功能
用于组合多个功能以实现1个更高的目的而无需依赖, 该块内的所有代码都将执行。
阅读此功能后,我们将获得所需的所有信息,并在汽车启动时执行此功能,此时,我们不在乎“如何”完成工作,而在乎“做什么”。
3.路由器功能
用于将多种功能结合起来,以某种依赖性实现更高的目标1, 的 代码仅在意图时执行。
路由器功能主要指向 执行 功能,但在某些情况下,仅当代码不超过1行时,才可以包含逻辑本身。
4.执行功能
执行 功能 名称。
逻辑本身可能很容易理解,但是我们已经在名称中声明 了该功能的功能 ,该功能打开了外部灯,该功能检查了灯泡是否烧毁,了解这可以在将来简化查找错误的过程,并使其更容易向函数添加逻辑而不更改其名称。
最终,在将这些想法实现到您的应用程序中之后,您应该在类部分中将对象与信息人 , 管理者和路由器功能组织在一起。
以及扩展块中的所有执行/逻辑都在同一文件中。
结果将是干净的简短类,可读性强并且易于维护。
*请记住,函数应始终由单个函数编写
负责任的原则。
避免在函数名称中使用“ and”:
播放并最小化
加载并播放()
这种不良做法违反了单一责任原则,使您编写的代码适合两种情况。
给函数命名时, 避免玩猜游戏:
moveRedViewIfNeeded()
这个例子保证了将来的程序员仅需深入了解函数即可了解移动Red View 的触发因素,而这又是模棱两可的。
*并且没有layoutIfNeeded() 不是 同一件事 ,在这种情况下,我们知道self应该在setNeedsLayout bool为true时重新布局其视图的布局。 此示例是快速编程语言的通用示例,而您的功能可能仍对应用程序私有。
考虑可读代码时,想到的第一件事就是使用代码约定,它们众所周知且常用,但是使用它们并不一定会使您的代码更好,它将使应用程序跨应用程序但可读性较低。
布尔变量和方法应使用“ is”前缀来说明返回的值是布尔类型。 #CodingConventions
“ if”语句始终处理布尔值,那么为什么我们需要在每个布尔属性中声明“ is” ? 苹果为什么要从view.hidden〜 > view.isHidden更改Swift语法? 我只能想到一个答案……。 因为“ if view.isHidden”感觉很自然。
让我们尝试通过以下规则实现“ is”前缀:
- 如果在该类的实例(公共)上使用了该类的布尔属性/方法,则“ is”前缀是合理的。
- 如果在类 (私有)中使用了布尔属性,则前缀是多余的。
- 如果私有和公开 使用布尔型属性/方法,则计算出的属性应返回私有属性值。
我们本可以使用private(set)并仍然公开使用它,但是考虑到此处实现的副作用,我们实现了封装。
封装用于在类内隐藏结构化数据对象的值或状态 ,从而防止未经授权的方直接访问它们。
https://zh.wikipedia.org/wiki/封装_(计算机编程)
您可能会问自己,那些不直接针对自己的布尔值如何?在这种情况下,我们应该这样写属性名称:
私人var播放器正在播放:布尔
私有var gridConstraint已启用()
“是”需要引用:视图。 被隐藏,“是”指的是视图。 在上面的示例中,我们做了同样的事情,玩家在玩,“是”指的是玩家。
切记:开发人员通常在很费力气地阅读属性声明之前就阅读函数中的代码,以试图了解其目的。
/ if playerIsPlaying {} / 与 / if isPlayerIsPlaying {} / 相反
哪个选项听起来自然?,我让您决定。