• 如何写出优雅的代码?


    背景介绍

    以下这些代码片段是我工作多年,总结的一些如何写出漂亮代码的方法,欢迎小伙伴前来借鉴或者讨论。
    参考书籍《代码整洁之道》,《写好Python代码的91个建议》

    正文开始

    代码段1

    def get_environment(self, environment_id: int = None, environment_name: str = ""):
        if environment_id: 
            environment = self.session.query(
                models.Environment).filter_by(
                    id=environment_id).first() 
        else: 
            environment = self.session.query(
                models.Environment).filter_by( 
                    name=environment_name).first() 
    
        return environment 
    

    这段代码的意思是,我们从调用方获取参数,如果是拿到了environment_id,我们就执行if代码块,如果是我们拿到了environment_name, 我们就执行else代码块。
    不知道大家看到这段代码,有没有发现什么问题?


    ⏱️一分钟思考时间。。。


    在这段代码中,我们在进行session.query时,多处使用了重复的代码,这样虽然没有任何程序上的问题,但是看起来非常不优雅。
    于是我修改之后,如下

    def get_environment(self, environment_id: int = None, environment_name: str = ""): 
        condition = {'id': environment_id} if environment_id else {'name': environment_name} 
    
        return self.session.query(models.Environment).filter_by(**condition).first() 
    

    思考

    通过分析发现,我们可以将要查询的变量组装成一个字典形式,然后在session.query中使用双星号解包使用。
    这样很巧妙的去掉了冗余不好看的代码结构。

    代码段2

    if testcase_id and account_type:
        stmt = (
            select(
                models.Accounts).where(
                exists_testcase_id,
                exists_account_type,
                exists_account_status))
    elif testcase_id:
        stmt = (
            select(
                models.Accounts).where(
                exists_testcase_id,
                exists_account_status))
    elif account_type:
        stmt = (
            select(
                models.Accounts).where(
                exists_account_type,
                exists_account_status))
    elif status:
        stmt = (
            select(
                models.Accounts).where(exists_account_status))
    else:
        stmt = (select(models.Accounts))
    return self.session.execute(stmt).all()
    
    

    在这段代码中,我们最终是通过参数的组合来查询Accounts数据,在这个函数种我们接受了多个参数,testcase_id,account_type,status。这几个参数又可以产生多种组合。
    如果是按照上面的编码方式,那么我们写出来的代码很长而且冗余。
    那么如何重构它呢???


    ⏱️一分钟思考时间。。。


    conditions = []
    
    if testcase_id:
        conditions.append(models.Accounts.testcase_object.has(
            models.Testcase.testcase_id == testcase_id))
    if account_type:
        conditions.append(models.Accounts.account_type_object.has(
            models.AccountType.name == account_type))
    if status:
        conditions.append(models.Accounts.status == status)
    
    stmt = (select(models.Accounts).where(*conditions))
    
    return self.session.execute(stmt).all()
    

    思考

    我们通过分析发现,由于多个参数存在多种组合,那么我们首先需要一个列表来存放这些查询条件,然后通过if-else来添加要查询的条件放入列表中。
    最后在倒第二行的时候,统一解包。
    这样重构的好处就是,我们不需要再去关注他们有多少种组合的情况,我们只需把要查询的条件,统一存放起来。然后再进行查询操作。

  • 相关阅读:
    Pytorch从零开始实战02
    喂饭级AI神器!免代码一键绘制图表,文本数据秒变惊艳视觉盛宴!
    网络传输中的重要参数-简单的网络画像
    Window 2016 + VMWare +Thingworx 8.5 安装总结
    工具(十一):随机密码生成工具-可选择字符种类
    js检测一个元素是否在另一个元素内部的原生方法document.caretRangeFromPoint
    1512_人月神话阅读笔记_没有银弹下篇
    扩展卡尔曼滤波器
    @Transactional注解介绍
    第13/100天 阅读笔记
  • 原文地址:https://www.cnblogs.com/aaron-948/p/Aaron-945.html