1.1.1 抽象的代价:为什么抽象是一种未来赌注

news/2025/11/29 21:40:20/文章来源:https://www.cnblogs.com/hi-yingzi/p/19287502

1.1.1 抽象的代价:为什么抽象是一种未来赌注

引言

很多程序员在写代码时都被教导要"抽象"、"解耦"、"面向接口编程"。这些原则没有错,但它们常常被过度使用。抽象不是免费的——每一次抽象都是在为未来的变化下注,而这个赌注可能赢,也可能输。

1.1.1

抽象的本质是什么

抽象是一种提前猜测的行为。当你把一段具体的逻辑抽象成一个通用函数或类时,你实际上在说:"我猜测未来会有类似的需求,所以我现在就把它抽象出来。"

但问题在于:你真的知道未来会怎样吗?

一个常见的场景

假设你正在写一个电商系统的订单处理模块:

# 版本1:具体实现
def create_order(user_id, product_id, quantity):product = db.get_product(product_id)price = product.price * quantityorder = Order(user_id=user_id, product_id=product_id,quantity=quantity, total_price=price)db.save(order)send_email(user_id, "订单创建成功")return order

一个有一年经验的程序员可能会觉得这段代码"不够优雅",于是开始抽象:

# 版本2:过度抽象
class OrderCreationStrategy(ABC):@abstractmethoddef calculate_price(self, product, quantity): pass@abstractmethoddef notify_user(self, user_id, message): passclass StandardOrderCreationStrategy(OrderCreationStrategy):def calculate_price(self, product, quantity):return product.price * quantitydef notify_user(self, user_id, message):send_email(user_id, message)class OrderService:def __init__(self, strategy: OrderCreationStrategy):self.strategy = strategydef create_order(self, user_id, product_id, quantity):product = db.get_product(product_id)price = self.strategy.calculate_price(product, quantity)order = Order(user_id=user_id, product_id=product_id,quantity=quantity, total_price=price)db.save(order)self.strategy.notify_user(user_id, "订单创建成功")return order

这段代码看起来"更专业",但它带来了什么?

抽象的隐性成本

1. 认知负担增加

原本5行代码就能看懂的逻辑,现在需要跳转到3个不同的文件才能理解。新人接手时,他需要回答:

  • OrderCreationStrategy 是什么?
  • 为什么要有这个抽象层?
  • 目前有几种 Strategy 实现?
  • 我要修改逻辑时,应该改哪一层?

2. 变更成本上升

如果需求变更,比如订单创建时需要增加库存检查:

版本1(具体实现):直接在函数里加一行代码,30秒搞定。

版本2(抽象版):你需要思考:

  • 这个逻辑应该加在 OrderService 里还是 Strategy 里?
  • 如果加在 Strategy,是不是所有实现都要加?
  • 会不会破坏现有的抽象设计?

结果:本来30秒的事情,变成了30分钟的思考 + 可能的重构。

3. 未来变化的方向可能完全错误

最致命的问题是:你抽象的方向可能根本不是未来需要的方向

上面的例子中,你假设未来会有不同的"价格计算策略"和"通知策略"。但实际情况可能是:

  • 未来需要的是不同的"支付方式"(微信、支付宝、信用卡)
  • 或者需要的是"订单状态流转"的抽象
  • 而你抽象的"价格计算"根本没有变化过

结果:你的抽象成了无用的复杂度,既没有带来灵活性,又增加了维护成本。

何时应该抽象

抽象不是不好,而是需要基于真实发生的变化,而不是想象中的变化。

Rule of Three(三次原则)

当一段逻辑第三次出现时,再考虑抽象。

  • 第1次:写具体代码
  • 第2次:复制粘贴,容忍重复
  • 第3次:现在你知道它们的共同点和差异点了,抽象

基于痛点抽象,而非基于美学

不要因为"代码看起来不够优雅"就抽象,而是因为"重复代码导致了实际的维护痛点"才抽象。

反例(基于美学):

