知道却做不到

news/2025/10/6 20:44:01/文章来源:https://www.cnblogs.com/leijiajava/p/19127909

这种“知道步骤但写不出来”的情况非常常见,核心原因是对“类的参数设计”和“类之间的协作关系”还没有形成清晰的逻辑链。其实参数设计有明确的规律——每个类的参数都应该服务于它的“核心职责”。我们用“从职责倒推参数”的方法,一步步帮你落地这两个类的设计。

第一步:明确每个类的“核心职责”(先想清楚“它要干什么”)

在这个场景中:

  1. Account的核心职责:
    管理账户余额的变动(存款),并保证多线程操作时的安全性。
    → 通俗说:“它是个银行账户,要能存钱、能查余额,还得防着多人同时瞎改余额”。

  2. AddMoneyThread的核心职责:
    作为线程,执行“给指定账户存指定金额”的任务。
    → 通俗说:“它是个办事员,要知道去哪个银行账户(Account)存多少钱(金额)”。

第二步:从职责倒推每个类需要的参数(再想“需要什么才能完成职责”)

参数的本质是“类完成职责所必需的外部信息”,缺了这些信息,类就无法工作。

1. Account 类需要哪些参数?

它的职责是“管理余额+保证安全”,需要的信息:

  • 初始余额:账户刚创建时,余额是多少?(比如默认0元,但也可以让用户指定)。
    → 所以 __init__ 方法可以加一个可选参数 initial_balance,默认值0。
  • 线程锁:为了多线程安全,需要内置一个锁(这个是类内部自己创建的,不需要外部传入,所以不算参数)。

因此 Account 类的参数设计:

class Account:def __init__(self, initial_balance=0):  # 可选参数:初始余额,默认0self._balance = initial_balance  # 用初始余额初始化self._lock = threading.Lock()  # 内部创建锁,不用外部传

它的方法(deposit)需要什么参数?
deposit 的职责是“存多少钱”,所以必须知道“存入金额”:

def deposit(self, money):  # 必需参数:要存入的金额self._lock.acquire()try:self._balance += moneyfinally:self._lock.release()

2. AddMoneyThread 类需要哪些参数?

它的职责是“作为线程给指定账户存指定金额”,需要的信息:

  • 要操作的账户:必须知道是给哪个 Account 实例存钱(没有账户,存哪里?)。
  • 要存的金额:必须知道每次存多少钱(没有金额,存多少?)。

这两个信息都需要外部提供(线程自己无法生成),所以必须作为参数传入 __init__ 方法。

因此 AddMoneyThread 类的参数设计:

class AddMoneyThread(Thread):def __init__(self, account, money):  # 两个必需参数:账户实例、存入金额super().__init__()  # 必须调用父类Thread的初始化self._account = account  # 保存账户实例(后面要用它调用deposit)self._money = money  # 保存存入金额(后面要传给deposit)

它的 run 方法需要参数吗?
不需要。因为 run 是线程启动后自动执行的,它的逻辑是固定的:“用保存的账户和金额,调用 deposit 方法”:

def run(self):self._account.deposit(self._money)  # 直接用实例属性,不用额外传参

第三步:主函数如何调用?(把类串联起来)

主函数的任务是“创建100个线程给同一个账户各存1元”,步骤:

  1. 创建一个 Account 实例(用默认初始余额0)。
  2. 循环100次,每次创建 AddMoneyThread 实例时,传入:
    • 同一个 Account 实例(所有线程操作同一个账户);
    • 金额1(每次存1元)。
  3. 启动所有线程,等待全部完成后,打印余额。

完整代码:

关键规律:参数设计的“必要性原则”

判断一个参数是否需要存在,就问自己:
“没有这个参数,这个类还能完成它的核心职责吗?”

  • Account 类没有 initial_balance 可以(用默认0),但 deposit 没有 money 就不行(不知道存多少)。
  • AddMoneyThread 类没有 account 不行(不知道存到哪),没有 money 也不行(不知道存多少)。

按照这个原则,你就能清晰地确定每个类需要哪些参数了。刚开始写不出来很正常,多按照“职责→参数→方法”的逻辑链练习几次,很快就能掌握这种设计思路。

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

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

相关文章

题解:loj154 集合划分计数

题意:给出一个大小为 \(n\) 的全集 \(A = \{1,2,\cdots n\}\),再给出 \(m\) 个集 \(S_1,S_2\cdots S_m\),要求从这些集里选出至多 \(k\) 个,满足 \(S\) 间没有交集且并集是全集,\(k\le n\le 21,m\le 262144\)。 做…

网址大全下载app鄂州网站seo

目录 smbclient工具 mimikatz工具 Kerbers协议 NTLM认证 hash传递攻击(PTH攻击) 黄金票据攻击 白银票据 MS14-068 smbclient工具 在linux里面连接远程windows共享目录,可以使用这个工具 ​ 第一种连接方式:smbclient -L 目…

