差異處
這裏顯示兩個版本的差異處。
| 下次修改 | 前次修改 | ||
| wiki:自动化与科技指导:opencomputers:编程规范 [2023/12/08 16:20] – 建立 nikoqw | wiki:自动化与科技指导:opencomputers:编程规范 [2023/12/11 11:33] (目前版本) – [总旨] nikoqw | ||
|---|---|---|---|
| 行 1: | 行 1: | ||
| - | <WRAP center round info 60%> | ||
| - | 本规范是非强制的,但强烈建议你遵守。 | ||
| - | </ | ||
| - | |||
| ====== 编程规范 ====== | ====== 编程规范 ====== | ||
| 为了能够配合既有代码使用,合理利用服务器资源,所有程序必须遵守本编程规范。 | 为了能够配合既有代码使用,合理利用服务器资源,所有程序必须遵守本编程规范。 | ||
| ===== 总旨 ===== | ===== 总旨 ===== | ||
| - | 开放式电脑的程序需要基于事件驱动、能够“干净”地终止,做到低耦合高内聚、尽量运用库的功能,不要自己实现即有库已实现的功能。 | + | 开放式电脑的程序需要: |
| + | * 基于事件驱动。 | ||
| + | * 如果程序能够被终止(即非除了切断电源才能停止程序),则必须能够 “干净” 地终止。 | ||
| + | * 没有资源(如文件句柄)泄露。 | ||
| + | * 低耦合高内聚、尽量运用库的功能,不要自己实现即有库已实现的功能。 | ||
| 具体来说,规则如下: | 具体来说,规则如下: | ||
| - | * 非后台程序中,使用event.pull系列函数处理事件。只有后台程序才可以使用event.listen函数。 | + | |
| - | * 无论是否为后台程序,键鼠事件必须使用event.pull系列函数处理。目的是为了退出程序后键鼠事件不再被处理。 | + | |
| - | * 如无特殊要求,使用local变量和函数。 | + | * 无论是否为后台程序,键鼠事件必须使用 |
| - | * 必须能够处理interrupted事件,非后台程序中,处理的行为是注销所有事件、定时器、文件句柄等,然后退出整个程序;后台程序中,处理的行为是简单地退出。 | + | * 必须能够处理 interrupted 事件,非后台程序中,处理的行为是注销所有事件、定时器、文件句柄等,然后退出整个程序;后台程序中,处理的行为是简单地退出。 |
| - | * 后台程序中,必须监听一个事件。该事件触发后能注销所有事件、定时器、文件句柄等,从而“干净”地退出后台程序。 | + | * 后台程序必须监听一个事件。该事件触发后能注销所有事件、定时器、文件句柄等,从而 “干净” 地退出后台程序。 |
| - | * 后台程序中,必须监听一个事件。该事件触发后能让后台程序恢复显示和处理键鼠事件。 | + | * 后台程序必须监听一个事件。该事件触发后能让后台程序恢复显示和处理键鼠事件。 |
| ===== 示例 ===== | ===== 示例 ===== | ||
| - | **1.1 一个简单的前台程序** | + | 建议您在编写 OpenComputer 程序时,直接复制示例中的代码作为开始模板,然后在此基础上实现您的逻辑。 |
| + | ====1.1. 一个简单的前台程序==== | ||
| <code LUA> | <code LUA> | ||
| local timer = event.timer(1000, | local timer = event.timer(1000, | ||
| 行 38: | 行 39: | ||
| </ | </ | ||
| - | **1.2 一个稍微复杂的前台程序** | + | ====1.2. 一个稍微复杂的前台程序==== |
| <code LUA> | <code LUA> | ||
| local timer = event.timer(1000, | local timer = event.timer(1000, | ||
| 行 60: | 行 61: | ||
| [" | [" | ||
| print(" | print(" | ||
| - | -- 这儿不能退出!在filter函数之中要返回true表示事件被处理了,然后在pullFiltered调用之外退出。 | + | -- 这儿不能退出!在 filter 函数之中要返回 true 表示事件被处理了,然后在 pullFiltered 调用之外退出。 |
| ifTerminate = true; -- 标记事件处理结束后退出 | ifTerminate = true; -- 标记事件处理结束后退出 | ||
| end | end | ||
| 行 81: | 行 82: | ||
| - | **2. 后台程序** | + | ====2. 后台程序==== |
| <WRAP center round box 60%> | <WRAP center round box 60%> | ||
| 在没有多任务操作系统的情况下编写在后台运行的程序是很麻烦、很原始的。您需要完全手动处理应用程序切入后台、恢复前台的所有逻辑,就如同在 DOS 中一样。< | 在没有多任务操作系统的情况下编写在后台运行的程序是很麻烦、很原始的。您需要完全手动处理应用程序切入后台、恢复前台的所有逻辑,就如同在 DOS 中一样。< | ||
| </ | </ | ||
| <WRAP center round alert 60%> | <WRAP center round alert 60%> | ||
| - | 本代码没有经过实际测试,应该无法符合预期运作。本代码的作用仅仅是供您参考和学习操作系统原理,以及给予一个在OC中的bare bones的多任务的大致实现和思想。 | + | 本代码没有经过实际测试,应该无法符合预期运作。本代码的作用仅仅是供您参考和学习操作系统原理,以及给予一个在 OC 中的 bare bones 的多任务的大致实现和思想。 |
| </ | </ | ||
| 行 97: | 行 98: | ||
| end); | end); | ||
| - | local pullInputThread = nil; -- 一个处理输入事件的“线程”——只执行一次的timer | + | local pullInputThread = nil; -- 一个处理输入事件的 “线程” ——只执行一次的 timer |
| local redstoneEventHandler = event.listen(" | local redstoneEventHandler = event.listen(" | ||
| 行 103: | 行 104: | ||
| end); | end); | ||
| - | -- 监听将程序至于后台/ | + | -- 监听将程序至于后台 / 前台的键盘事件 |
| local hideShowKeyEventHandler = event.listen(" | local hideShowKeyEventHandler = event.listen(" | ||
| -- 如果按下小键盘0,唤起应用 | -- 如果按下小键盘0,唤起应用 | ||
| 行 110: | 行 111: | ||
| event.push(" | event.push(" | ||
| - | -- 如果按下小键盘1,完全终止应用 | + | -- 如果按下小键盘 1,完全终止应用 |
| elseif char == keyboard.keys.numpad1 then | elseif char == keyboard.keys.numpad1 then | ||
| terminate(); | terminate(); | ||
| end); | end); | ||
| - | -- 如果收到hide_all_programs信号,隐藏自己。 | + | -- 如果收到 hide_all_programs 信号,隐藏自己。 |
| local hideAllProgramsEventHandler = event.listen(" | local hideAllProgramsEventHandler = event.listen(" | ||
| hide(); | hide(); | ||
| 行 123: | 行 124: | ||
| function hide() | function hide() | ||
| ifHide = true; | ifHide = true; | ||
| - | event.cancel(pullInputThread); | + | event.cancel(pullInputThread); |
| os.exit(0); | os.exit(0); | ||
| end | end | ||
| 行 130: | 行 131: | ||
| function show() | function show() | ||
| ifHide = false; | ifHide = false; | ||
| - | dumpOutBuffer(); | + | dumpOutBuffer(); |
| - | pullInputThread = event.timer(0, | + | pullInputThread = event.timer(0, |
| end | end | ||
| 行 138: | 行 139: | ||
| event.cancel(timer); | event.cancel(timer); | ||
| event.ignore(redstoneEventHandler); | event.ignore(redstoneEventHandler); | ||
| - | event.ignore(hideShowKeyEventHandler); | + | event.ignore(hideShowKeyEventHandler); |
| - | event.ignore(hideAllProgramsEventHandler); | + | event.ignore(hideAllProgramsEventHandler); |
| end | end | ||