跟着AI了解软件开发
|
|
第一步:先理解核心灵魂——【公共变量】
把它想象成餐厅前台的黑板(或广播)。
-
内涵(它是什么): 就是一块所有人都能看见和修改的黑板。比如上面写着“今日例汤:排骨汤”。
-
外延(它能影响谁): 所有进出的员工(后厨、服务员、收银员)都能看到并改动它。
-
作用(好处): 方便!如果汤变了,服务员不用挨个通知,只要在黑板上改一下就行。
-
风险(坏处): 灾难!如果收银员心情不好,随手把“排骨汤”改成“泔水”,后厨真按这个做,端给客人,餐厅就完了。
-
使用方法(怎么用好): 规矩要严!必须规定“只有店长(主程序)有权改黑板,其他人只能看”。或者,谁要改,必须登记签名。
第二步:再看餐厅的“工具”和“部件”
理解了黑板,其他概念就全是围绕它运转的工具了。
|
|
|
|
|---|---|---|
| 函数 | 食谱/菜谱 |
|
| 接口 | 服务员点单机 |
|
| 服务 | 专门的档口(凉菜间/面点间) |
|
| 容器 | 一次性打包盒 |
|
| 容器镜像 | 打包盒的“模具” |
|
| 架构 | 餐厅的图纸设计(动线) |
|
| 部署 | 把厨具搬进新店并通水电气 |
|
| 安装 | 固定灶台、接通水管 |
|
| 环境 | 厨房的温度、湿度、电压 |
|
| 界面 | 给客人看的菜单牌 |
|
第三步:他们之间的“父子”关系(如何串起来)
咱们倒着理一遍:
-
你(用户)看到的是界面(漂亮的菜单)。
-
你点菜,是通过接口(下单)下单。
-
接口调动后厨,执行函数(菜谱)做菜。
-
为了做大生意,餐厅分了多个服务(凉菜/热菜)。
-
这些服务被塞进容器(打包盒),并根据容器镜像复制。
-
整个餐厅的动线叫架构。
-
装修搬东西叫部署和安装。
-
所有这些都必须在合适环境(电压稳定)下运行。
-
而那块写着“今日例汤”的公共变量,是贯穿所有环节的通告,大家都得看它。
第四步:给菜鸟的“偷懒”学习法
您不用去学写代码。要理解教授的问题,您只需要记住三句话:
-
公共变量是“魔鬼”:问教授:“咱们项目里的公共变量,有设置写保护吗?防止误改?” 这一句话就能让教授觉得您懂行。
-
接口比实现重要:你不需要知道内部怎么算的,只需要知道“给什么输入,得到什么输出”。
-
环境不一致是最大坑:本地跑得好好的,一上线就崩——99%是“环境”差异。
给您的建议:下次教授再提这些,您就盯着“公共变量”问:“这块黑板谁有权限擦?”以及“接口”问:“我调这个接口,返回给我的是什么数据?”只要能搞清这两个,您就抓住了软件开发最核心的“钥匙”。
然后我再追问Deepseek:公共变量的学术定义是什么呢?
一、学术定义
公共变量(在编程术语中通常称为全局变量 Global Variable 或公共字段 Public Field),其学术定义为:
在程序的所有作用域(Scope)中均可直接访问和修改的变量。它不属于任何一个特定的函数、类或局部代码块,而是归属于整个程序或整个命名空间(Namespace)。
拆解这个定义中的关键术语:
|
|
|
|
|---|---|---|
| 作用域(Scope) |
{} 内有效,而公共变量在程序任何位置都有效。 |
|
| 生命周期 |
|
|
| 全局命名空间 |
|
|
二、学术文献中的相关概念
在软件工程和编程语言理论中,围绕“公共变量”还有几个相关的学术术语:
-
全局状态(Global State)公共变量是全局状态的一种具体实现形式。学术上认为,全局状态是导致程序复杂性的主要来源之一,因为它使得程序的各个部分之间产生了隐式耦合(Implicit Coupling)——即你改一个地方,可能影响完全不相干的另一个地方,而这种影响在代码表面看不出来。
-
共享可变性(Shared Mutability)这是学术上对公共变量风险的精确描述。意思是:多个模块共享同一个变量,且该变量可以被修改(Mutable)。这种组合是并发编程中竞态条件(Race Condition) 和数据不一致的根本原因。
-
可见性(Visibility)在面向对象编程中,用
public修饰符声明的字段或属性,意味着它具有最高的可见性级别(相对于private私有的、protected受保护的)。学术上将可见性视为一种访问控制机制,而public意味着放弃了这种控制。
三、学术角度的“三性”分析
|
|
|
|
|---|---|---|
| 内涵 |
|
|
| 外延 |
public、global 或在顶层作用域中定义的变量,包括全局常量、全局配置参数、单例对象中的公共属性等。 |
|
| 风险 |
|
|
四、学术界的主流共识(规范)
在计算机科学经典著作(如《代码大全》《设计模式》《重构》)中,对公共变量使用的学术共识是:
“除非绝对必要,否则应避免使用公共变量。优先使用局部变量、参数传递或封装后的访问方法(Getter/Setter)来代替。”
具体规范:
-
如果必须使用,应将其声明为只读(Readonly) 或常量(Const),禁止外部修改。
-
在并发环境下,必须通过同步机制(如锁、原子操作) 保证线程安全。
-
在架构设计上,建议将公共变量集中存放在一个专门的配置模块中,而不是散落在各处。
五、一句话学术总结
公共变量是拥有全局可见性和全生命周期的共享存储单元,它破坏了模块之间的信息隐藏,是导致程序耦合度升高和维护成本增加的主要结构因素。在工程实践中应严格控制其使用,并通过封装、只读化或参数传递等模式来规避其风险。
我再追问了:从学术观点来看,什么函数的内涵,外延,作用,风险以及使用方法呢?
一、学术定义(内涵)
函数(在纯学术领域常称子程序 Subroutine 或方法 Method),其标准定义为:
函数是一段被命名的、可重复调用的代码块,它接收零个或多个输入参数(Input),执行特定的计算或操作,并返回一个输出结果(Output)。其核心特征是“单一职责”和“黑盒封装”。
拆解这个定义中的四个学术灵魂:
|
|
|
|
|---|---|---|
| 命名(Name) |
|
|
| 输入(参数) |
|
|
| 处理(逻辑) |
|
|
| 输出(返回值) |
|
|
二、函数的外延(包含哪些具体形式)
在学术和工程实践中,函数的外延非常广泛:
-
纯函数(Pure Function):输入相同则输出必然相同,且无任何副作用(不修改外部状态)。这是函数式编程的基石。
-
递归函数(Recursive Function):在函数体内部调用自身的函数,用于解决分治类问题(如遍历树形结构)。
-
匿名函数(Lambda/闭包):没有函数名的函数,常作为参数传递给其他函数。
-
回调函数(Callback):作为参数传入,并在某个事件发生后被“叫回来”执行的函数。
-
构造函数(Constructor):面向对象编程中用于创建和初始化对象的特殊函数。
-
API函数(接口函数):对外开放的、供其他系统调用的函数。
三、函数的作用(为什么它是伟大的发明)
|
|
|
|
|---|---|---|
| 代码复用 |
|
|
| 模块化分解 |
|
|
| 信息隐藏 |
|
|
| 可测试性 |
|
|
| 抽象层次 |
|
|
四、函数的风险(即使这么好的东西也有坑)
|
|
|
|
|---|---|---|
| 副作用(Side Effect) |
|
|
| 过长的参数列表 |
|
|
| 高耦合(High Coupling) |
|
|
| 过度嵌套 |
|
|
| 性能损耗 |
|
|
五、函数的学术使用方法(最佳实践规范)
根据软件工程经典著作(《代码大全》《重构》《Clean Code》),函数使用的学术共识如下:
|
|
|
|
|---|---|---|
| 单一职责 |
|
|
| 短小精悍 |
|
|
| 避免副作用 |
|
updateUser())。 |
| 参数数量 |
|
|
| 命名规范 |
|
getUserInfo()
calculateTotal(),一看就懂。 |
| 防御性编程 |
|
|
| 单一出口 |
return 语句 |
|
六、一句话学术总结
函数是软件工程中实现“分而治之”的核心工具,它通过封装逻辑、隐藏信息、提供可复用的抽象接口,极大地降低了系统的复杂度。良好的函数设计遵循“高内聚、低耦合、无副作用”三大原则。函数设计的好坏,直接决定了软件的可维护性和可扩展性。
七、给您的“菜鸟”实战锦囊
下次教授再聊函数,您就盯着这三个问题问,一听就是懂行的:
-
“这个函数有副作用吗?它会不会偷偷改公共变量?” —— 这是函数设计最关键的问题。
-
“这个函数能单独做单元测试吗?” —— 不能独立测试的函数就是坏函数。
-
“参数能不能封装成一个对象传入?” —— 参数超过3个,说明设计偷懒了。
|
|

夜雨聆风