怎样做网贷网站陕西省建设银行网站

1、典型回答 final、finally、finalize 是 Java 中三个不同的关键字,它们除了长得像之外,其他的(作用和含义)完全不同。 它们三个的区别就好像:雷、雷锋、雷峰塔之间的区别。(是三个完全不同的东西&#…

博客网站主页代码html介绍在家里做的点心的网站

经过一些自己的混淆,最终博客方法的具体含义(最终声明的方法参数)将对此博客条目进行澄清。 至少可以将方法参数上的final关键字视为Java编译器的指示符,表明该参数不能重新分配给另一个引用。 Java参数处理始终是“按值调用” &a…

电商网站建设培训wordpress的用法

文章目录 问题引入 1:问题阐述 2:问题分析 一:从SpringBoot的自动装配 1:SpringBootApplication介绍 2:自动装配的核心方法 3:核心方法的调用路径 4:SpringSecurity核心配置 5&#xf…

详细介绍:003 flutter初始文件讲解(2)

详细介绍:003 flutter初始文件讲解(2)pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "M…

为什么 Java 中打印Object类型的变量无需强转,而从Object类型的数组中取元素却要强转?

两个奇怪的现象 case1:打印Object对象时,无需强转: Object val = 25; System.out.println(val); // 直接打印,输出:25 // 不需要:(String)val 或 (Integer)valcase2:当我们要使用Object 数组中的元素时,需要强…

商城网站源代码html5网站模板 免费

定义 考手刹的专业称呼是辅助制动器,与制动器的原理不同,其是采用钢丝拉线连接到后制动蹄上,以对车子进行制动。作用 用于平地斜坡停车时制动,防止车子在无人状态下自动滑跑,逼免发生交通事故。工作原理 其原…

定制开发开源AI智能名片S2B2C商城小程序在无界零售中的应用与行业智能升级示范研究 - 实践

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

网站建设样板四平网站建设联系方式

1,背景: 在本地java开发完毕之后,想要打包成docker镜像,方便安装。由于本地没有docker环境,也懒得装了。有一台测试的linux机器可以使用,所以先在本地打包生成xxx.jar,然后拷贝到有docker环境的…

网站主页 优帮云做乡村旅游的网站

<Suspense> 是一个内置组件&#xff0c;用来在组件树中协调对异步依赖的处理。它让我们可以在组件树上层等待下层的多个嵌套异步依赖项解析完成&#xff0c;并可以在等待时渲染一个加载状态。 异步依赖​ 要了解 <Suspense> 所解决的问题和它是如何与异步依赖进行交…

自助企业建站模板网络营销平台的主要功能

构造函数初始化列表以一个冒号开始&#xff0c;接着是以逗号分隔的数据成员列表&#xff0c;每个数据成员后面跟一个放在括号中的初始化式。例如&#xff1a;[cpp] view plaincopyclass CExample { public: int a; float b; //构造函数初始化列表 CExampl…

WinReanimator恶意软件清除指南:详细步骤与工具使用

本文详细介绍了WinReanimator流氓安全程序的危害特征,并提供了使用Malwarebytes Anti-Malware工具进行扫描和清除的完整操作步骤,帮助用户彻底移除该恶意软件及相关感染文件。如何清除WinReanimator(清除指南) 该程…

Git的使用技巧 - 教程

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

251006

目录JT-JY7T2S1-1JT-JY6T2S1-2FT-(TED&VOAs) JT-JY7T2S1-1Hello, Motor insurance departemnt. Oh, hello, id like to ask about insurace for my car. Yeah, of course, i was just take a few detailes, whats …

2025国庆Day5

模拟赛 T1 枚举b3 n^2 处理出a_b1^a_b2=x的所有情况(满足b2<i) 然后枚举b4,计算答案 #include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<cmath> #…

网站建设项目功能需求分析报告wordpress克隆菜单

第一题&#xff1a;打酱油 小明带着 N 元钱去买酱油。 酱油 10 块钱一瓶&#xff0c;商家进行促销&#xff0c;每买 3 瓶送 1 瓶&#xff0c;或者每买 5 瓶送 2 瓶。 请问小明最多可以得到多少瓶酱油。 输入格式 输入的第一行包含一个整数 N&#xff0c;表示小明可用于买酱油的…

南宁京象建站公司江苏威达建设有限公司网站

一&#xff0c;iOS覆盖率报告生成逻辑 iOS覆盖率报告生成与Android有很大的不同&#xff0c;主要的生成逻辑如下&#xff1a; 1&#xff0c;将profraw文件&#xff0c;通过命令xcrun llvm-profdata merge -sparse转换成profdata; 2&#xff0c;再将profdata文件&#xff0c;通…

字节跳动开源图标库:2000+图标一键换肤的魔法 - 教程

字节跳动开源图标库:2000+图标一键换肤的魔法 - 教程pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas&qu…

Photoshop启用钢笔绘制图形

Photoshop启用钢笔绘制图形pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", …