6.2 代码发布与部署:从脚本到App


6.2 代码发布与部署:从脚本到 App

本节摘要:交付形态随受众演化:给自己留脚本,给同行发实时脚本报告,给团队做 App,给没有 Matlab 的客户发独立程序。本节讲四类交付形态的做与选、App 设计器的基本套路、编译部署的授权约束,以及可复现交付的工程习惯。

受众决定形态

算法写完只是完成一半,"给谁用"决定另一半。回放演化线:最早只有脚本,交付靠拷文件;教学与汇报需求催生实时脚本(文字、公式、代码、结果同页);非程序员同事需要点按钮的界面,催生 App 设计器;客户环境不装 Matlab,催生编译器与运行时。四代形态并存,各有其位:

形态 受众 优点 局限
脚本/函数 自己、Matlab 用户 零成本 受众窄
实时脚本 同行、学生 可读性强、结果内嵌 格式约束多
App 团队、非程序员 界面友好、无需懂代码 开发与维护成本
独立程序 客户现场 无需 Matlab 授权 需编译、体积大、更新麻烦

图 交付形态的演化与受众

图 交付形态的演化与受众

实时脚本:最小代价的报告

实时脚本把第 2 章的节区脚本升级为带格式文档:控件(滑块、下拉框)让参数即调即见。汇报分析结果时,实时脚本优于截屏拼图——审阅者能改参数复算,这是可复现性的直接体现。

App:界面即接口

App 设计器拖控件、设回调,背后生成的是面向对象的程序。核心套路是"控件—回调—共享状态":

function AnalyzeButtonPushed(app, event) fs = app.SampleRateDropDown.Value; % 读控件 x = app.SignalData; % 共享属性存数据 app.ResultUIAxes; % 画到专属坐标区 plot(app.ResultUIAxes, ... (0:numel(x)-1)/fs, x); end

设计上值得克制:控件只暴露真正需要动的参数,其余写死在代码里。界面上每多一个旋钮,就多一个用户能拧错的地方。

完整案例:把滤波脚本长成一个 App

走一遍真实的小型交付。背景:实验室有台测试台,工艺员每天要滤波看波形,但不会用 Matlab。方案是把 3.3 节的滤波脚本包装成三点控件的 App:下拉框选截止频率、按钮触发分析、坐标区显示结果。

第一步,先在脚本里把逻辑做成纯函数——界面代码与计算代码分离,是 App 可维护的第一原则:

function [y, d] = lpAnalyze(x, fs, fc) % 低通分析:计算与界面完全解耦,命令行同样可调 d = designfilt('lowpassfir', ... 'PassbandFrequency', fc*0.8, ... 'StopbandFrequency', fc*1.2, 'SampleRate', fs); y = filtfilt(d, x); end

第二步,在 App 设计器里摆三个控件(下拉框、按钮、坐标区),回调只做"读控件—调函数—画结果":

function AnalyzeButtonPushed(app, ~) fc = str2double(app.FcDropDown.Value); % 读界面参数 [y, d] = lpAnalyze(app.rawData, app.fs, fc); plot(app.ResultUIAxes, app.rawData); hold(app.ResultUIAxes, 'on') plot(app.ResultUIAxes, y, 'LineWidth', 1.2) legend(app.ResultUIAxes, {'原始','滤波后'}) end

第三步是交付验证:把原始数据、lpAnalyze、App 三者放进同一项目文件夹,在一台只装基础 Matlab 的干净机器上试装试跑。结果与解读:工艺员拿到的是"选频率、点按钮"的两步操作,一周后他们开始要求加"导出图片"按钮——交付物一旦好用,需求会自己长出来,这是所有交付形态共同的演化规律。变式:若客户机器完全没有 Matlab,就用编译器把 App 打成独立安装包,依赖里会出现信号处理工具箱(designfilt 所需),打包前照 5.2 的授权清单核对即可。

交付物里的可复现习惯

无论哪种形态,交付时随包带三样东西能省掉大量售后:一份记录核心与工具箱版本的说明(从 ver 输出裁剪);一组能自动跑通的样例数据与期望输出(拿 2.3 的断言思路写成自检脚本);参数默认值的一份注释表。客户回报"结果不对"时,第一步让他跑自检脚本——自检通过说明代码环境无恙,问题在数据或参数;自检失败则是环境差异,对照版本说明逐项排查。这套流程把"远程猜谜"变成"二分定位",是工程交付里性价比最高的几十行代码。

版本更新则是交付物的长期命题。客户现场跑着两年前打包的程序,你的代码已经迭代了三十版——这不是异常而是常态。可持续的做法是给每次打包编号并记录变更摘要,重大改动先在侧翼环境并行部署验证,再替换正式版本;回滚方案(保留上一版安装包)在每次升级前就位。交付物的生命周期管理,占交付总成本的比例会随年限不断上升,越早形成习惯越省。

独立程序与授权约束

编译器(MATLAB Compiler)把 App 或函数打成安装包,目标机器装免费的运行时即可执行。两个约束要提前想清楚:体积——运行时数百兆起,轻量交付不划算;依赖——打包时用到的每个工具箱都要相应授权,这正是 5.2 节那句"授权约束优先于开发体验"的落点。轻量替代是 Web App 服务器:部署一次、浏览器访问,客户机零安装。

⚠️ 常见坑:交付物在客户机器上因缺工具箱运行失败。打包日志会列出全部依赖,交出去之前照单核对授权清单,比事后远程排障便宜一个数量级。

本节要点回顾

  • 四类形态各有其位,受众与维护成本同向增长;
  • 实时脚本是最便宜的可复现报告,控件让审阅者能复算;
  • App 三件套:控件、回调、共享状态;控件越少越稳;
  • 编译交付查依赖授权,打包日志是核对清单;
  • Web App 免安装,是客户环境的新一代轻量选项。

作者与出处
原作者: 灏天文库
来源:灏天文库
整理: 灏天文库整理
由灏天文库平台收录,内容或由平台用户上传,仅供学习交流
发布者: 作者: 灏天文库 转发
评论区 (0)
U