# "我觉得这两个函数很相似,应该合并"
def send_welcome_email(user):send_email(user.email, "欢迎")def send_reset_password_email(user):send_email(user.email, "重置密码")# 抽象后
def send_notification(user, type):messages = {"welcome": "欢迎", "reset": "重置密码"}send_email(user.email, messages[type])

这个抽象有什么问题?当未来"欢迎邮件"需要加用户名,而"重置密码邮件"需要加过期时间,这个抽象就会崩溃。

正例(基于痛点):

# 当你发现自己在10个地方都需要写这段代码时
if user.is_premium:discount = 0.8
else:discount = 1.0
price = base_price * discount# 此时抽象是合理的
def calculate_user_price(user, base_price):discount = 0.8 if user.is_premium else 1.0return base_price * discount

对使用AI编程的程序员的特别提醒

如果你正在使用 AI(如 ChatGPT、Claude、Copilot)辅助编程,你需要特别警惕:

AI 倾向于生成"看起来专业"的代码,而不是"刚好够用"的代码。

AI 会本能地使用设计模式、抽象层、接口等,因为这些在训练数据中被标记为"好代码"。但它不知道你的项目规模、团队水平、未来规划。

实用建议

  1. 当 AI 生成抽象代码时,问自己:"如果去掉这个抽象层,代码会变得难以维护吗?"
  2. 主动要求 AI 简化:"请给我一个最简单的实现,不要使用设计模式。"
  3. 理解每一行代码的存在理由:如果你不能用一句话解释某个抽象的价值,就删掉它。

实践原则

