Swift移动开发IOS开发

iOS+Swift 开发中重复常量的处理

2015-08-16  本文已影响494人  windgo

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
上一篇下一篇

猜你喜欢

热点阅读