[lua]再版jobSchedule与脚本描述范型
首先贴上代码
-- CPM:关键路径法(Critical Path Method)
jobSchedule = {
todos = {
-- todo list ...
["finale"] = function()end;
};
schedule = function ( self, task, ... ) --由具体job构造任务列表
local finale = false
local msg = nil
local rc = nil
local params = table.pack(self, task, ...)
repeat
local task = params[];
local fn = self.todos[task]
if type(fn) == "function"
then rc = fn(table.unpack(params, )) end
finale = (task == "finale")
msg = self.name.."["..task.."] done!"
if not finale
then
-- yield 传回进度描述及任务反馈
-- 打包调度入参
params = table.pack(coroutine.yield(msg, rc))
end
until finale
self.co = nil -- over
return msg, rc
end;
perform = function ( self, task, ... )
local co = self.co or coroutine.create(self.schedule)
if self.co == nil
then self.co = co end
return coroutine.resume(co, self, task, ...)
end;
}--jobSchedule
---------------------------------------------------------------
--记得华罗庚的统筹方法论对烧水泡茶的描述过程
--就是多任务协调的执行程序
--示例:project, another两项任务节点的调度与描述
--{}, 构造描述的脚本模式
local project = {
name = "projectSample";
todos = {
["stage1"] = function()
end;
["stage2"] = function()
end;
["stage3"] = function()
end;
["finale"] = function()end;
};
perform = jobSchedule.perform;
schedule = jobSchedule.schedule;
}
--记得区分对象调用与域调用,一不小心就写成. 就无法识别self了
print(project:perform("stage1"))
--creator, object based; 基于创建对象,对象扩展的脚本模式
function jobSchedule:Base() -- for the override method
local meta = getmetatable(self)
return meta and meta.__index
end
function jobSchedule.create( name, todos ) -- 生产工厂
local o = {name = name, todos = todos}
return setmetatable(o, {__index = jobSchedule})
end
local another = jobSchedule.create(
"anotherProject", {
["stage1"] = function()
end;
["stage2"] = function()
end;
["finale"] = function()end;
})
print(another:perform("stage1"))
print(project:perform("stage2"))
print(project:perform("stage3"))
local another_perform = another.perform -- back up for override it.
function another:perform( ... ) -- example method override
print("[override] another:perform called")
-- return another:Base().perform(self, ...)
return another_perform(self, ...)
end
print(another:perform("stage2"))
print(project:perform("finale"))
print(another:perform("finale"))
描述jobSchedule模型
上一篇已记录过jobSchedule脚本初稿;主题就是协同式多任务与并发性事务关系。
jobSchedule就是为了描述清楚现实中关于项目计划与进度管理的一类程式化思维方法。
现实中思维,对于工作的计划与实施的方案求解,通常认为是以下步骤:
- 工作内容划分
- 依赖归类
- 时间预估
- 优先级
- 寻找最佳工作路径
- 矩阵式搜索:寻求最优可行方案
- 方案选择:制定计划
jobSchedule脚本意义就是提倡基于这类思维方式解决问题。合理化流程制定,清晰化脚本描述。
描述范型见解
脚本语言往往是提供更强有力的描述性方法;能够把过程描述清楚及把范围规划清晰,问题就已经得到解决了。
提供过程描述能力是脚本语言的主要目的,除了脚本之外的描述语言多为xml描述内容结构与依赖,json描述对象数据与结构,css……
js融合了json描述与脚本能力;
同样,lua也是这样一种强有力的法器;驾驭它的人可称谓脚本世界的巫师。
通常脚本都是提供结构化描述能力和基于对象模型的组织访问,基本的function过程描述。
脚本工作不只是构建过程,更强调内组织方式。以下主要列举三点关键
对象构造的描述
local project = {
name = "projectSample";
todos = {
["stage1"] = function()
end;
["stage2"] = function()
end;
["stage3"] = function()
end;
["finale"] = function()end;
};
perform = jobSchedule.perform;
schedule = jobSchedule.schedule;
}
最直明简洁的构造表达,就是{}赋值示意,现值构造最好如此;对象构造对外方法最好预先注释声明于其中。
生产方式
--creator, object based; 基于创建对象,对象扩展的脚本模式
function jobSchedule:Base() -- for the override method
local meta = getmetatable(self)
return meta and meta.__index
end
function jobSchedule.create( name, todos ) -- 生产工厂
local o = {name = name, todos = todos}
return setmetatable(o, {__index = jobSchedule})
end
local another = jobSchedule.create(
"anotherProject", {
["stage1"] = function()
end;
["stage2"] = function()
end;
["finale"] = function()end;
})
对外产生一类功能对象,最好像这样提供对外一个生产对象通过特定的方法创造新实例。实例在运行过程中,又将允许动态扩展与改造;
对象改造
local another_perform = another.perform -- back up for override it.
function another:perform( ... ) -- example method override
print("[override] another:perform called")
-- return another:Base().perform(self, ...)
return another_perform(self, ...)
end
这就说明对象功能方法的改造。这里说明了两方式改造原有方法;注释中的使用的方式依赖上文,只是为了效仿类化语言的一致化基类方法调用,并无大义。
对象扩展:装备其他特性
这里单独声明一个标题来强调脚本语言中对象的可塑性。
简单扩展
最基本的再简单不过,字段赋值表示。
组件化扩展
#sum.lua--
local fn = {
-- sum: 求和
}
function fn:sum( )
local sum =
local array = self
for i=, #array do sum = sum+array[i] end
return sum
end
function fn.install( target )
local meta_= getmetatable(target)
if not meta_ then
setmetatable(target, setmetatable({}, {__index=fn}))
else
meta_.__index
end
end
function fn.uninstall( target )
end
return fn
#target.lua--
local array = {, , , , , }
require("sum").install(array)
print(array:sum())
--接近现实思维的操作描述。
[lua]再版jobSchedule与脚本描述范型的更多相关文章
- 利用传入的Type类型来调用范型方法的解决方案
起因:自定义一个GridView控件,其数据源来源于一个通用方法Get<T>(),根据你传入的T到数据库中得到相应的数据,问题是定义GridView控件时没法在界面端设置使用泛型,只能在每 ...
- 为什么Java不允许创建范型数组
问题示例 List<Integer>[] intListArr = new ArrayList<Integer>[8]; // 编译时报错 能看到这么看似没啥问题的一个简单语句 ...
- java范型集合中的成员排序
范型集合中的类是JsonObject,不是自定义类,如果是自定义类就直接取要比较的字段值. ArrayList<JSONObject> TList = new ArrayList<J ...
- Java范型随笔
最近在帝都好无聊啊, 排遣寂寞就只有让自己不要停下来,不断的思考了 QWQ; 最近做ndk, java有点忘了,突然看到了一些java范型方面的问题, 踌躇了一会, 想着想着,决定还是写个随笔记录下来 ...
- C# 利用范型与扩展方法重构代码
在一些C#代码中常常可以看到 //An Simple Example By Ray Linn class CarCollection :ICollection { IList list; public ...
- Linux命令之dot - 绘制DOT语言脚本描述的图形
本文链接:http://codingstandards.iteye.com/blog/840055 用途说明 Graphviz (Graph Visualization Software的缩写)是一个 ...
- Java Comparator的范型类型推导问题
问题 在项目中,有一处地方需要对日期区间进行排序 我需要以日期区间的开始日为第一优先级,结束日为第二优先级进行排序 代码 我当时写的代码如下: List<Pair<LocalDate, L ...
- Java范型
泛型不用考虑对象的具体类型.优点在于,因为不用考虑对象的具体类型所以可以对一类对象执行一定的相同操作:缺点在于,因为没有考虑对象的具体类型所以就不能使用对象自带的接口函数.泛型的最佳用同是实现容器类. ...
- Java数组协变与范型不变性
变性是OOP语言不变的大坑,Java的数组协变就是其中的一口老坑.因为最近踩到了,便做一个记录.顺便也提一下范型的变性. 解释数组协变之前,先明确三个相关的概念,协变.不变和逆变. 一.协变.不变.逆 ...
随机推荐
- phpDesigner 7.2.5 注册码 更改 语法高亮 主题
注册码: 用户名:www.xiazaiba.com 序列号:43AB0D432A29EE238CCE0F884D84D8A18498498E98298A98568AD05A0B40 验证码:7S2FF ...
- nyoj 757 期末考试【优先队列+贪心】
期末考试 时间限制:1000 ms | 内存限制:65535 KB 难度:2 描述 马上就要考试了,小T有许多作业要做,而且每个老师都给出来了作业要交的期限,如果在规定的期限内没 交作业就会扣 ...
- hdoj 2647 N!Again
N!Again Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Sub ...
- 捕获 PHP 致命错误 Fatal Errors
register_shutdown_function()函数都将会你的程序执行完后执行,无论你的程是否运行正常. 所以,在这个函数前执行任何操作我们都要检查是否真的有致命错误出现.如果出现致命错误,我 ...
- storm的acker机制理解
转载请注明原创地址http://www.cnblogs.com/dongxiao-yang/p/6142356.html Storm 的拓扑有一些特殊的称为"acker"的任务,这 ...
- AppiumLibrary实用函数介绍
1. 点击按钮: Click Button index_or_name Click button 实例:Click Button index=0 作者通过实验发现在安卓手机应用测试中,name这个属性 ...
- 如何解决因为找不到Notepad++的安装路径而导致的不能更新CS-Script的问题
博客搬到了fresky.github.io - Dawei XU,请各位看官挪步.最新的一篇是:如何解决因为找不到Notepad++的安装路径而导致的不能更新CS-Script的问题.
- CodeIgniter开发实际案例-新闻网站【转】
CodeIgniter开发实际案例-新闻网站 转:http://blog.csdn.net/ict2014/article/details/22104711?utm_source=tuicool&am ...
- 统计学习导论:基于R应用——第三章习题
第三章习题 部分证明题未给出答案 1. 表3.4中,零假设是指三种形式的广告对TV的销量没什么影响.而电视广告和收音机广告的P值小说明,原假设是错的,也就是电视广告和收音机广告均对TV的销量有影响:报 ...
- hdu1864 最大报销额(01背包)
转载请注明出处:http://blog.csdn.net/u012860063 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1864 Problem ...