首先贴上代码

-- 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. pathmunge /etc/profile

    pathmunge () { case ":${PATH}:" in *:"$1":*) ;; *) if [ "$2" = "a ...

  2. C语言字节对齐 __align(),__attribute((aligned (n))),#pragma pack(n)

    转载地址 : http://blog.csdn.net/21aspnet/article/details/6729724 一.概念    对齐跟数据在内存中的位置有关.如果一个变量的内存地址正好位于它 ...

  3. 非常实用的PHP常用函数汇总

    这篇文章主要介绍了非常实用的PHP常用函数,汇总了加密解密.字符串操作.文件操作.SQL注入等函数的实例与用法说明,在PHP项目开发中非常具有实用价值,需要的朋友可以参考下 本文实例总结了一些在php ...

  4. PAT 1080. Graduate Admission (30)

    It is said that in 2013, there were about 100 graduate schools ready to proceed over 40,000 applicat ...

  5. Linux无处不在

    Linux is Everywhere从政府.教育.商业和非盈利组织.科研机构几个方面展示了现在都有哪些地方用了Linux.

  6. UIBarButtonItem导航栏添加按钮

    1 前言 UIBarButtonItem为导航栏按钮,在导航栏的左侧和右侧,他们具有许多种不同的形状和形式. 2 代码讲解 ZYViewController.m [plain]  (void)view ...

  7. http://poj.org/problem?id=2253

    floyd的应用求每条路径两点之间最大距离的最小值 #include <iostream> #include <cstdio> #include <algorithm&g ...

  8. JAVA中toString方法的作用(转)

    因为它是Object里面已经有了的方法,而所有类都是继承Object,所以“所有对象都有这个方法”. 它通常只是为了方便输出,比如System.out.println(xx),括号里面的“xx”如果不 ...

  9. cocos2d-x plist+wen使用

    http://zhan.renren.com/tag?value=cocos2dx&from=template http://blog.csdn.net/zhanglongit/article ...

  10. Shell变量之自定义变量、环境变量

    1:环境变量        环境变量可以帮我们达到很多功能-包括家目录的变换啊.提示字符的显示啊.运行文件搜寻的路径啊等等的那么,既然环境变量有那么多的功能,问一下,目前我的 shell 环境中, 有 ...