tangrui.cn: ok
我已经把名字改成 lcore Le
不过还没 commit
Weiming: 我说,怎么没有up到
tangrui.cn: en
lazy load 的暂且先放一放
说那个资源和代码先后的问题
Weiming: 好,这个我觉得需要去调查以下
好
Sent at 10:30 PM on Monday
Weiming: 你不是说了,lazyload的,放一下,我说好,先去调查
tangrui.cn: 就是我上午说,代码文件要是访问资源文件的话,那么资源文件必须在代码文件之前引用
这就要求,比如 longjs.lang.lstring 必须先定义这个类型
Weiming: 上午说的,你说要把定义,单独放在__package__虾米,这个我不同意
如果
longjs.res = {};
然后所有的res,都挂在这个虾米呢?
下面
longjs.res.lstring = {};
long.res.lstring['en'];
这样就有了
Weiming: 就是,现在的res都是单独的
比如lstring的,
那么就是
longjs.lstring['en']这样的
tangrui.cn: res 不能单开命名空间呀
要不然我怎么能知道他放在哪里了
Weiming: 我的意思,res,不是一个单独的命名空间
longjs.lstring['en']这样的
tangrui.cn: 再说把他们放到 longjs.res 下面也不成呀,res 岂不成一个命名空间了
Weiming: res,是一个变量
或者说,应该是
longjs.__res
这样
他只是一个resource的挂节点
从一个逻辑的角度,
tangrui.cn: 那么你的资源就没有层次结构了呀
Weiming: longjs.__res,起始就是统一的管理resource了
还是有的,
只不过,你的原来的没有一个统一的根,现在有了
tangrui.cn: 再说这个东西没有放到前面的,还是那句话,你的资源是要跟类型走的
tangrui.cn: 现在是因为可能有多语言把他们分开,但其是资源和类型是应该在一起的
Weiming: 资源,起始,做成
longjs.lstring['en'];
tangrui.cn: 即便像你说的那样,也应该是 longjs.lang.lstring.__res
Weiming: lstring的res,是否是lstring的一部分?
先不考虑default的
Weiming: 那么,也就是没有res,我可以用lstring
tangrui.cn: 但是需要至少配备 default 的
Weiming: 如果default的实现和其他完全一样
那么也没必要考虑
因为都是一样的
ok,这个地方,咱们没有分歧,就是lstring是可以,并且应该单独使用的
Weiming: 如果,我现在有了res
那么他也应该在lstring加载后,以一种补充的方式
把自己”挂”上去
ok?
Weiming: 那么加载的顺序就定了(先不管怎么实现)
就是先lstring,再是他的res,(如果default和其他的一样,那么同样处理)
Weiming: 在现阶段
咱们已经实现了lstring对longjs的挂接
可以使用这个说法么?
tangrui.cn: 什么叫 lstring 对 longjs 的挂接
Weiming: 如果从一个扩展的角度看,(也许不合适)
就是lstring,是对longjs的一个扩展
tangrui.cn: lstring 毕竟是 longjs native 的 class
不说那么拗口的名词,继续往下
Weiming: ok
反正,就是
现有了longjs,然后又了lstring
Weiming: 并且,lstring,要么有,要么没有
不能说,我有一部分
Weiming: 那么,早晨你说的吧lstring的定义
也就是longjs.lstring = xxx
放在__package__里面,我觉得是不合适的
Weiming: 其实,现在可以说,只有在static method的地方,才会出现
我使用res,但是没有
对吧
Weiming: 我想想
先说结果
就是,这样
longjs.__res.lstring
那么再说我是如何理解
我现在也不知道这样是否合适
就是
现有longjs,后有lstring
longjs。lstring,从某种意义上
认为是lstring挂在longjs上面
那么,这个时候,能否认为
lstring的res,也是在和lstring加载的时候,也是挂在longjs.__res上面的
对于longjs,这些class,他的跟是longjs
对于他们的res,根是longjs.__res
也就是longjs管理所有的class等
longjs
longjs.__res管理所有的res
可否这么认为
tangrui.cn: 你要是这么理解的话,那怎么组织都说得通了
我就算把资源放到 abc.def.hjk.__res.lssssss
Weiming: 我这样说,只是从一个树,变成了两个树
tangrui.cn: 下面我也能说,是在 longjs.lang.lstring 加载的时候挂上去的
但是既然咱么做了一个有层次结构的框架,那就资源也和类型必须在他的可控范围之内
tangrui.cn: 资源与类型不是平行的关系,而是资源从属与类型
tangrui.cn: 所以从组织上也需要是具有从属的层次
ft 又遇到一个问题
这个我觉得咱么明天再说吧,一晚上估计不一定能讨论出来
tangrui.cn: 现在恐怕 lcore.using 要加上一个参数表示所在的 window 了
lcore.using(target, win);
tangrui.cn: 因为原来 lcore.using 没有前面的 lcore 所以
Weiming: 所以,都是本window?
我靠
tangrui.cn: 所以在 using 里面那到 this 就是那个 window
现在,lcore.using 的 this 都是 lcore
tangrui.cn: 如果你强行使用 window 那么这个 window 就是 jsFrame 而不是调用方法的那个 window
除非把 using 前面的 lcore 去掉
否则就要加上这个恶心的参数
Weiming: 我宁可叫做longjs_using
也不愿意加上window
tangrui.cn: 要不咱么这些 core 的方法都这么叫
longjs_undef
longjs._createPackage();
Weiming: 豪
longjs里面,多少是和jsframe相关的?
Weiming: 就是,longjs,提供一系列的方法
他有多少是和window,frame相关的
比如using就和window相关
tangrui.cn: 有的话也是靠类似 lcore.using 这样的方法来获得的
Weiming: using,应该是都是针对调用这个方法的window吧
tangrui.cn: 现在 lcore 的 unit test 最后一个有问题之外,其他的都是可以用的了
对
而且不能用到 function 里面
比如你应该 using(longjs.lang);
而不能 var MyClass = function() { using(longjs.lang) }; 这样就不对了
这时候 using 的 this 就是 MyClass 了
Weiming: var MyClass = function() { using(longjs.lang) };
这肯定不行
tangrui.cn: 所保险起见是应该提供这样的一个参数,但是可以允许省略
Weiming: 那就得写成
longjs_using
tangrui.cn: 是呀,前提都是这么写
要不这么写,就一定要提供这个参数
tangrui.cn: 没什么问题
以前也是这么写的,就是没有 longjs 前缀
tangrui.cn: 我觉得宁愿加一个参数也不这么写
Weiming: longjs_using比using好
我是宁可不加这个参数
tangrui.cn: 加一个参数,无论如何是保险的
Weiming: 你想,肯定很多的人
都会问你
为什么
我这个页面,调用
longjs.using
还非得加一个window,我不就是在这个window么?
既然我再这个window,那么为什么还得加上
tangrui.cn: 但是这个方法不是在这个 window 里面 run 的
tangrui.cn: 这样的问题有的是
比如 win$()
你必须指定一个 window 即便你在这个 window 里面
Weiming: 哪个,我明显是要操作其他的window的,
我觉得win$可以省略
tangrui.cn: 这个可以说是 js 编程的一个特例,没什么办法
Weiming: 如果省略了,就是本window
还有,如果我没有jsframe
那么我怎么用?
tangrui.cn: 不可以省略,省略了就是 jsFrame 里的东西了
Weiming: 我觉得不能接受,肯定很多的人不接受
至少我就不接受
我宁可写一个不好看的longjs_win$
tangrui.cn: 因为现在 win$ 放到了 lcore 里面,以后应该放到比如 longjs.web.dom.LElement 这样的类型下面
无论如何是不能省略 window 的
Weiming: 不好
我宁可已给一个叫做longjs_win$的alias
tangrui.cn: 而且省略了 window 只是代码上面稍微好看了一点,但是会带来严重的不安全性
给 alias 也没有
Weiming: 如果我没有jsframe之类的东西
我只有这个也没
你让我都写一个这个东西,自己的这个window,
tangrui.cn: 再说 longjs 下面只放和 core 有关的,这些和 core 是无管的
tangrui.cn: 没有办法,我也不想这样
否则就是那个 class
Weiming: 如果这样,那么我要是用,我肯定写一个很小的做alias的js,然后每个页面都include
tangrui.cn: javascript 就这样,否则都写成平的,就一点问题都没有了
Weiming: 我觉得,这些和window相关的,
tangrui.cn: 如果他这样的话为什么还要用咱么的东西
Weiming: 但是,不给,默认是当前的window,也是应该的
ok,这就是问题了
Weiming: 你出这个东西,
目的是方便大家的使用啊
当然是越方便越好了
Weiming: 还是这个问题
如果我只有一个页面,我也得都写window
我本来只有一个window啊
Weiming: longjs,是不应该依赖jsFrame的
也就是,我必须用这个webfx么?
tangrui.cn: 按照有 jsFrame 的模式来用是 longjs 的长处,也是区别于 dojo 的地昂
地方
tangrui.cn: 你要是 single page 的首先一点就是他为什么要用你的东西而不用 dojo 的
tangrui.cn: 当然你不一定有,但是我的 api 是根据有 js frame 优化的
Weiming: 我也是每个页面都去跳转啊
做软件的一个点,就是让用户用起来很方便,
把麻烦留给自己,而不是用户
tangrui.cn: 没有我可以保证运行正常,有我也会保证运行正常,且他们能保持同样的 api 接口
Weiming: 可是,这样很烦啊
况且,我只有一个window,你为什么还让我非得写这个window
tangrui.cn: 你用 frame work 的初衷是要解决你棘手的问题
tangrui.cn: 这点东西相比之下就不足味道了
Weiming: 我不认为
当一个开发者,用一个库不爽的时候,他会选择放弃这个库
tangrui.cn: 当然对于他来讲我能不能有一个 tree 有一个 datagrid 是更重要的
问题是这样没什么不爽呀
tangrui.cn: 何况是咱么现在讨论的这个问题是没有办法jiejuede
tangrui.cn: 解决的,就算不爽也办法,我也觉得不爽,但是只能这样
Weiming: 所有的方法,你都需要写一个localhost
这样你也会不爽
我并不认为只能这样
这个是可以解决的
tangrui.cn: 当然可以有一个 work around 就是再提供一个 $() 方法
Weiming: 提供$,我也不认为是work around的方法
我认为是标准的做法
tangrui.cn: 这个方法里面直接调用 window.document.getElementById()
Weiming: 如果非要加上window,那么就必须给一个不要window的方阿飞
tangrui.cn: 如果你保证是 single page 就用这个方法,否则这个方法永远返回 js frame 里面的东西
那么 using 也可这么做
Weiming: 这个方法,为什么要放在jsFrame里面?
tangrui.cn: 只有在 single page 的时候允许他不用加上 window
Weiming: 操作本window,都应该可以不加上
tangrui.cn: 所有的方法都在 js frame 里面
tangrui.cn: 现在所有的方法都在 js frame 里面,上面的 frame 没有任何类库相关的内容
tangrui.cn: 不为什么呀,要不然咱么做这个干什么呢
Weiming: 那么,也就是我必须有一个jsFrame咯
tangrui.cn: 不需要呀,你不用 js frame 就把他们 perpage include 就可以了
反正不用 window 的重载只会返回代码所在的那个 window 里面的东西
tangrui.cn: 所以通常是 js frame 除非他是 single page 的
Weiming: 如果,你提供了这个必须写window的东西
然后,有人写一个很小的做alias和一些window处理的js
要求每个页面都include
那么你认为,大家会不会使用这个
如果不会,为什么
tangrui.cn: 你要是这么说得话,就没有意义了
Weiming: 如果会,能有多少人用?
为什么没意义?
tangrui.cn: 他所有的都可以这么做,为什么好要用咱么的东西
Weiming: 做为使用者,
我不但要求功能强大,我还要求使用方便
你提供功能强大
那么为什么,我不能在你提供功能强大的基础上,做一个使用方便的呢
tangrui.cn: 再说,我已经给他提供了足够好用的变通方法,如果他再不认可,那还能有什么办法
让他自己写这样的框架最终也要写成这样
Weiming: 你的变通的方法,不也得是每个页面做include么
Weiming: 那么,我怎么用$
又能解决有window的,又能解决没有window的
tangrui.cn: 在多页面的情况下不能用 $
tangrui.cn: 不能就是不能,javascript 不做不到
Weiming: 不会啊
$ = function (id, win) {
win = win || window;
}
这样就可以啊
tangrui.cn: 你要是在本页面 include 代码的话,那么这个代码至少不属于框架的一部分
Weiming: 我认为是框架的一部分
你既要给强大的功能,还要给最简单和方便的使用方法
tangrui.cn: 咱么可以提供很多这样的 util 来辅助用户
但是同时他这样带来的是代码的重复
tangrui.cn: 作为一个框架你不能在任何时候都往 util 里面加东西
tangrui.cn: 比如 java 用户自然希望往屏幕上输出一行字,用 print(abc); 就可了
Weiming: 但是前提是我可以很”方便”的使用你”强大”的框架
tangrui.cn: 但是作为一个框架,他必须要 System.out.println();
Weiming: 我认为不可接受
所以我的,并且很多人的
Weiming: java,如果是做一个大的
那么肯定有一个叫做print的方法
框架有框架的规矩,是针对框架内部说的
对于用户,就应该给最方便的
就好比
tangrui.cn: 如果有一个方法可以游离于框架之外,那么就会有更多的方法游离
不肯能,否则类库就没有必要设计了
Weiming: 我不认为,框架,只能从一个地方include
一个类库,也不是说,我必须只能从一个地方include
tangrui.cn: 我觉得这个也没有必要讨论了
Weiming: 如果又方便的方法,那么肯定会有人写,并且大量的人用
结论
tangrui.cn: 最后的结果,首先在类库内部没有办法,提供这样的方法,所以只能提供 win$ 和 $
然后在页面上可以随便 include 任何的代码
tangrui.cn: 但是这些不能算作框架的一部分,只是为了方便
Weiming: 你说对于解析xml,算作框架的一部分么?
tangrui.cn: 框架中的方法肯定不能任意游离
如果咱么要做的话,就算
Weiming: xerces,
这个现在已经被包含在java里面了
但是开始他并没有
从这里,就能说明,框架,不是一个单根的
tangrui.cn: 但是他加到 java 里面去以后也不可能是游离的
就像 java 永远都无法提供 print 方法一样
Weiming: 我可以接受,框架有框架的规矩
但是,我要求吧util做为框架的一部分
tangrui.cn: 除非把它做进 vm 和编译器
tangrui.cn: 这样的话就已经不属于框架类库的一部分了
Weiming: 每名把,什么做进vm?
为什么不属于?
这么说罢,从实用主意
你会不会使用这个东西?
tangrui.cn: 框架不能有 util 的东西,还是那句话,有一个就会有更多
Weiming: 你会不会在你的页面include这个东西
关键不是有多少,而是为什么有
如果他有他存在的理由,那么多少也是应该的
tangrui.cn: 或许说得准确一点,这个不算是类库的一部分,但是可以算作框架的一部分
tangrui.cn: 我还是那句话,不建议他用这套框架写 single page 的东西
Weiming: 就好像,如果真的,java给出的sdk里面,有一个,print的方法,你觉得多少人还会用system.out.print
tangrui.cn: 否则重复做一个 dojo 没有意思
Weiming: 1,我并不是觉得,这个是重复的dojo
tangrui.cn: 那么他内部肯定也是转换成 system out
Weiming: 2,这个的目的是,就算当dojo用,也要比dojo好
这个是我的目标
tangrui.cn: 所以这样的方法不能是类库的一部分
tangrui.cn: 问题是你和 dojo 竞争是没有意义的
Weiming: 所以,我坚持他是框架的一部分
我并没有和dojo竞争
竞争也没有意义
tangrui.cn: 我不需要比 dojo 做得好,别人用我的东西,是因为 dojo 做不到
Weiming: 但是如果,非要这么做,要保证比他出色
longjs不是针对single page
但是也要兼容single page
tangrui.cn: 当然,做就要做好了,但是咱么和 dojo 是没有竞争关系的
或者说是 dojo 的超集
Weiming: 有没有竞争关系,不是咱们说了算的,要看用户
很多地方,做成single page类似的是很有必要的
比如我做一个login 的一个块
我就要求要能够随意的include到其他的页面里面
这个很正常的
tangrui.cn: 这个就没有必要了吧,直接写 html 比用任何框架都划算
Weiming: 很有必要啊
比如我同时几个产品
都需要认证
login
当然只写一个就好了
tangrui.cn: 这个先讨论到这里吧,还有一个问题
tangrui.cn: 这个属于 user control 更高级了
就是我在想这个文档怎么写,肯定没有时间写所有的文档了,所以只能写用户文档
我想用户文档就写成 java doc
Weiming: 你指的用户文档,就是api doc么?
tangrui.cn: 然后应该有工具可以转成一份文档
tangrui.cn: 其实 api doc 写好了就是用户文档
tangrui.cn: java 和 msdn 都是这样,把说明写全了,再写上示例代码就足够了