YAGNI (You Aren't Gonna Need It)

你不会需要它的。

在确凿的需求出现之前,不要为"可能的未来"编写代码。

渐进式抽象

抽象应该是一个渐进的过程,而不是一次性的设计:

具体代码 → 发现重复 → 提取函数 → 发现模式 → 抽象接口

而不是:

需求 → 直接设计抽象层

可逆性思维

好的抽象应该是容易拆掉的。如果你发现一个抽象不再有用,能否在10分钟内把它还原成具体代码?

如果不能,说明这个抽象耦合得太深了。

总结

抽象是工程师的重要工具,但不是唯一工具。记住:

  1. 抽象是一种赌注——你在赌未来会有某种变化
  2. 抽象有成本——认知负担、变更成本、错误方向的风险
  3. 基于事实抽象——用"三次原则",用真实的重复痛点驱动抽象
  4. 对 AI 生成的抽象保持警惕——简单优于复杂
  5. YAGNI——直到你真正需要时再抽象

好的程序员不是擅长抽象的人,而是知道何时不抽象的人。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/981217.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2025 年杭州余杭区人像摄影培训推荐榜:路人贾摄影讲堂 全杭州10个区覆盖、人像摄影十杰创办

随着新媒体内容创作与商业摄影市场的持续火热,对于高品质人像摄影技能的需求激增。无论是希望成为职业摄影师,还是追求个人兴趣精进的摄影爱好者,选择一家师资力量雄厚、课程体系科学、实战经验丰富的培训机构,已成…

[python]FastAPI-Tracking ID 的设计

本文介绍如何基于 contextvars,为每次请求的完整流程都添加一个 tracking_id,并在日志中记录。前言 在实际业务中,根据 tracking_id 追查日志中一条请求的完整处理路径是一个比较常见的需求。不过 FastAPI 官方并没…

【机翻】驱动逆向工程 101 - 第二部分:解包 VMProtected 内核驱动

驱动逆向工程 101 - 第二部分:解包 VMProtected 内核驱动 原文链接 目录Inspecting the driver 检查驱动程序Unpacking the driver 解压驱动程序Wrapping up 总结 Unpacking VMProtect is rather straightforward and…

SQL 性能的三要素——索引、执行计划与数据分布的协同影响

优秀的 SQL 性能不取决于单一组件的优化,而是索引设计、执行计划选择与数据分布感知三者协同的结果在数据库系统中,SQL 查询性能是衡量应用健康度的关键指标。许多开发者将性能优化简单归结为"添加索引",…

深入解析:20-控制流多次异步

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

一物一码公司推荐:2025年六大专业厂家全新评测!

在数字化浪潮席卷各行各业的今天,产品防伪与全链路管控已成为品牌生存与发展的核心竞争力。 随着消费升级与产业数字化转型的加速,一物一码技术凭借为每件产品赋予唯一数字身份的核心优势,正成为企业解决防伪溯源、…

中国数控机床品牌市场占有率前十名

这份 2025 年市场占有率榜单,是我们联合中国机床工具工业协会,调研上百家企业后得出的答案。评估体系聚焦 “技术攻坚、市场适配、服务闭环” 三大核心,每个数据都藏着国产机床的进阶密码。车间里的 “卡脖子” 困境…

2.去除坏波段(含水汽等影响)

2.去除坏波段(含水汽等影响)2.1在HySime那一步的mian.py进行代码修改: (1)修改位置preprocess_for_vca 函数,使打印常数波段索引点击查看代码 import numpy as np import scipy.io as sio from sklearn import p…

实用程序:基于Python的高效本地文件智能搜索工具

前言 在日常工作中,我们经常需要在本地磁盘中搜索特定文件——可能是根据文件名或者文件内容查找文档。Windows自带的搜索功能往往响应缓慢,而第三方工具又可能存在功能冗余或广告干扰的问题。为此,开发了一款轻量高…

人工智能:用Gemini 3一键生成3D粒子电子手部映射应用

@目录前言核心提示词(直接复制使用)效果演示(Gemini 3生成后实际表现)1. 权限处理效果2. 摄像头画面与手部标注3. 3D粒子手跟随效果4. 淡出与再生效果总结 前言 Gemini3横空出世,网上对其的评价颇为一致,都认为其…

2025 Q4 一物一码公司推荐:大模型赋能的行业标杆品牌榜

在数字经济深化发展的背景下,一物一码已从基础防伪溯源工具升级为企业全链路数字化的核心枢纽,而AI大模型的深度融合更推动行业迈入“智能决策”新阶段。基于品牌智鉴榜联合防伪行业协会、腾讯研究院的权威评测体系(…

完整教程:Python Web3库入门:从零开始与以太坊区块链交互

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

人工智能伦理与负责任AI实践指南

本文探讨了人工智能伦理在商业应用中的重要性,分析了机器学习技术可能带来的偏见和风险,并提出了通过高层领导负责制和企业内部流程建设来确保AI系统公平透明的具体方法。里德布莱克曼:人工智能伦理 《道德机器:完…

经典寓言故事狐狸与葡萄里的英语秘密-The Fox and the Grapes - new

1 原文 The Fox and the Grapes One hot summer day a fox was walking through an orchard. He stopped before a bunch of grapes. They were ripe and juicy. "Im just feeling thirsty," he thought. So…

深入解析:AOI在钢铁行业检测领域中的应用

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

第3篇 Scrum 冲刺博客

这个作业属于哪个课程 https://edu.cnblogs.com/campus/gdgy/Class12Grade23ComputerScience这个作业要求在哪里 https://edu.cnblogs.com/campus/gdgy/Class12Grade23ComputerScience/homework/13474这个作业的目标 完…

实现倒计时与数字转换的jQuery时间戳处理教程 - 实践

实现倒计时与数字转换的jQuery时间戳处理教程 - 实践2025-11-29 20:54 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; dis…

2025年广东咖啡奶茶开店指导培训公司推荐——奇豆咖啡,咖啡豆批发/咖啡设备销售/咖啡零售/精品咖啡豆烘焙,一站式服务商,创业消费首选

随着咖啡消费市场的持续扩容,2025年中国咖啡市场规模预计突破2000亿元(数据来源:艾媒咨询《2025中国咖啡行业发展白皮书》),从家庭饮用到商业门店,从咖啡豆批发到设备供应,咖啡产业链的需求呈现多元化、专业化、…

英语_阅读_Keep believing yourself_待读

Mr. Smith stood before his class of 30 students and was going to hand out the final exam papers. 史密斯先生站在自己三十名学生的班级前,准备发放期末考试试卷。 “I know how hard you have all worked to ge…