📜  为 2 个案例切换案例相同的代码 (1)

📅  最后修改于: 2023-12-03 15:06:15.692000             🧑  作者: Mango

介绍

在开发过程中,我们常常需要切换不同的业务场景,而这些业务场景往往会共用一部分代码。为了避免代码重复,我们可以尝试将这部分相同的代码抽离出来,形成一个通用的方法或类,以供各个业务场景调用。

下面将以两个案例来说明如何切换相同的代码。

案例一

假设我们正在开发一个短链接生成器,该生成器需要对 URL 进行编码。编码规则如下:

  1. 将 URL 按照指定算法进行加密。
  2. 将加密后的字符串进行 Base64 编码。
  3. 截取前 N 位字符作为短链接。

我们可以使用如下的代码实现:

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,直到找到一个请求结果。这个修改可以让翻译方法更加灵活,以适应更多的服务商。