iOS+Swift 开发中重复常量的处理
iOS+Swift 开发中重复常量的处理
提取可复用代码,避免相同或者十分类似的代码分散在项目中多个地方,是让代码变得更简洁的一种方法.
将可复用的代码,抽象成常量,枚举,方法,类之后,在将来需要修改,调整代码的时候,只在对应的方法里修改就可以了,不必再到处修改.
有人可能会说, 为什么不一开始就将可能重用的代码, 封装成可复用的代码呢? 我觉得是思路问题和能力问题. 在软件开发上, 大概有两种形成设计的过程, 一种是先设计, 然后依据设计编写代码. 另一种, 是写出代码之后, 检查不合理的地方, 进行重构形成设计. 前一种对能力和经验有更高的要求, 后一种可能更平民一些, 可操作性更高, 更容易上手. 本文中主要是在后一种情形之下发生的.
找到重复出现的字符串值,并定义成一个全局的常量,是其中的一項工作.
将重复出现的逻辑代码,抽象成方法,抽象成类是是其他的工作,本文不涉及.
例如:对于需要显示价格的地方,要求在app内都显示为“80¥”,那么人民币符号“¥”可能会出现在代码里的各种地方.“¥”这个符号会出现在各种地方,labelA.text=“(product.price)“+”¥”.将来有一天,老板一拍板,说为什么显示”80¥”,这不是明显的崇洋媚外嘛,应该展示成“80元”嘛.如果你在100个地方,直接这么编写了代码,那么你就可能需要修改100处地方,漏掉一个地方,就是一个bug.这时候, 我们可以将”¥”这个常量, 封装到类里.
extension String {
static var PriceChar:String {
return ”¥”
}
}
…
labelA.text= “\(product.price)“+String.PriceChar
…
labelB.text= “\(productB.price)“+String.PriceChar
这样, 老板说改成”元”, 那么我们只需要修改一个地方
static var PriceChar:String {
return ”元”
}
就算想改成”$”, 也是分分钟搞定.
static var PriceChar:String {
return ”$”
}
对于已经存在的代码, 怎么查找重复出现的常量是(例如"¥")是一个需要借助工具的工作.比较费力的一种方法,是翻阅代码,发现一个字符串值后,利用ide或者编辑器在整个项目里搜索.
这里利用脚本语言来实现.
作为一个程序员很有用的一个技术就是重复工作,用代码来做,一般来说,用脚本语言更快捷一些.
脚本思路:
利用一个字典, 记录所有常量出现的个数
遍历所有文件, 对于每一个文件, 查找符合”xxx”格式的词, 找到后, 在字典的计数里加1
输出结果
脚本:
# encoding: UTF-8
#/usr/bin/python
import os
import sys
import re
import operator
# 词频字典
wordDict={}
# 常量的正则表达式
p=re.compile('"[^"]*"')
# 统计文件中常量的出现次数
def CountFile(f):
# 不是源文件, 不进行处理
if f.find(".swift")==-1:
return
#打开文件
f = open(f, "r")
#处理文件中的每一行
for line in f.read().split('\n'):
strList=p.findall(line)
for strConst in strList:
if wordDict.has_key(strConst):
wordDict[strConst] = wordDict[strConst]+1
else:
wordDict[strConst]=1
#关闭文件
f.close()
# 遍历目录, 统计词频
def CountDir(dirname):
for f in os.listdir(dirname):
fa = os.path.join(dirname, f)
if os.path.isdir(fa):
CountDir(fa)
else:
CountFile(fa)
# 遍历从命令行传入的目录
CountDir(sys.argv[1])
sortedDict=sorted(wordDict.iteritems(), key=operator.itemgetter(1), reverse=True)
for t in sortedDict:
print t