狠狠撸

狠狠撸Share a Scribd company logo
前端架构、框架与库的实战 周爱民 愚公 aimingoo [email_address] aimingoo.spaces.live.com … .
架构素质的三个方面:思想、方法与基础。 架构  =  ? 有感、有理、有道:你在哪里? 我们在哪里? 什么是真相? 架构,把握问题的关键,平衡设计。
架构,把握问题的关键,平衡设计。 把握 问题 关键 平衡 设计 问题? 设计? 架构?
/* please sort first 如果找到返回查找值所在索引 否则返回 -(x+1) ( 插入点  x : , -(x+1)  防止  x=0 的插入点 与 找到的情况矛盾 )) 则判断某值是否存在只需判断 返回值  >=0  即可 */ Array.prototype.binarySearch = function(v){ var l = 0; var h = this.length-1; while (l<=h) { // 注:位操作 javascript 不一定提高效率 var m = (l+h)>>>1; if (this[m]===v) { return m; } if (this[m]>v) { h = m-1; } else { l = m+1; } } return -(l+1); }
?
function( url ) { with (new XMLHttpRequest()) return open(&quot;GET&quot;,  url , false), send(null),  responseText ; }
我们能不能重用它? 作为代码行重用 作为函数调用重用 …… 我们能不能控制它? 环境限制 / 兼容性?
function HttpGetMachine () { Attribute(this, 'XMLHTTP', null, 'rw'); Attribute(this, 'METHOD', 'GET', 'r'); this. OnStateChange  = TMachineStateChange; THttpGetMachine = Class(TObject, 'HttpGetMachine'); var  onreadystatechange  = function() { var xmlHttp = this.get('XMLHTTP'); this.OnStateChange(xmlHttp.readyState); … var  doStateChange  = function(state) { … } this.Create = function() { this.data = null; this.pool = null; this. OnStateChange .add( doStateChange ); this.set(‘XMLHTTP’, …).onreadystatechange =  onreadysta… … } ? ?
一些需求 应用层的代码难于控制整个 HTTP 请求的全程 只支持特定的通讯协议 对 Pool 有过于明显的依赖 … 问题: 抽象只表达了应用的需要,而非对核心功能的封装
response  = (new Ajax).get(url); 方案: 设所有的调用都可以使用 OnResponse 的方式返回 . new Ajax(url).onreadystatechange = function( response ) {   ... }
THttpRequest = Class(TObject, function() { Attribute(this, 'XMLHTTPOBJECT', 'MSXML2.XMLHTTP', 'rw'); Attribute(this, 'XMLHTTP', null, 'rw'); Attribute(this, 'METHOD', 'GET', 'r'); Attribute(this, 'format', 'TEXT', 'r');  // 'XML',‘BODY‘, … Attribute(this, 'async', false, 'r');  // user, pass, … … this. OnSetRequestHeader  = NullFunction; this. OnResponse  = NullFunction; Attribute(this, ' _open ', function(ajx, args) { ajx. open (this.get('METHOD'), args[0], this.get('async'),… this. OnSetRequestHeader (ajx, args); }, 'r'); Attribute(this, ' _send ', function(ajx, args) { ajx. send (); }, 'r'); Attribute(this, ' _resp ', function(resp, url, fmt) { var FMT = {XML: 'responseXML', TEXT: 'responseText', …}; var data = resp[FMT[fmt]]; this. OnResponse (url, {format: fmt, data: data}); return data; }, 'r');
var doRequest = function(url) {  // [,data] // $assert(!this.get('async'), ['need not async!']); var xmlHttp = this.get('XMLHTTP'); this.get(' _open ').call(this, xmlHttp, arguments); this.get(' _send ').call(this, xmlHttp, arguments); this.get(' _resp ').call(this, xmlHttp, …); } var  getResult  = function(url) { return doRequest.apply(this, arguments); } this.Create = function() { var AJAX = this.get('XMLHTTPOBJECT'); this.set('XMLHTTP', (typeof AJAX=='function') ? new AJAX() : new ActiveXObject(AJAX)); this. getResult  =  getResult ; } });
THttpRequestAsync = Class(THttpRequest, function() { var  onreadystatechange  = function(url, state) { if (state == 4) { this.get(' _resp ').call(this, xmlHttp, …); … var _changer = function(req, url) { return function() { req. OnReadyStateChange (url,  …); … var doRequest = function(url) {  // [,data] // $assert(this.get('async'), ['need async!']); var xmlHttp = this.get('XMLHTTP'); this.get(' _open ').call(this, xmlHttp, arguments); xmlHttp.onreadystatechange  = _changer(this, url); this.get(' _send ').call(this, xmlHttp, arguments); } this.OnReadyStateChange = NullFunction; this.Create = function() { this.inherited(); this.getResult = …; // rewrite, call doRequest this. OnReadyStateChange .add( onreadystatechange ); } });
IHttpRequestAsync = function() { this.getResult =  this.OnResponse = this.OnSetRequestHeader = this.OnReadyStateChange  = Abstract } IHttpRequest = function() { this.getResult =  this.OnResponse = this.OnSetRequestHeader = Abstract }
function _POST() { _set('METHOD', 'POST'); _set('_send', function(ajx, args) { ajx.send(args[1] || '') }); } } /* this.Create = function() { … */ } THttpPost = Class(THttpRequest, _POST); THttpPostAsync = Class(THttpRequestAsync, _POST);
// IHttpGet = IHttpPost = IHttpRequest THttpGet = Class(THttpRequest, NullFunction); THttpPost = Class(THttpRequest, _POST); // IHttpGetAsync = IHttpPostAsync = IHttpRequestAsync THttpGetAsync = Class(THttpRequestAsync, NullFunction); THttpPostAsync = Class(THttpRequestAsync, _POST); THttpRequest THttpRequestAsync THttpGet THttpPost THttpGetAsync THttpPostAsync
有没有分析过程? 有没有设计过程? 有没有架构过程? …… 问题: 我们还有什么没有做?
?
浏览器展现 某页的 URL 是否下载? 下载 保存 合法的 POST 信息 下载的批次 本地信息
浏览器展现 某页的 URL 是否下载? 下载 保存 合法的 POST 信息 下载的批次 本地信息 ssreader.exe HTTPAnalyzer Monitor.js Filter.js ProcessesPool.js SSGetter.js
/* a Framework for the system! /__events__. fire-onMonitorUpdate_in_HTA  ______ SSGetter.js _____  \  __|__ ||  /  \  /  \  \/  /  \  \/_  \ monitor  ->  filter  -> onGetDownloadItem -> downIt ->  pool .push--* */
TPool 1 * THttpGetMachine TMachine TFileMachine THttpMachine HttpGet HttpPost HttpMachine
TPool 1 * THttpGetMachine TMachine TFileMachine THttpMachine HttpGet HttpPost HttpMachine THttpRequest THttpRequestAsync THttpGet THttpPost THttpGetAsync THttpPostAsync
THttpGetMachine HttpGet HttpPost HttpMachine TMachine TRequestMachine TPdgHttpGetMachine
function Machine() { Attribute(this, 'Core', null, 'rw'); this.sleep = function() { this.OnStateChange('sleep'); } this.stop = function() { this.get('Core').stop(); this.sleep(); } …
function RequestMachine() { var doStateChange = function(state) { if (state=='resume') { this.get('Core').getResult( … );  // src, data } } this.Create = function(cls) { this.inherited(); this.OnStateChange.add(doStateChange); this.set('Core', cls.Create(this)); } }
function PdgHttpGetMachine() { var doQueryExist = function(state) { if (state == 'resume') … } this.getStatus = function() { return this.get('Core').get('XMLHTTP').status; } this.Create = function() { this.OnStateChange.add(doQueryExist); this.inherited('Create', Class(THttpGetAsyncMac, …)); } }
IRequestMachine = function() { // IMachine based } IMachine = function() { //  this.data = //  this.pool = null; this.sleep =  this.stop = this.OnStateChange = Abstract; } IPdgHttpGetMachine = function() { // IMachine based this.getStatus = Abstract }
1 * 1 1 THttpRequest TMachine TRequestMachine TPool THttpRequestAsync THttpGet THttpPost THttpGetAsync THttpPostAsync TPdgHttpGetMachine Core
为什么我们讲这两种架构方法? 二者的关系是什么? 框架处理系统的哪个部分?库呢? 共性与本质 《对于架构的三句话》中有关 COM 的部分 《为脚本语言平反 (2)(3) 》中有关 DSL 部分 问题: 我们还有什么没有做?
?
输入层 调度层 处理层 ssreader.exe HTTPAnalyzer Monitor.js ProcessesPool.js TPool SSGetter.js Filter.js User-Request Batch Push MergeAndOutput
识别类 TObject 处理类 TMachine pool.push( data ) pool.OnRequireNew( mac ) pool.OnStateChange( mac , data ) pool.stop() 处理层 输入层 调度层 数据类 TObject TPool.Create( MacClass ) 调度类 TPool
function PoolApp() { Attribute(this, ‘pool’); Attribute(this, ‘watcher’); this.start = function() { this.get(‘watcher’).start();   } // Create(PoolClass, WatchClass, MachineClass); this.Create = function(P,W,M) { this.set(‘watch’, W.Create()).pool =  this.set(‘pool’, P.Create(M)); } }
IPool = function() { this.push = Abstract; // push(data) this.stop = Abstract; // stop() this.OnStateChange = Abstract; // OnStateChange(mac,data) this.Create = Abstract;  // Create(MachineClass) } IWatch = function() { //  this.pool = null; this.start = Abstract; // start() }
data = { src: …, param: … }; function MyWatch() { this.start = function() { this.pool.push(data)); } function MyMachine(cls) { var doStateChange = function(state) { if (state == ‘resume’) this.get(‘Core’). process (this.data)) } this.Create = function() { this.inherited(); this.OnStateChange.add(doStateChange); this.set('Core', { process : function(data) { alert(data.src) } }); }); }
app = TPooledApp.Create( TPool, Class(TObject, ‘MyWatch’), Class(TMachine, ‘MyMachine’) ); app.start();
?
我们在追求“什么样的”或“目标是什么的”架构? 我们在架构“什么”? 我们在为什么做? …… 问题: 我们还有什么没有做?
?
?
End.

More Related Content

What's hot (14)

Clang-tidy: путешествие внутрь AST C++
Clang-tidy: путешествие внутрь AST C++Clang-tidy: путешествие внутрь AST C++
Clang-tidy: путешествие внутрь AST C++
corehard_by
?
Propuesta..sujei
Propuesta..sujeiPropuesta..sujei
Propuesta..sujei
gersonjack
?
Шаблоны проектирования 2
Шаблоны проектирования 2Шаблоны проектирования 2
Шаблоны проектирования 2
Constantin Kichinsky
?
????? ??????? ????? ?? ?????? ?? ?????
????? ??????? ????? ?? ?????? ?? ?????????? ??????? ????? ?? ?????? ?? ?????
????? ??????? ????? ?? ?????? ?? ?????
faradars
?
Project
ProjectProject
Project
taufiq26
?
Rambler.iOS #8: Чистые unit-тесты
Rambler.iOS #8: Чистые unit-тестыRambler.iOS #8: Чистые unit-тесты
Rambler.iOS #8: Чистые unit-тесты
RAMBLER&Co
?
Java осень 2012 лекция 6
Java осень 2012 лекция 6Java осень 2012 лекция 6
Java осень 2012 лекция 6
Technopark
?
Java Script - Object-Oriented Programming
Java Script - Object-Oriented ProgrammingJava Script - Object-Oriented Programming
Java Script - Object-Oriented Programming
intive
?
Java лаб13
Java лаб13Java лаб13
Java лаб13
Enkhee99
?
Programming Java - Lection 03 - Classes - Lavrentyev Fedor
Programming Java - Lection 03 - Classes - Lavrentyev FedorProgramming Java - Lection 03 - Classes - Lavrentyev Fedor
Programming Java - Lection 03 - Classes - Lavrentyev Fedor
Fedor Lavrentyev
?
Lightning talk second
Lightning talk secondLightning talk second
Lightning talk second
ShinUsuda
?
JQuery
JQueryJQuery
JQuery
koji lin
?
Юнит тестирование в Zend Framework 2.0
Юнит тестирование в Zend Framework 2.0Юнит тестирование в Zend Framework 2.0
Юнит тестирование в Zend Framework 2.0
zfconfua
?
Clang-tidy: путешествие внутрь AST C++
Clang-tidy: путешествие внутрь AST C++Clang-tidy: путешествие внутрь AST C++
Clang-tidy: путешествие внутрь AST C++
corehard_by
?
Шаблоны проектирования 2
Шаблоны проектирования 2Шаблоны проектирования 2
Шаблоны проектирования 2
Constantin Kichinsky
?
????? ??????? ????? ?? ?????? ?? ?????
????? ??????? ????? ?? ?????? ?? ?????????? ??????? ????? ?? ?????? ?? ?????
????? ??????? ????? ?? ?????? ?? ?????
faradars
?
Rambler.iOS #8: Чистые unit-тесты
Rambler.iOS #8: Чистые unit-тестыRambler.iOS #8: Чистые unit-тесты
Rambler.iOS #8: Чистые unit-тесты
RAMBLER&Co
?
Java осень 2012 лекция 6
Java осень 2012 лекция 6Java осень 2012 лекция 6
Java осень 2012 лекция 6
Technopark
?
Java Script - Object-Oriented Programming
Java Script - Object-Oriented ProgrammingJava Script - Object-Oriented Programming
Java Script - Object-Oriented Programming
intive
?
Java лаб13
Java лаб13Java лаб13
Java лаб13
Enkhee99
?
Programming Java - Lection 03 - Classes - Lavrentyev Fedor
Programming Java - Lection 03 - Classes - Lavrentyev FedorProgramming Java - Lection 03 - Classes - Lavrentyev Fedor
Programming Java - Lection 03 - Classes - Lavrentyev Fedor
Fedor Lavrentyev
?
Lightning talk second
Lightning talk secondLightning talk second
Lightning talk second
ShinUsuda
?
Юнит тестирование в Zend Framework 2.0
Юнит тестирование в Zend Framework 2.0Юнит тестирование в Zend Framework 2.0
Юнит тестирование в Zend Framework 2.0
zfconfua
?

Viewers also liked (20)

386 涂家网 互联网家装设计、造价平台
386 涂家网 互联网家装设计、造价平台386 涂家网 互联网家装设计、造价平台
386 涂家网 互联网家装设计、造价平台
Rui (Nash) Yang
?
511 香港树为母婴跨境电商
511 香港树为母婴跨境电商511 香港树为母婴跨境电商
511 香港树为母婴跨境电商
Rui (Nash) Yang
?
搁颈辫辫濒别支付技术
搁颈辫辫濒别支付技术搁颈辫辫濒别支付技术
搁颈辫辫濒别支付技术
jingping yi
?
The opportunity and challenge of cross border Ecommerce 0716
The opportunity and challenge of cross border Ecommerce 0716The opportunity and challenge of cross border Ecommerce 0716
The opportunity and challenge of cross border Ecommerce 0716
Payoneer
?
514 诉融网 -商业融资计划书
514 诉融网 -商业融资计划书514 诉融网 -商业融资计划书
514 诉融网 -商业融资计划书
Rui (Nash) Yang
?
一种多屏时代的通用 web 应用架构
一种多屏时代的通用 web 应用架构一种多屏时代的通用 web 应用架构
一种多屏时代的通用 web 应用架构
勇浩 赖
?
移动客户端恶意行为分析系统
移动客户端恶意行为分析系统移动客户端恶意行为分析系统
移动客户端恶意行为分析系统
正炎 高
?
20150820支付清算协会分布式架构研究与设计参考 v2.0820正式版
20150820支付清算协会分布式架构研究与设计参考 v2.0820正式版20150820支付清算协会分布式架构研究与设计参考 v2.0820正式版
20150820支付清算协会分布式架构研究与设计参考 v2.0820正式版
liu sheng
?
高性能奥别产应用缓存架构设计浅谈
高性能奥别产应用缓存架构设计浅谈高性能奥别产应用缓存架构设计浅谈
高性能奥别产应用缓存架构设计浅谈
Alvin Qi
?
20160315内刊投稿(刘胜)区块链研究综述惫1.1.0331
20160315内刊投稿(刘胜)区块链研究综述惫1.1.033120160315内刊投稿(刘胜)区块链研究综述惫1.1.0331
20160315内刊投稿(刘胜)区块链研究综述惫1.1.0331
liu sheng
?
Scala the-good-parts
Scala the-good-partsScala the-good-parts
Scala the-good-parts
Fuqiang Wang
?
小さなお店(実店舗)のための奥别产集客セミナー
小さなお店(実店舗)のための奥别产集客セミナー小さなお店(実店舗)のための奥别产集客セミナー
小さなお店(実店舗)のための奥别产集客セミナー
Ebisui Kazunori
?
Open Source Projects
Open Source ProjectsOpen Source Projects
Open Source Projects
Zealous System
?
Monitoring @ scale over diverse data sources @ PayPal - Druid, TSDB, Hadoop
Monitoring @ scale over diverse data sources @ PayPal  - Druid, TSDB, HadoopMonitoring @ scale over diverse data sources @ PayPal  - Druid, TSDB, Hadoop
Monitoring @ scale over diverse data sources @ PayPal - Druid, TSDB, Hadoop
Senthil Pandurangan
?
API Token 入門
API Token 入門API Token 入門
API Token 入門
Andrew Wu
?
DWS16 - Fintech forum - Francis Barel, PayPal
DWS16 - Fintech forum - Francis Barel, PayPalDWS16 - Fintech forum - Francis Barel, PayPal
DWS16 - Fintech forum - Francis Barel, PayPal
IDATE DigiWorld
?
Iot_algyan_hands-on_20161129
Iot_algyan_hands-on_20161129Iot_algyan_hands-on_20161129
Iot_algyan_hands-on_20161129
Junichi Okamura
?
DevOps Days Tel Aviv - Serverless Architecture
DevOps Days Tel Aviv - Serverless ArchitectureDevOps Days Tel Aviv - Serverless Architecture
DevOps Days Tel Aviv - Serverless Architecture
Antons Kranga
?
美团点评技术沙龙07 - 大众点评支付渠道网关系统实践
美团点评技术沙龙07 - 大众点评支付渠道网关系统实践美团点评技术沙龙07 - 大众点评支付渠道网关系统实践
美团点评技术沙龙07 - 大众点评支付渠道网关系统实践
美团点评技术团队
?
Advisor Live: Understanding the MACRA Quality Payment Program and What You Ca...
Advisor Live: Understanding the MACRA Quality Payment Program and What You Ca...Advisor Live: Understanding the MACRA Quality Payment Program and What You Ca...
Advisor Live: Understanding the MACRA Quality Payment Program and What You Ca...
Premier Inc.
?
386 涂家网 互联网家装设计、造价平台
386 涂家网 互联网家装设计、造价平台386 涂家网 互联网家装设计、造价平台
386 涂家网 互联网家装设计、造价平台
Rui (Nash) Yang
?
511 香港树为母婴跨境电商
511 香港树为母婴跨境电商511 香港树为母婴跨境电商
511 香港树为母婴跨境电商
Rui (Nash) Yang
?
搁颈辫辫濒别支付技术
搁颈辫辫濒别支付技术搁颈辫辫濒别支付技术
搁颈辫辫濒别支付技术
jingping yi
?
The opportunity and challenge of cross border Ecommerce 0716
The opportunity and challenge of cross border Ecommerce 0716The opportunity and challenge of cross border Ecommerce 0716
The opportunity and challenge of cross border Ecommerce 0716
Payoneer
?
514 诉融网 -商业融资计划书
514 诉融网 -商业融资计划书514 诉融网 -商业融资计划书
514 诉融网 -商业融资计划书
Rui (Nash) Yang
?
一种多屏时代的通用 web 应用架构
一种多屏时代的通用 web 应用架构一种多屏时代的通用 web 应用架构
一种多屏时代的通用 web 应用架构
勇浩 赖
?
移动客户端恶意行为分析系统
移动客户端恶意行为分析系统移动客户端恶意行为分析系统
移动客户端恶意行为分析系统
正炎 高
?
20150820支付清算协会分布式架构研究与设计参考 v2.0820正式版
20150820支付清算协会分布式架构研究与设计参考 v2.0820正式版20150820支付清算协会分布式架构研究与设计参考 v2.0820正式版
20150820支付清算协会分布式架构研究与设计参考 v2.0820正式版
liu sheng
?
高性能奥别产应用缓存架构设计浅谈
高性能奥别产应用缓存架构设计浅谈高性能奥别产应用缓存架构设计浅谈
高性能奥别产应用缓存架构设计浅谈
Alvin Qi
?
20160315内刊投稿(刘胜)区块链研究综述惫1.1.0331
20160315内刊投稿(刘胜)区块链研究综述惫1.1.033120160315内刊投稿(刘胜)区块链研究综述惫1.1.0331
20160315内刊投稿(刘胜)区块链研究综述惫1.1.0331
liu sheng
?
小さなお店(実店舗)のための奥别产集客セミナー
小さなお店(実店舗)のための奥别产集客セミナー小さなお店(実店舗)のための奥别产集客セミナー
小さなお店(実店舗)のための奥别产集客セミナー
Ebisui Kazunori
?
Monitoring @ scale over diverse data sources @ PayPal - Druid, TSDB, Hadoop
Monitoring @ scale over diverse data sources @ PayPal  - Druid, TSDB, HadoopMonitoring @ scale over diverse data sources @ PayPal  - Druid, TSDB, Hadoop
Monitoring @ scale over diverse data sources @ PayPal - Druid, TSDB, Hadoop
Senthil Pandurangan
?
API Token 入門
API Token 入門API Token 入門
API Token 入門
Andrew Wu
?
DWS16 - Fintech forum - Francis Barel, PayPal
DWS16 - Fintech forum - Francis Barel, PayPalDWS16 - Fintech forum - Francis Barel, PayPal
DWS16 - Fintech forum - Francis Barel, PayPal
IDATE DigiWorld
?
Iot_algyan_hands-on_20161129
Iot_algyan_hands-on_20161129Iot_algyan_hands-on_20161129
Iot_algyan_hands-on_20161129
Junichi Okamura
?
DevOps Days Tel Aviv - Serverless Architecture
DevOps Days Tel Aviv - Serverless ArchitectureDevOps Days Tel Aviv - Serverless Architecture
DevOps Days Tel Aviv - Serverless Architecture
Antons Kranga
?
美团点评技术沙龙07 - 大众点评支付渠道网关系统实践
美团点评技术沙龙07 - 大众点评支付渠道网关系统实践美团点评技术沙龙07 - 大众点评支付渠道网关系统实践
美团点评技术沙龙07 - 大众点评支付渠道网关系统实践
美团点评技术团队
?
Advisor Live: Understanding the MACRA Quality Payment Program and What You Ca...
Advisor Live: Understanding the MACRA Quality Payment Program and What You Ca...Advisor Live: Understanding the MACRA Quality Payment Program and What You Ca...
Advisor Live: Understanding the MACRA Quality Payment Program and What You Ca...
Premier Inc.
?

More from 裕波 周 (18)

飞别产标准化交流会上海站产辞产产测分享
飞别产标准化交流会上海站产辞产产测分享飞别产标准化交流会上海站产辞产产测分享
飞别产标准化交流会上海站产辞产产测分享
裕波 周
?
飞别产标准化交流会产辞产产测分享
飞别产标准化交流会产辞产产测分享飞别产标准化交流会产辞产产测分享
飞别产标准化交流会产辞产产测分享
裕波 周
?
前端架构漫谈
前端架构漫谈前端架构漫谈
前端架构漫谈
裕波 周
?
从无阻塞并行脚本加载(尝补产.箩蝉)到浏览器消息模型
从无阻塞并行脚本加载(尝补产.箩蝉)到浏览器消息模型从无阻塞并行脚本加载(尝补产.箩蝉)到浏览器消息模型
从无阻塞并行脚本加载(尝补产.箩蝉)到浏览器消息模型
裕波 周
?
从无阻塞并行脚本加载(尝补产.箩蝉)到浏览器消息模型
从无阻塞并行脚本加载(尝补产.箩蝉)到浏览器消息模型从无阻塞并行脚本加载(尝补产.箩蝉)到浏览器消息模型
从无阻塞并行脚本加载(尝补产.箩蝉)到浏览器消息模型
裕波 周
?
白玉磊 Webrebuild
白玉磊 Webrebuild白玉磊 Webrebuild
白玉磊 Webrebuild
裕波 周
?
彪叔 [2010]webrebuild
彪叔 [2010]webrebuild彪叔 [2010]webrebuild
彪叔 [2010]webrebuild
裕波 周
?
厂肠谤耻尘敏捷项目管理
厂肠谤耻尘敏捷项目管理厂肠谤耻尘敏捷项目管理
厂肠谤耻尘敏捷项目管理
裕波 周
?
移动设备飞别产重构
移动设备飞别产重构移动设备飞别产重构
移动设备飞别产重构
裕波 周
?
重温网站重构
重温网站重构重温网站重构
重温网站重构
裕波 周
?
从问题开始,谈前端架构
从问题开始,谈前端架构从问题开始,谈前端架构
从问题开始,谈前端架构
裕波 周
?
Ie9 overview
Ie9 overviewIe9 overview
Ie9 overview
裕波 周
?
《一专多长》——罢飞颈苍蝉别苍摆梁璟彪闭
《一专多长》——罢飞颈苍蝉别苍摆梁璟彪闭《一专多长》——罢飞颈苍蝉别苍摆梁璟彪闭
《一专多长》——罢飞颈苍蝉别苍摆梁璟彪闭
裕波 周
?
浏览器兼容性问题介绍 --- 黄昊
浏览器兼容性问题介绍 --- 黄昊浏览器兼容性问题介绍 --- 黄昊
浏览器兼容性问题介绍 --- 黄昊
裕波 周
?
揭秘Html5和Css3 ---- 鲁超伍
揭秘Html5和Css3 ---- 鲁超伍揭秘Html5和Css3 ---- 鲁超伍
揭秘Html5和Css3 ---- 鲁超伍
裕波 周
?
网站重构Whoami ---- 偷米饭
网站重构Whoami ---- 偷米饭网站重构Whoami ---- 偷米饭
网站重构Whoami ---- 偷米饭
裕波 周
?
分层语义化模板实践 ---- 张克军
分层语义化模板实践 ---- 张克军分层语义化模板实践 ---- 张克军
分层语义化模板实践 ---- 张克军
裕波 周
?
javascript的分层概念 --- 阿当
javascript的分层概念 --- 阿当javascript的分层概念 --- 阿当
javascript的分层概念 --- 阿当
裕波 周
?
飞别产标准化交流会上海站产辞产产测分享
飞别产标准化交流会上海站产辞产产测分享飞别产标准化交流会上海站产辞产产测分享
飞别产标准化交流会上海站产辞产产测分享
裕波 周
?
飞别产标准化交流会产辞产产测分享
飞别产标准化交流会产辞产产测分享飞别产标准化交流会产辞产产测分享
飞别产标准化交流会产辞产产测分享
裕波 周
?
前端架构漫谈
前端架构漫谈前端架构漫谈
前端架构漫谈
裕波 周
?
从无阻塞并行脚本加载(尝补产.箩蝉)到浏览器消息模型
从无阻塞并行脚本加载(尝补产.箩蝉)到浏览器消息模型从无阻塞并行脚本加载(尝补产.箩蝉)到浏览器消息模型
从无阻塞并行脚本加载(尝补产.箩蝉)到浏览器消息模型
裕波 周
?
从无阻塞并行脚本加载(尝补产.箩蝉)到浏览器消息模型
从无阻塞并行脚本加载(尝补产.箩蝉)到浏览器消息模型从无阻塞并行脚本加载(尝补产.箩蝉)到浏览器消息模型
从无阻塞并行脚本加载(尝补产.箩蝉)到浏览器消息模型
裕波 周
?
白玉磊 Webrebuild
白玉磊 Webrebuild白玉磊 Webrebuild
白玉磊 Webrebuild
裕波 周
?
彪叔 [2010]webrebuild
彪叔 [2010]webrebuild彪叔 [2010]webrebuild
彪叔 [2010]webrebuild
裕波 周
?
厂肠谤耻尘敏捷项目管理
厂肠谤耻尘敏捷项目管理厂肠谤耻尘敏捷项目管理
厂肠谤耻尘敏捷项目管理
裕波 周
?
移动设备飞别产重构
移动设备飞别产重构移动设备飞别产重构
移动设备飞别产重构
裕波 周
?
重温网站重构
重温网站重构重温网站重构
重温网站重构
裕波 周
?
从问题开始,谈前端架构
从问题开始,谈前端架构从问题开始,谈前端架构
从问题开始,谈前端架构
裕波 周
?
《一专多长》——罢飞颈苍蝉别苍摆梁璟彪闭
《一专多长》——罢飞颈苍蝉别苍摆梁璟彪闭《一专多长》——罢飞颈苍蝉别苍摆梁璟彪闭
《一专多长》——罢飞颈苍蝉别苍摆梁璟彪闭
裕波 周
?
浏览器兼容性问题介绍 --- 黄昊
浏览器兼容性问题介绍 --- 黄昊浏览器兼容性问题介绍 --- 黄昊
浏览器兼容性问题介绍 --- 黄昊
裕波 周
?
揭秘Html5和Css3 ---- 鲁超伍
揭秘Html5和Css3 ---- 鲁超伍揭秘Html5和Css3 ---- 鲁超伍
揭秘Html5和Css3 ---- 鲁超伍
裕波 周
?
网站重构Whoami ---- 偷米饭
网站重构Whoami ---- 偷米饭网站重构Whoami ---- 偷米饭
网站重构Whoami ---- 偷米饭
裕波 周
?
分层语义化模板实践 ---- 张克军
分层语义化模板实践 ---- 张克军分层语义化模板实践 ---- 张克军
分层语义化模板实践 ---- 张克军
裕波 周
?
javascript的分层概念 --- 阿当
javascript的分层概念 --- 阿当javascript的分层概念 --- 阿当
javascript的分层概念 --- 阿当
裕波 周
?

从问题开始,前端,架构、框架与库的实战

  • 1. 前端架构、框架与库的实战 周爱民 愚公 aimingoo [email_address] aimingoo.spaces.live.com … .
  • 2. 架构素质的三个方面:思想、方法与基础。 架构 = ? 有感、有理、有道:你在哪里? 我们在哪里? 什么是真相? 架构,把握问题的关键,平衡设计。
  • 3. 架构,把握问题的关键,平衡设计。 把握 问题 关键 平衡 设计 问题? 设计? 架构?
  • 4. /* please sort first 如果找到返回查找值所在索引 否则返回 -(x+1) ( 插入点 x : , -(x+1) 防止 x=0 的插入点 与 找到的情况矛盾 )) 则判断某值是否存在只需判断 返回值 >=0 即可 */ Array.prototype.binarySearch = function(v){ var l = 0; var h = this.length-1; while (l<=h) { // 注:位操作 javascript 不一定提高效率 var m = (l+h)>>>1; if (this[m]===v) { return m; } if (this[m]>v) { h = m-1; } else { l = m+1; } } return -(l+1); }
  • 5. ?
  • 6. function( url ) { with (new XMLHttpRequest()) return open(&quot;GET&quot;, url , false), send(null), responseText ; }
  • 7. 我们能不能重用它? 作为代码行重用 作为函数调用重用 …… 我们能不能控制它? 环境限制 / 兼容性?
  • 8. function HttpGetMachine () { Attribute(this, 'XMLHTTP', null, 'rw'); Attribute(this, 'METHOD', 'GET', 'r'); this. OnStateChange = TMachineStateChange; THttpGetMachine = Class(TObject, 'HttpGetMachine'); var onreadystatechange = function() { var xmlHttp = this.get('XMLHTTP'); this.OnStateChange(xmlHttp.readyState); … var doStateChange = function(state) { … } this.Create = function() { this.data = null; this.pool = null; this. OnStateChange .add( doStateChange ); this.set(‘XMLHTTP’, …).onreadystatechange = onreadysta… … } ? ?
  • 9. 一些需求 应用层的代码难于控制整个 HTTP 请求的全程 只支持特定的通讯协议 对 Pool 有过于明显的依赖 … 问题: 抽象只表达了应用的需要,而非对核心功能的封装
  • 10. response = (new Ajax).get(url); 方案: 设所有的调用都可以使用 OnResponse 的方式返回 . new Ajax(url).onreadystatechange = function( response ) { ... }
  • 11. THttpRequest = Class(TObject, function() { Attribute(this, 'XMLHTTPOBJECT', 'MSXML2.XMLHTTP', 'rw'); Attribute(this, 'XMLHTTP', null, 'rw'); Attribute(this, 'METHOD', 'GET', 'r'); Attribute(this, 'format', 'TEXT', 'r'); // 'XML',‘BODY‘, … Attribute(this, 'async', false, 'r'); // user, pass, … … this. OnSetRequestHeader = NullFunction; this. OnResponse = NullFunction; Attribute(this, ' _open ', function(ajx, args) { ajx. open (this.get('METHOD'), args[0], this.get('async'),… this. OnSetRequestHeader (ajx, args); }, 'r'); Attribute(this, ' _send ', function(ajx, args) { ajx. send (); }, 'r'); Attribute(this, ' _resp ', function(resp, url, fmt) { var FMT = {XML: 'responseXML', TEXT: 'responseText', …}; var data = resp[FMT[fmt]]; this. OnResponse (url, {format: fmt, data: data}); return data; }, 'r');
  • 12. var doRequest = function(url) { // [,data] // $assert(!this.get('async'), ['need not async!']); var xmlHttp = this.get('XMLHTTP'); this.get(' _open ').call(this, xmlHttp, arguments); this.get(' _send ').call(this, xmlHttp, arguments); this.get(' _resp ').call(this, xmlHttp, …); } var getResult = function(url) { return doRequest.apply(this, arguments); } this.Create = function() { var AJAX = this.get('XMLHTTPOBJECT'); this.set('XMLHTTP', (typeof AJAX=='function') ? new AJAX() : new ActiveXObject(AJAX)); this. getResult = getResult ; } });
  • 13. THttpRequestAsync = Class(THttpRequest, function() { var onreadystatechange = function(url, state) { if (state == 4) { this.get(' _resp ').call(this, xmlHttp, …); … var _changer = function(req, url) { return function() { req. OnReadyStateChange (url, …); … var doRequest = function(url) { // [,data] // $assert(this.get('async'), ['need async!']); var xmlHttp = this.get('XMLHTTP'); this.get(' _open ').call(this, xmlHttp, arguments); xmlHttp.onreadystatechange = _changer(this, url); this.get(' _send ').call(this, xmlHttp, arguments); } this.OnReadyStateChange = NullFunction; this.Create = function() { this.inherited(); this.getResult = …; // rewrite, call doRequest this. OnReadyStateChange .add( onreadystatechange ); } });
  • 14. IHttpRequestAsync = function() { this.getResult = this.OnResponse = this.OnSetRequestHeader = this.OnReadyStateChange = Abstract } IHttpRequest = function() { this.getResult = this.OnResponse = this.OnSetRequestHeader = Abstract }
  • 15. function _POST() { _set('METHOD', 'POST'); _set('_send', function(ajx, args) { ajx.send(args[1] || '') }); } } /* this.Create = function() { … */ } THttpPost = Class(THttpRequest, _POST); THttpPostAsync = Class(THttpRequestAsync, _POST);
  • 16. // IHttpGet = IHttpPost = IHttpRequest THttpGet = Class(THttpRequest, NullFunction); THttpPost = Class(THttpRequest, _POST); // IHttpGetAsync = IHttpPostAsync = IHttpRequestAsync THttpGetAsync = Class(THttpRequestAsync, NullFunction); THttpPostAsync = Class(THttpRequestAsync, _POST); THttpRequest THttpRequestAsync THttpGet THttpPost THttpGetAsync THttpPostAsync
  • 17. 有没有分析过程? 有没有设计过程? 有没有架构过程? …… 问题: 我们还有什么没有做?
  • 18. ?
  • 19. 浏览器展现 某页的 URL 是否下载? 下载 保存 合法的 POST 信息 下载的批次 本地信息
  • 20. 浏览器展现 某页的 URL 是否下载? 下载 保存 合法的 POST 信息 下载的批次 本地信息 ssreader.exe HTTPAnalyzer Monitor.js Filter.js ProcessesPool.js SSGetter.js
  • 21. /* a Framework for the system! /__events__. fire-onMonitorUpdate_in_HTA ______ SSGetter.js _____ \ __|__ || / \ / \ \/ / \ \/_ \ monitor -> filter -> onGetDownloadItem -> downIt -> pool .push--* */
  • 22. TPool 1 * THttpGetMachine TMachine TFileMachine THttpMachine HttpGet HttpPost HttpMachine
  • 23. TPool 1 * THttpGetMachine TMachine TFileMachine THttpMachine HttpGet HttpPost HttpMachine THttpRequest THttpRequestAsync THttpGet THttpPost THttpGetAsync THttpPostAsync
  • 24. THttpGetMachine HttpGet HttpPost HttpMachine TMachine TRequestMachine TPdgHttpGetMachine
  • 25. function Machine() { Attribute(this, 'Core', null, 'rw'); this.sleep = function() { this.OnStateChange('sleep'); } this.stop = function() { this.get('Core').stop(); this.sleep(); } …
  • 26. function RequestMachine() { var doStateChange = function(state) { if (state=='resume') { this.get('Core').getResult( … ); // src, data } } this.Create = function(cls) { this.inherited(); this.OnStateChange.add(doStateChange); this.set('Core', cls.Create(this)); } }
  • 27. function PdgHttpGetMachine() { var doQueryExist = function(state) { if (state == 'resume') … } this.getStatus = function() { return this.get('Core').get('XMLHTTP').status; } this.Create = function() { this.OnStateChange.add(doQueryExist); this.inherited('Create', Class(THttpGetAsyncMac, …)); } }
  • 28. IRequestMachine = function() { // IMachine based } IMachine = function() { // this.data = // this.pool = null; this.sleep = this.stop = this.OnStateChange = Abstract; } IPdgHttpGetMachine = function() { // IMachine based this.getStatus = Abstract }
  • 29. 1 * 1 1 THttpRequest TMachine TRequestMachine TPool THttpRequestAsync THttpGet THttpPost THttpGetAsync THttpPostAsync TPdgHttpGetMachine Core
  • 30. 为什么我们讲这两种架构方法? 二者的关系是什么? 框架处理系统的哪个部分?库呢? 共性与本质 《对于架构的三句话》中有关 COM 的部分 《为脚本语言平反 (2)(3) 》中有关 DSL 部分 问题: 我们还有什么没有做?
  • 31. ?
  • 32. 输入层 调度层 处理层 ssreader.exe HTTPAnalyzer Monitor.js ProcessesPool.js TPool SSGetter.js Filter.js User-Request Batch Push MergeAndOutput
  • 33. 识别类 TObject 处理类 TMachine pool.push( data ) pool.OnRequireNew( mac ) pool.OnStateChange( mac , data ) pool.stop() 处理层 输入层 调度层 数据类 TObject TPool.Create( MacClass ) 调度类 TPool
  • 34. function PoolApp() { Attribute(this, ‘pool’); Attribute(this, ‘watcher’); this.start = function() { this.get(‘watcher’).start(); } // Create(PoolClass, WatchClass, MachineClass); this.Create = function(P,W,M) { this.set(‘watch’, W.Create()).pool = this.set(‘pool’, P.Create(M)); } }
  • 35. IPool = function() { this.push = Abstract; // push(data) this.stop = Abstract; // stop() this.OnStateChange = Abstract; // OnStateChange(mac,data) this.Create = Abstract; // Create(MachineClass) } IWatch = function() { // this.pool = null; this.start = Abstract; // start() }
  • 36. data = { src: …, param: … }; function MyWatch() { this.start = function() { this.pool.push(data)); } function MyMachine(cls) { var doStateChange = function(state) { if (state == ‘resume’) this.get(‘Core’). process (this.data)) } this.Create = function() { this.inherited(); this.OnStateChange.add(doStateChange); this.set('Core', { process : function(data) { alert(data.src) } }); }); }
  • 37. app = TPooledApp.Create( TPool, Class(TObject, ‘MyWatch’), Class(TMachine, ‘MyMachine’) ); app.start();
  • 38. ?
  • 40. ?
  • 41. ?
  • 42. End.

Editor's Notes

  • #31: 对于架构的三句话 http://v.ku6.com/show/4CzbEQbFHlG0YaVs.html http://aimingoo.spaces.live.com/ 为脚本语言平反 (2)(3) http://blog.csdn.net/aimingoo/archive/2009/09/08/4532496.aspx http://blog.csdn.net/aimingoo/archive/2009/09/08/4532567.aspx