📅  最后修改于: 2023-12-03 15:06:15.692000             🧑  作者: Mango
在开发过程中,我们常常需要切换不同的业务场景,而这些业务场景往往会共用一部分代码。为了避免代码重复,我们可以尝试将这部分相同的代码抽离出来,形成一个通用的方法或类,以供各个业务场景调用。
下面将以两个案例来说明如何切换相同的代码。
假设我们正在开发一个短链接生成器,该生成器需要对 URL 进行编码。编码规则如下:
我们可以使用如下的代码实现:
import hashlib
import base64
def generate_short_link(url: str, n: int) -> str:
md5 = hashlib.md5()
md5.update(url.encode())
code = md5.digest()
s = base64.b64encode(code).decode()
return s[:n]
可以看到,该方法首先使用了 hashlib 库对 URL 进行 MD5 加密,之后使用了 base64 库进行编码,并截取了前 N 位字符。这是一个非常简单的短链接生成器,但是在不同的业务场景下,可能需要修改加密算法、编码方式、截取长度等参数。
为了便于切换这些参数,我们可以将这些参数作为该方法的参数进行传递,如下所示:
import hashlib
import base64
def generate_short_link(url: str, n: int, hash_func=hashlib.md5, encode_func=base64.b64encode) -> str:
hash_obj = hash_func()
hash_obj.update(url.encode())
code = hash_obj.digest()
s = encode_func(code).decode()
return s[:n]
在这个修改中,我们可以通过 hash_func 指定加密算法,通过 encode_func 指定编码方式。这样的修改可以让方法变得更加灵活,以适应不同的业务场景。
假设我们正在开发一个在线词典,该词典需要使用多个服务商的 API 进行翻译。我们可以使用如下的代码实现:
import requests
def translate_word(word: str) -> str:
# 使用第一个服务商进行翻译
url = "http://api1.com/trans?q=" + word
response = requests.get(url)
if response.status_code == 200:
return response.text
# 如果第一个服务商失败,则使用第二个服务商进行翻译
url = "http://api2.com/trans?q=" + word
response = requests.get(url)
if response.status_code == 200:
return response.text
# 如果第二个服务商也失败,则返回默认值
return ""
在这个实现中,我们使用了 requests 库对 API 进行访问。首先使用第一个服务商进行翻译,如果该服务商失败,则使用第二个服务商进行翻译。如果第二个服务商也失败,则返回空字符串。
然而,在实际的开发中,我们可能需要使用更多的服务商,而且每个服务商的 API 格式可能又不一样。为了方便切换服务商,我们可以抽象出一个通用的请求方法,如下所示:
import requests
def request_api(url: str) -> str:
response = requests.get(url)
if response.status_code == 200:
return response.text
return ""
def translate_word(word: str, api_list: List[str]) -> str:
for api in api_list:
url = api.format(word)
result = request_api(url)
if result:
return result
return ""
在这个修改中,我们抽象出一个通用的请求方法 request_api,该方法接受一个 URL 参数,并返回请求结果。在翻译方法中,我们使用一个 API 列表作为参数传入,并遍历该列表以依次尝试每个 API,直到找到一个请求结果。这个修改可以让翻译方法更加灵活,以适应更多的服务商。