首先贴上代码

-- 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与脚本描述范型的更多相关文章

  1. 利用传入的Type类型来调用范型方法的解决方案

    起因:自定义一个GridView控件,其数据源来源于一个通用方法Get<T>(),根据你传入的T到数据库中得到相应的数据,问题是定义GridView控件时没法在界面端设置使用泛型,只能在每 ...

  2. 为什么Java不允许创建范型数组

    问题示例 List<Integer>[] intListArr = new ArrayList<Integer>[8]; // 编译时报错 能看到这么看似没啥问题的一个简单语句 ...

  3. java范型集合中的成员排序

    范型集合中的类是JsonObject,不是自定义类,如果是自定义类就直接取要比较的字段值. ArrayList<JSONObject> TList = new ArrayList<J ...

  4. Java范型随笔

    最近在帝都好无聊啊, 排遣寂寞就只有让自己不要停下来,不断的思考了 QWQ; 最近做ndk, java有点忘了,突然看到了一些java范型方面的问题, 踌躇了一会, 想着想着,决定还是写个随笔记录下来 ...

  5. C# 利用范型与扩展方法重构代码

    在一些C#代码中常常可以看到 //An Simple Example By Ray Linn class CarCollection :ICollection { IList list; public ...

  6. Linux命令之dot - 绘制DOT语言脚本描述的图形

    本文链接:http://codingstandards.iteye.com/blog/840055 用途说明 Graphviz (Graph Visualization Software的缩写)是一个 ...

  7. Java Comparator的范型类型推导问题

    问题 在项目中,有一处地方需要对日期区间进行排序 我需要以日期区间的开始日为第一优先级,结束日为第二优先级进行排序 代码 我当时写的代码如下: List<Pair<LocalDate, L ...

  8. Java范型

    泛型不用考虑对象的具体类型.优点在于,因为不用考虑对象的具体类型所以可以对一类对象执行一定的相同操作:缺点在于,因为没有考虑对象的具体类型所以就不能使用对象自带的接口函数.泛型的最佳用同是实现容器类. ...

  9. Java数组协变与范型不变性

    变性是OOP语言不变的大坑,Java的数组协变就是其中的一口老坑.因为最近踩到了,便做一个记录.顺便也提一下范型的变性. 解释数组协变之前,先明确三个相关的概念,协变.不变和逆变. 一.协变.不变.逆 ...

随机推荐

  1. 点分治练习: boatherds

    [题面] 求一颗树上距离为K的点对是否存在 输入数据 n,m 接下来n-1条边a,b,c描述a到b有一条长度为c的路径 接下来m行每行询问一个K 输出数据 对于每个K每行输出一个答案,存在输出“AYE ...

  2. Bzoj 2789: [Poi2012]Letters 树状数组,逆序对

    2789: [Poi2012]Letters Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 278  Solved: 185[Submit][Stat ...

  3. hdoj 1269 迷宫城堡【scc基础题目】

    迷宫城堡 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submis ...

  4. HttpURLConnection的流式输出的缺陷和解决方法

    转自:http://www.mzone.cc/article/198.html 最近在用applet写文件上传控件的时候发现使用URLConnection来对服务器进行流式输出时的一些问题.我们通常要 ...

  5. android设备连接不上电脑的解决方法

    先检查手机usb调试是否开启,已经开启还是连不上按照以下步骤操作: 1. 打开cmd,输入adb devices  查看设备是否连接 2.服务未启动,先杀掉服务:adb kill-server 3.启 ...

  6. 修改Tomcat 6 默认的ROOT

    1.找到conf/server.xml. 2.找到Host节点. 3.在该节点中添加子节点<Context path="" docBase="项目名称" ...

  7. Java 加密 base64 encode

    版权声明:本文为博主原创文章,未经博主允许不得转载. [前言] 计算机中的数据都是二进制的,不管是字符串还是文件,而加密后的也是二进制的, 而我们要看到的往往是字符串,本文就介绍了将byte[]转为各 ...

  8. UML要点总结(一)

    UML中的事物 UML事物包含结构事物.行为事物.组织事物和辅助事物. 结构事物: 类.接口.用例.协作.活动类.组件和节点. 行为事物: 也称动作事物,交互和状态机. 组织事物: 也称分组事物,仅仅 ...

  9. ubuntu中安装eclipse 分类: android ubuntu linux 学习笔记 2015-07-07 10:19 75人阅读 评论(0) 收藏

    上一篇说了安装jdk的事,于是趁热打铁,决定把eclipse也安装了. 下载这一系列就不用说了. 下载完成之后: 然后解压,解压之后文件剪切到/usr/software文件夹中,同时重命名为eclip ...

  10. ashx+html+ajax

    HTML: $(function() { ajax("NewsList.ashx", function(resText) { document.getElementById(&qu ...