使用exec()来重构重复代码

问题

func(bool, a, 'a')
func(bool, b, 'b')
func(bool, c, 'c')
func(bool, d, 'd')
func(int, e, 'e')
func(int, f, 'f')
func(float, g, 'g')

重构以上代码,必须保证其功能一致。

初次重构

我们先将代码拆分:

# 第一部分:
func(bool, a, 'a')
func(bool, b, 'b')
func(bool, c, 'c')
func(bool, d, 'd')

# 第二部分:
func(int, e, 'e')
func(int, f, 'f')

# 第三部分:
func(float, g, 'g')

然后分别使用for循环搭配exec()来重构,也可以使用格式化字符串来提升可读性。

# 第一部分:
for i in ('a', 'b', 'c', 'd'):
    exec(f"func(bool, {i}, '{i}')")

# 第二部分:
for i in ('e', 'f'):
    exec(f"func(int, {i}, '{i}')")

# 第三部分:
for i in ('g'):
    exec(f"func(float, {i}, '{i}')")

但是,这样还不是最好的。

重构评估

  • 第一部分从4行缩减到了2行,是成功的。
  • 第二部分行数未变,但是复杂度有所提升,效果就见仁见智了。
  • 第三部分从1行增加到了2行,还绕了个弯子,是失败的。

最终重构

我们可以取长补短,自己选择部分代码是否重构:

# 第一部分:
for i in ('a', 'b', 'c', 'd'):
    exec(f"func(bool, {i}, '{i}')")

# 第二部分:
func(int, e, 'e')
func(int, f, 'f')

# 第三部分:
func(float, g, 'g')

去掉注释:

for i in ('a', 'b', 'c', 'd'):
    exec(f"func(bool, {i}, '{i}')")
func(int, e, 'e')
func(int, f, 'f')
func(float, g, 'g')
在没有特别声明的情况下,内容均为原创,请遵守CC BY-NC-SA 4.0版权协议!

评论

  1. 一棵树
    已编辑
    5 天前
    2024-9-14 12:27:00

    这是一次有意义的尝试……..,程序的确精简了一些,但是程序的整齐性易读性差了,而且还新增了exec()函数的调用,增加了系统的复杂性,也增加了出错的可能性,有点得不偿失啊

    • 博主
      一棵树
      已编辑
      5 天前
      2024-9-14 13:04:44

      果然是写过 C 语言的人,代码风格的要求就不一样

    • 一棵树
      Pinpe
      5 天前
      2024-9-14 14:53:14

      程序短小,不觉得这有啥区别,代码量大了,有些bug就出来了,唉,多么痛的领悟啊,编程简单为美

  2. Tobeko
    7 天前
    2024-9-12 20:55:59

    表示不如重写 func,使得它可以接受数组参数

    • 博主
      Tobeko
      6 天前
      2024-9-12 21:42:16

      如果改不了呢?

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
呼呼
上一篇
下一篇