编程规范

差異處

這裏顯示兩個版本的差異處。

連向這個比對檢視

下次修改
前次修改
wiki:自动化与科技指导:opencomputers:编程规范 [2023/12/08 16:20] – 建立 nikoqwwiki:自动化与科技指导:opencomputers:编程规范 [2023/12/11 11:33] (目前版本) – [总旨] nikoqw
行 1: 行 1:
-<WRAP center round info 60%> 
-本规范是非强制的,但强烈建议你遵守。 
-</WRAP> 
- 
 ====== 编程规范 ====== ====== 编程规范 ======
 为了能够配合既有代码使用,合理利用服务器资源,所有程序必须遵守本编程规范。  为了能够配合既有代码使用,合理利用服务器资源,所有程序必须遵守本编程规范。 
  
 ===== 总旨 ===== ===== 总旨 =====
-开放式电脑的程序需要基于事件驱动能够“干净”地终止,做到低耦合高内聚、尽量运用库的功能,不要自己实现即有库已实现的功能。+开放式电脑的程序需要: 
 +  * 基于事件驱动。 
 +  * 如果程序能够被终止(即非除了切断电源才能停止程序),则必须能够 “干净” 地终止。 
 +  * 没有资源(如文件句柄)泄露。 
 +  * 低耦合高内聚、尽量运用库的功能,不要自己实现即有库已实现的功能。
  
 具体来说,规则如下: 具体来说,规则如下:
-  * 非后台程序中,使用event.pull系列函数处理事件。只有后台程序才可以使用event.listen函数。 +  * 如无特殊要求,使用 local 变量和函数。 
-  * 无论是否为后台程序,键鼠事件必须使用event.pull系列函数处理。目的是为了退出程序后键鼠事件不再被处理。 +  * 非后台程序中,使用 ''event.pull'' 系列函数处理事件。只有后台程序才可以使用 ''event.listen'' 函数。 
-  * 如无特殊要求,使用local变量和函数。 +  * 无论是否为后台程序,键鼠事件必须使用 ''event.pull'' 系列函数处理。目的是为了退出程序后键鼠事件不再被处理。 
-  * 必须能够处理interrupted事件,非后台程序中,处理的行为是注销所有事件、定时器、文件句柄等,然后退出整个程序;后台程序中,处理的行为是简单地退出。 +  * 必须能够处理 interrupted 事件,非后台程序中,处理的行为是注销所有事件、定时器、文件句柄等,然后退出整个程序;后台程序中,处理的行为是简单地退出。 
-  * 后台程序中,必须监听一个事件。该事件触发后能注销所有事件、定时器、文件句柄等,从而“干净”地退出后台程序。 +  * 后台程序必须监听一个事件。该事件触发后能注销所有事件、定时器、文件句柄等,从而 “干净” 地退出后台程序。 
-  * 后台程序中,必须监听一个事件。该事件触发后能让后台程序恢复显示和处理键鼠事件。+  * 后台程序必须监听一个事件。该事件触发后能让后台程序恢复显示和处理键鼠事件。
  
 ===== 示例 ===== ===== 示例 =====
-**1.1 一个简单的前台程序**+建议您在编写 OpenComputer 程序时,直接复制示例中的代码作为开始模板,然后在此基础上实现您的逻辑。 
 +====1.1一个简单的前台程序====
 <code LUA> <code LUA>
 local timer = event.timer(1000, local function()  -- 定时器 local timer = event.timer(1000, local function()  -- 定时器
行 38: 行 39:
 </code> </code>
  
-**1.2 一个稍微复杂的前台程序**+====1.2一个稍微复杂的前台程序====
 <code LUA> <code LUA>
 local timer = event.timer(1000, local function()  -- 定时器 local timer = event.timer(1000, local function()  -- 定时器
行 60: 行 61:
             ["interrupted"] = local function()             ["interrupted"] = local function()
                 print("soft interrupt! closing...");                 print("soft interrupt! closing...");
-                -- 这儿不能退出!在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 中一样。<wrap cjk-em>在大部分时刻你不需要让多个程序同时在 opencomputers 上执行</wrap>。因为 opencomputers 的主要目的是为工业控制以及自动化(即通常有一个固定的职责),而不是当作一个个人电脑来使用。 在没有多任务操作系统的情况下编写在后台运行的程序是很麻烦、很原始的。您需要完全手动处理应用程序切入后台、恢复前台的所有逻辑,就如同在 DOS 中一样。<wrap cjk-em>在大部分时刻你不需要让多个程序同时在 opencomputers 上执行</wrap>。因为 opencomputers 的主要目的是为工业控制以及自动化(即通常有一个固定的职责),而不是当作一个个人电脑来使用。
 </WRAP> </WRAP>
 <WRAP center round alert 60%> <WRAP center round alert 60%>
-本代码没有经过实际测试,应该无法符合预期运作。本代码的作用仅仅是供您参考和学习操作系统原理,以及给予一个在OC中的bare bones的多任务的大致实现和思想。+本代码没有经过实际测试,应该无法符合预期运作。本代码的作用仅仅是供您参考和学习操作系统原理,以及给予一个在 OC 中的 bare bones 的多任务的大致实现和思想。
 </WRAP> </WRAP>
  
行 97: 行 98:
 end); end);
  
-local pullInputThread = nil;  -- 一个处理输入事件的“线程”——只执行一次的timer+local pullInputThread = nil;  -- 一个处理输入事件的 “线程” ——只执行一次的 timer
  
 local redstoneEventHandler = event.listen("redstone_changed", local function(addr, side) local redstoneEventHandler = event.listen("redstone_changed", local function(addr, side)
行 103: 行 104:
 end); end);
  
--- 监听将程序至于后台/前台的键盘事件+-- 监听将程序至于后台 / 前台的键盘事件
 local hideShowKeyEventHandler = event.listen("key_up", local function(addr, char) local hideShowKeyEventHandler = event.listen("key_up", local function(addr, char)
     -- 如果按下小键盘0,唤起应用     -- 如果按下小键盘0,唤起应用
行 110: 行 111:
         event.push("hide_all_programs");        -- 通知其他程序隐藏自己         event.push("hide_all_programs");        -- 通知其他程序隐藏自己
  
-    -- 如果按下小键盘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("hide_all_programs", local function() local hideAllProgramsEventHandler = event.listen("hide_all_programs", local function()
     hide();     hide();
行 123: 行 124:
 function hide() function hide()
     ifHide = true;     ifHide = true;
-    event.cancel(pullInputThread);  -- 强制终止正在执行的pullInput函数+    event.cancel(pullInputThread);  -- 强制终止正在执行的 pullInput 函数
     os.exit(0);                     -- 直接退出     os.exit(0);                     -- 直接退出
 end end
行 130: 行 131:
 function show() function show()
     ifHide = false;     ifHide = false;
-    dumpOutBuffer();                -- 将程序的输出dump到屏幕上 +    dumpOutBuffer();                -- 将程序的输出 dump 到屏幕上 
-    pullInputThread = event.timer(0, pullInput, 1);    -- 执行pullInput“线程”+    pullInputThread = event.timer(0, pullInput, 1);    -- 执行 pullInput “线程”
 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);  -- 注销hide_all_programs信号的回调+    event.ignore(hideAllProgramsEventHandler);  -- 注销 hide_all_programs 信号的回调
 end end
  
wiki/自动化与科技指导/opencomputers/编程规范.1702023601.txt.gz · 上一次變更: 2023/12/08 16:20 由 nikoqw
GNU Free Documentation License 1.3 若無特別註明,本 wiki 上的內容都是採用以下授權方式: GNU Free Documentation License 1.3