﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-我是FE，也是Fe-随笔分类-架构之路</title><link>http://www.blogjava.net/Hafeyang/category/39096.html</link><description>前端来源于不断的点滴积累。我一直在努力。</description><language>zh-cn</language><lastBuildDate>Tue, 31 Jul 2012 20:43:57 GMT</lastBuildDate><pubDate>Tue, 31 Jul 2012 20:43:57 GMT</pubDate><ttl>60</ttl><item><title>谈谈前端组件库</title><link>http://www.blogjava.net/Hafeyang/archive/2012/08/01/how_to_build_frontend_component_lib.html</link><dc:creator>衡锋</dc:creator><author>衡锋</author><pubDate>Tue, 31 Jul 2012 17:19:00 GMT</pubDate><guid>http://www.blogjava.net/Hafeyang/archive/2012/08/01/how_to_build_frontend_component_lib.html</guid><wfw:comment>http://www.blogjava.net/Hafeyang/comments/384477.html</wfw:comment><comments>http://www.blogjava.net/Hafeyang/archive/2012/08/01/how_to_build_frontend_component_lib.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Hafeyang/comments/commentRss/384477.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Hafeyang/services/trackbacks/384477.html</trackback:ping><description><![CDATA[读过，了解过很多的前端控件库/组件库，尝试过，体验过多个失败的，不算失败的组件库之后，总结下来，觉得要构建一个完整的组件库，需要考虑以下几个方面的问题：<br />
<br />
1.基础库：<br />
<br />
注意是库，不是框架，基础库通常提供底层方法，它必须能够屏蔽浏览器/终端的API差异。也许大家脑子里面会弹出一堆前端热门的一些库。在此不讨论哪个库哪个库怎么样，一个基础库必须提供的功能：<br />
<ul>
     <li>基本类型的常见扩展：原生的javascript对象API往往在现实中不够用，比如常见的Array.indexOf/remove/each，Date.parse/format，不管是怎么封装都需要这类方法</li>
     <li>DOM操作常见方法：DOM节点增删改查，CSS selector，DOMReady，contains，add/remove/toggleClass，屏蔽浏览器之间的操作差异。不多说，人人都熟。</li>
     <li>一套浏览器检测机制：以前大家都倾向于做浏览器类型和版本的检测，现在倾向于做浏览器的特性检测，这样更有实际用处。</li>
     <li>Ajax的封装，对于组件库来讲可无。毕竟组件库本身的实现不太会用得上Ajax。</li>
</ul>
<br />
2.事件机制：<br />
<br />
addEventListener/removeEventListener/dispatchEvent 是常见的封装方式，不应该只是DOM事件，而是任何对象都可以做一个事件机制。<br />
对于DOM事件的封装需要屏蔽IE/标准Event的差异提供为用户使用，事件代理非常重要，不可小视。<br />
<ul>
     <li>事件机制都无一例外的是基于第三方观察者或者叫做沙箱(Sandbox)实现。</li>
     <li>事件机制更深的功能是提供一个模块的通信机制。</li>
     <li>对于组件库，组件实例之间的通信更加重要，组件实例之间最好不要存在相互引用的关系，互相不能感知对方的存在，有了事件机制，可以通过第三方有效的通知组件实例，减少组件实例间的耦合。 </li>
</ul>
<br />
3.模板机制：<br />
<br />
实际上写组件的时候，拼装html是一件很复杂的事情，模块能够从数据模型，对于组件库来讲通常是配置信息选项。将这些选项拼装成html字符串。但是大家普遍的一个误区是在追求语法的简便的和性能。我倒觉得模板要做的事情远不止如此。功能强大的模板不仅仅只完成字符串的拼接，而是要简化整个DOM操作，从数据模型到DOM的双向绑定，Model更新了DOM也随之更新。甚至要解决动态DOM事件绑定的问题。<br />
<br />
<br />
4.面向对象的机制<br />
<br />
放在组件库这个角度去谈面向对象的时候，他是一个架构设计中的一个重要的一环。<br />
面向对象的机制能有效的提升代码的可复用性和扩展性，javascript灵活的语法诸如prototype/closure的方式，能构建出一个强大的类库。<br />
可以使用继承机制扩展已有的组件。也可以用引用的方式装饰(Facade)现有组件，个人更倾向于使用装饰。因为继承总会不可避免的直接或者间接去访问父类的一些私有属性方法。<br />
这个机制其实决定了一个组件的代码模型，通常需要解决的问题有：<br />
<ul>
     <li>该组件继承自哪些组件或者基础类，或者依赖于那些类？</li>
     <li>组件实例的管理方式，因为每个组件实例都需要在一个容器中统一存放，理想的的存放模型应该是树形的，在内存中存在类似DOM树一样的组件对象树，是否可以通过类名找到相关实例，根据ID获取实例，获取子实例，父实例，父/子实例之间的通信父实例的resize是否能通知容器内的实例resize。</li>
     <li>插件机制：作为一个非常重要的扩展机制，插件能有效的解决组件间的复用部分，通常这部分会叫做行为(behavior)，对于组件不能提供的甚至是个性化的功能，有没有提供有效的，足够多的扩展点。</li>
     <li>提供怎样的实例化方式？ new XXX() ?? 还是类似DOM的操作方式appendInstance??甚至有类似jq这种链式。我更觉得应该使用appendInstance的方式，这样能更加有效的体现组件示例间的父/子关系。就像DOM操作一样，最终组件实例也是树形结构，如果我们直接new XXX() 这种方式，其实相当于声明了一个游离态的 DOM节点。实际我写代码的时候发现要管理这些组件实例也是比较麻烦的地方，试想一个页面如果有多个组件实例，需要声明多少个实例变量，或者申明多少个对象去存放这些实例。</li>
     <li>组件提供的API，一个组件对外暴露的API会包括初始构造方法，公共方法(method)，事件(event)，对于event，提供怎样的eventData也非常重要。 </li>
</ul>
<br />
5.模块化机制<br />
<br />
如今模块化的思想已经深入人心，模块化带来了很好的团队多人完成一项大的任务的可能性，符合高内聚低耦合的思想。到了如今这个时代，万物皆模块。<br />
组件库通常是一个庞大的工程，单靠个人英雄主义很难做的完整全面。<br />
详细的来讲，模块化机制涉及：<br />
<br />
<ul>
     <li>模块本身的定义，注册，直接影响一个组件的代码模型，一个组件是一个模块。</li>
     <li>模块的依赖申明以及追朔机制：就像前面提到的，依赖于那些类，css文件，资源，数据。不仅仅需要声明，还应该可追朔，依赖的父类，也能找到父类本身所依赖的资源，这样为按需部署打包，在线调试提供居多方便。</li>
     <li>加载机制：因为在开发阶段要么放一个整个组件库代码，要么是通过一个加载器按需加载，到了线上希望只部署引用到了模块组件，这样可以减少实际部署的文件大小。加载机制会涉及到浏览器的javascript/css文件的加载，尤其是需要尽可能的并行下载而且按照依赖关系先后执行。包括应用模块，可以方便的通过这种加载机制延迟，按需，按时的加载到页面中。</li>
     <li>打包部署机制：由于依赖可追朔，这样实际项目中用到的那些组件可以分析出来，最终可以根据实际使用到的情况打包出适合大小的组件库，减小冗余包的存在。</li>
     <li>模块间的通信机制，由于模块减轻耦合甚至是独自孤立存在，组件之间的通信就非常重要，比如通常一个页面上面的菜单组件实例点击需要触发下面组件的更新。如果直接监听菜单事件去更新下面的组件，也许菜单是每个页面都有。但是下面的组件不是每个页面都有，这样的事件监听就显然耦合较重，互相依赖对方的存在。如果菜单点击这是告诉第三方我被点击了。下面的组件只去监听第三方的事件，这样的代码思路明显要好过很多。 </li>
</ul>
需要再次强调的是万物皆模块，这意味着通用组件本身实现是一个模块，实际应用场景中的业务模块也是模块，都需要遵守模块的约定。<br />
<br />
6.前端的基本开发思想<br />
<br />
取决于个人经验：比如MVC的思想在组件实现过程中非常重要，Model通常是构造函数中那一堆配置信息，View通常是需要通过Model提供数据用户呈现，实际上View上的操作的相应都需要Model来记住状态。Controller用于操作二者。原理大家都知道，在开发中怎样分清三者界限。保证思路清晰。<br />
<br />
 前端中javascript/css/html的角色也类似与MVC。下面的一些代码方式就有违MVC的一些思想：<br/>
<ul>
     <li>css Expression:不仅IE only，更重要是CSS中写javascript这个风格不对，难以维护。</li>
     <li>javascript直接修改style.xxx='xx'。能写成css class的最好都写成css class。</li>
     <li>html中直接写onxxx="foo()"，没有人能保证foo方法存在不被修改。</li>
</ul>
<br />
7.其他需要考虑的问题：<br />
<ul>
     <li>测试用例：通用组件库是一个庞大的工程，也许牵一发动全身，不知道哪个API的变动会影响多少调用者，有充足的单侧用例，一定程度上能保证整个组件库的稳定性。</li>
     <li>粒度：粒度是一个很值得思考的问题，其实html的标签可以当做是一个小的组件，只是因为粒度很小，要完成一个复杂的应用，有很多的可复用组件都需要用到大片大片的重复html片段。另外一个极端，我们我们把整个页面都写成一个组件，显然没有复用性，跟没封装一样。所以选择一个合适的组件粒度，一个组件完成特定的功能，有利于搭建出有想象力的应用。</li>
     <li>一致性：需要有很好的代码规范和约定。才能保证API的一致性，用户也会理所当然的想到怎样用API，降低学习成本，一个最常见的例子就事件监听的参数，建议统一为(eventObject,eventData)。</li>
     <li>文档&amp;Demo:这个不用多说，没有文档和demo的东西没有人去看代码怎么使用。</li>
     <li>性能：DOM操作是组件库的性能杀手，高效的DOM操作尤其重要，事件监听也是非常耗时的，建议能采用代理的都用父节点来代理。</li>
     <li>资源释放：组件的资源，引用是否能完全释放？尤其是开发SPA，组件的资源内存释放就非常重要了。 </li>
</ul>
<br />
总结：<br />
零零星星的提到了这么几点，也是过去工作中的体会，当然会有不足，望大家补充，回头可以check一下现在用到的一些框架/组件。欢迎讨论。
<img src ="http://www.blogjava.net/Hafeyang/aggbug/384477.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Hafeyang/" target="_blank">衡锋</a> 2012-08-01 01:19 <a href="http://www.blogjava.net/Hafeyang/archive/2012/08/01/how_to_build_frontend_component_lib.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>恩，一场气氛很好的技术讨论，jQuery vs YUI。</title><link>http://www.blogjava.net/Hafeyang/archive/2010/11/07/a_perfect_discussion_between_jQuery_YUI_and_for_me.html</link><dc:creator>衡锋</dc:creator><author>衡锋</author><pubDate>Sun, 07 Nov 2010 07:30:00 GMT</pubDate><guid>http://www.blogjava.net/Hafeyang/archive/2010/11/07/a_perfect_discussion_between_jQuery_YUI_and_for_me.html</guid><wfw:comment>http://www.blogjava.net/Hafeyang/comments/337457.html</wfw:comment><comments>http://www.blogjava.net/Hafeyang/archive/2010/11/07/a_perfect_discussion_between_jQuery_YUI_and_for_me.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Hafeyang/comments/commentRss/337457.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Hafeyang/services/trackbacks/337457.html</trackback:ping><description><![CDATA[事情的来由是在11月3号在<span class="Apple-converted-space">&nbsp;</span><a href="http://www.quora.com/" target="_blank"><span style="widows: 2; text-transform: none; text-indent: 0px; border-collapse: separate; font: medium Simsun; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(0,0,0); word-spacing: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px" class="Apple-style-span"><span style="line-height: 20px; font-family: Verdana, Arial, Helvetica, sans-serif; color: rgb(73,73,73); font-size: 12px" class="Apple-style-span"><a style="color: rgb(2,122,198); text-decoration: none" href="http://www.quora.com/" target="_blank">Quora</a></span></span>&nbsp;</a>上有人提问：<a href="http://www.quora.com/How-could-YUI3-improve-its-image-compared-to-jQuery-MooTools-etc/">http://www.quora.com/How-could-YUI3-improve-its-image-compared-to-jQuery-MooTools-etc/</a>&nbsp; 从标题来看只是想讨论YUI的的镜像问题，因为目前YUI的站点有 <a href="developer.yahoo.com/yui/">developer.yahoo.com/yui/</a>&nbsp;，也有<a href="http://yuilibrary.com/">http://yuilibrary.com/</a>&nbsp;，文章也拿YUI与jQuery,Mootools来了一番比较。没想到这文章引发了一场比较轰轰烈烈的讨论，jQuery的发明者John Resig ,&nbsp;<span class="Apple-converted-space">&nbsp;</span>Yahoo!&nbsp;大牛 Zakas的回复。<br />
<br />
非常感谢<a href="http://www.zhuoqun.net/html/y2010/1561.html"><span style="widows: 2; text-transform: none; text-indent: 0px; border-collapse: separate; font: medium Simsun; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(0,0,0); word-spacing: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px" class="Apple-style-span"><span style="line-height: 20px; font-family: Verdana, Arial, Helvetica, sans-serif; color: rgb(73,73,73); font-size: 12px" class="Apple-style-span"><a href="http://www.zhuoqun.net/html/y2010/1561.html"><span style="widows: 2; text-transform: none; text-indent: 0px; border-collapse: separate; font: medium Simsun; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(0,0,0); word-spacing: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px" class="Apple-style-span"><span style="line-height: 20px; font-family: Verdana, Arial, Helvetica, sans-serif; color: rgb(73,73,73); font-size: 12px" class="Apple-style-span">Dreamer<span class="Apple-converted-space">&nbsp;</span></span></span></a>的总结</span></span></a>和<a href="http://ued.taobao.com/blog/2010/11/06/yui3-vs-jquery/">taobao UED 的翻译</a>，是我有幸能在比较短的时间了解这次讨论的始末。讨论的气氛很好，回复都是经过深思熟虑而客观的。不夹杂任何主观色彩。但是想要有一个绝对的胜负是很难的，毕竟任何一种技术框架的存在都有他的适用环境和生存法则，拿来比较也是能相互进步。<br />
<br />
其实我认为结论很简单，jQuery适用于中小型网站，YUI适用大型的网站应用。这点非常同意。对于jQuery，单个插件来讲能完成的功能有限，而对于完整的UI解决方案来讲,jQuery UIs没有YUI那样齐全和规范。<br />
<br />
我不想拿事件本身来讨论，看完后我们在技术讨论的时候是否能做到谦虚而又不失观点。 做技术的人最忌讳的是心浮气躁，浅尝辄止，只有深入去了解一个东西了，甚至横向深究才能说出一种技术的始末。&nbsp; so stay calm.
 <img src ="http://www.blogjava.net/Hafeyang/aggbug/337457.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Hafeyang/" target="_blank">衡锋</a> 2010-11-07 15:30 <a href="http://www.blogjava.net/Hafeyang/archive/2010/11/07/a_perfect_discussion_between_jQuery_YUI_and_for_me.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>架构之路(3)-永恒的话题-CRUD</title><link>http://www.blogjava.net/Hafeyang/archive/2009/12/25/307292.html</link><dc:creator>衡锋</dc:creator><author>衡锋</author><pubDate>Fri, 25 Dec 2009 08:52:00 GMT</pubDate><guid>http://www.blogjava.net/Hafeyang/archive/2009/12/25/307292.html</guid><wfw:comment>http://www.blogjava.net/Hafeyang/comments/307292.html</wfw:comment><comments>http://www.blogjava.net/Hafeyang/archive/2009/12/25/307292.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Hafeyang/comments/commentRss/307292.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Hafeyang/services/trackbacks/307292.html</trackback:ping><description><![CDATA[<p>前面说过所谓的业务大多数是crud。那从这个入手，我发现要把这个配置出来，配置的结果不言而喻，能生成crud的页面。我们其实只需要一些元数据(meta information)。元数据就相当于我们平常用的hibernate 里面的cfg.xml之类的东西。用来描述实体/字段的一些信息。从业务的需要来讲，单凭这个xml的配置还不能生成crud的页面。还需要很多的信息。下面是这些字段信息的整理。</p> <table cellspacing="0" cellpadding="0" width="510" border="0"> <tbody> <tr> <td width="265"> <p>TABLENAME</p></td> <td width="243">表名</td></tr> <tr> <td width="294">TCOLUMNSNAME</td> <td width="256">表字段名</td></tr> <tr> <td width="301">TCOLUMNSTYPE</td> <td width="260">表字段类型</td></tr> <tr> <td width="302">ECOLUMNSNAME</td> <td width="261">实体字段名</td></tr> <tr> <td width="302">ECOLUMNSTYPE</td> <td width="262">实体字段java类型</td></tr> <tr> <td width="302">COLUMNSLENGTH</td> <td width="262">字段长度</td></tr> <tr> <td width="302">COLUMNSNULLABLE</td> <td width="262">是否允许为空</td></tr> <tr> <td width="302">ISPRIMARYKEY</td> <td width="262">是否主键</td></tr> <tr> <td width="302">STATE</td> <td width="262">启用状态</td></tr> <tr> <td width="302">DESCRIPTION</td> <td width="262">描述</td></tr> <tr> <td width="302">COLUMNID</td> <td width="262">字段序号</td></tr> <tr> <td width="302">LABELTEXT</td> <td width="262">字段label名称</td></tr> <tr> <td width="302">DEFAULTVALUE</td> <td width="262">字段默认值</td></tr> <tr> <td width="302">CANSEARCH</td> <td width="262">是否为查询字段</td></tr> <tr> <td width="302">SEARCHINPUTTYPE</td> <td width="262">查询呈现方式,文本框/下拉框/..</td></tr> <tr> <td width="302">SEARCHOPERATOR</td> <td width="262">默认查询运算符,等于/大于/..</td></tr> <tr> <td width="302">FORMAT</td> <td width="262">字段显示格式,日期格式/小数格式/货币格式</td></tr> <tr> <td width="302">CSSCLASS</td> <td width="262">呈现css class</td></tr> <tr> <td width="302">READONLY</td> <td width="262">编辑时是否只读</td></tr> <tr> <td width="302">EDITINPUTTYPE</td> <td width="262">编辑呈现方式 文本框/下拉框/..</td></tr> <tr> <td width="302">CREATESHOW</td> <td width="262">新增时是否显示</td></tr> <tr> <td width="302">UPDATESHOW</td> <td width="262">更新时是否显示</td></tr> <tr> <td width="302">VIEWSHOW</td> <td width="262">查看时是否显示</td></tr> <tr> <td width="302">BLANKMSG</td> <td width="262">值为空警告</td></tr> <tr> <td width="302">VALIDATETYPE</td> <td width="262">校验类型,小数/整数/正整数/..</td></tr> <tr> <td width="302">INVALIDMSG</td> <td width="262">校验不通过警告</td></tr> <tr> <td width="302">MAPPING</td> <td width="262">数据字典,其实就是配置下拉框的通用的数据源。比如通常{1:是,0:否}。</td></tr> <tr> <td width="302">MAXVALUE</td> <td width="262">最大值</td></tr> <tr> <td width="302">MINVALUE</td> <td width="262">最小值</td></tr> <tr> <td width="302">VALIDATEOP</td> <td width="262">校验比较类型</td></tr> <tr> <td width="302">VALIDATETO</td> <td width="262">校验比较对象表达式</td></tr> <tr> <td width="302">VALIDATEREGEXP</td> <td width="262">校验正则表达式</td></tr> <tr> <td width="302">VALIDATEIF</td> <td width="262">校验禁用条件 </td></tr> <tr> <td width="302">CTABLE</td> <td width="262">约束表，这4个属性生成下拉框数据源。</td></tr> <tr> <td width="302">CCOEDECOLUMN</td> <td width="262">约束值字段</td></tr> <tr> <td width="302">CVALUECOLUMN</td> <td width="262">约束文本字段</td></tr> <tr> <td width="302">CCONDITION</td> <td width="262">约束文本字段</td></tr></tbody></table> <p>我估计很多人看了这些属性后笑了，的确，很多人这么做过。后来发现这样做很不灵活，无法满足需要，其实这个问题很简单，为什么不应用一种表达式，ognl,el之类的表达式放在配置项里，这些属性就灵活很多。siebel这样的产品，不也有一些地方需要些一个脚本，比如escript之类的东西么。想想我们天天琢磨的业务，不就是这些东西么。把它配置到数据库里面，接下来就是怎么生成页面的么。我看到的目前大多数的做法是做一个代码生成器，我认为这种做法很不好，代码生成器本身是解决了很多机械活，但是关键还是你生成的代码本身的质量。没错，你可以用代码生成器去免去上万行代码要手写的尴尬，我不仅要问，为什么会弄成上万行的代码？有的人还喜欢吹嘘我写过上万行的Java代码，我更是嗤之以鼻，这不是你的骄傲，这恰是你的悲哀。上万行的代码，我见过的有两种可能性，一个是java/jsp代码没有重构，没有封装。二是数据库的设计有问题，一个表200个字段，页面能不复杂么。第一种是架构师要解决的问题，第二种那据是设计时要注意的事情了。扯远了。界面是怎么出来的。至少不是用代码生成器跑出来的。接触过ruby on rails 或者grails的朋友肯定知道里面的activerecord/scanffold组合快速实现crud。不过他说白了也是在生成页面+改代码，我还是不喜欢。因为界面确实是太灵活。我的思路分两个个方面入手:1.封装字段，根据上述字段属性封装成jsp的tag。这个tag通过字段名读取元数据属性，生成浏览器执行的html,javascript。2:所谓页面不久是指定这个页面有哪几个字段不就得了。查询页面，那几个字段是查询条件，读取字段的查询属性。编辑页面，无非是指定编辑哪些字段就行，在这个基础上做一个小工具，页面就很容易出来。当然，好的框架还要解决一个问题，就是变更。怎样能以最少的代价做变更。这个我是这么想的。比如说，某个表删除一个字段，我们可以提供一个工具查询哪些页面引用了这个字段，然后用程序一并删除，其实这个实现也不难，因为每个字段无非就是jsp页面的一个tag么。大不了用个全文搜索。用正则一替换就完了。</p> <p>上面是我总结的快速实现crud的一些想法。这部分其实是很多重复性劳动的根源，把这些工夫省下来了。开发效率高很多。</p><img src ="http://www.blogjava.net/Hafeyang/aggbug/307292.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Hafeyang/" target="_blank">衡锋</a> 2009-12-25 16:52 <a href="http://www.blogjava.net/Hafeyang/archive/2009/12/25/307292.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>架构之路(2)-我所理解的业务和技术</title><link>http://www.blogjava.net/Hafeyang/archive/2009/12/25/307291.html</link><dc:creator>衡锋</dc:creator><author>衡锋</author><pubDate>Fri, 25 Dec 2009 08:51:00 GMT</pubDate><guid>http://www.blogjava.net/Hafeyang/archive/2009/12/25/307291.html</guid><wfw:comment>http://www.blogjava.net/Hafeyang/comments/307291.html</wfw:comment><comments>http://www.blogjava.net/Hafeyang/archive/2009/12/25/307291.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Hafeyang/comments/commentRss/307291.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Hafeyang/services/trackbacks/307291.html</trackback:ping><description><![CDATA[<p>在过去的开发过程中，我发现所谓的业务，在企业级应用的背景下，最终的实现操作都是数据库的增删改查，或者说通俗点说都是数据库的操作，其他的业务类型多多少少是在围绕数据库的操作。在用户的需求最终转化成设计再到代码的实现。</p> <p>我这里说的业务可能是一个有别于技术的东西，有些东西纯粹是靠技术来实现的，用户没有概念，跟他说也没有用，比如做接口，你可能用web service 。用TCP通信等等。这些很多是用户是看不见的。</p> <p>我认为一个比较理想的业务系统应该是业务驾临在技术之上，二者相得益彰。技术需要解决的问题是他有一个平台，能让业务方便的在这个平台上实现。所以我们在做架构的时候要分清楚哪些是业务需要解决的问题，哪些是技术需要解决的问题。</p> <p>从业务的角度看技术，我希望业务能够非常方便的在这个平台上实现，不仅如此，我还希望我的业务变更了。能够以最少的改动或者不改动就能够实现变更。理想的做法我希望业务都是配置进去的，我在变更的时候只需要修改相应的配置就可以了。当然100%的配置出来也不太现实，据我所知，在sap,siebel里面的报表是必须开发的。因为报表主要是查询，查询就非常灵活，单靠配置能难达到目的。</p> <p>从技术的角度去看业务，再好的技术加上一个不入流的设计，都为成为教科书上一个很好的反面教材。业务人员需要在对业务的把握上设计软件。</p> <p>既然要复用，要能够用配置实现业务，那配置些什么东西了?那些地方可以配置。这个就是框架要做的事情了。说到框架大家最喜欢议论的就是怎么快速实现crud了。毕竟，一个系统的很大部分都是在做这个事情。</p><img src ="http://www.blogjava.net/Hafeyang/aggbug/307291.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Hafeyang/" target="_blank">衡锋</a> 2009-12-25 16:51 <a href="http://www.blogjava.net/Hafeyang/archive/2009/12/25/307291.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>架构之路(1)-开篇</title><link>http://www.blogjava.net/Hafeyang/archive/2009/12/25/307269.html</link><dc:creator>衡锋</dc:creator><author>衡锋</author><pubDate>Fri, 25 Dec 2009 07:23:00 GMT</pubDate><guid>http://www.blogjava.net/Hafeyang/archive/2009/12/25/307269.html</guid><wfw:comment>http://www.blogjava.net/Hafeyang/comments/307269.html</wfw:comment><comments>http://www.blogjava.net/Hafeyang/archive/2009/12/25/307269.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Hafeyang/comments/commentRss/307269.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Hafeyang/services/trackbacks/307269.html</trackback:ping><description><![CDATA[<p>不知道多久没有更新blog了。一直以来都想写写我在架构方面的思考。在过去的将近两年的时间里，我从一个实习生到一个自称的架构师。我一直在不断的学习，在学习中融入我的思考。</p> <h2>背景</h2> <p>应该说我从事的是企业管理软件开发，blog标题也说了。做销售领域，怎么说现在的客户也是在国内很有名气的。现在的公司也专注的在的企业信息化的工作。我们面对的业务主要是销售领域，我们部门也曾经做过一些不太成功的crm。售前/售后的领域，想想我们天天说的是企业级应用我认为也算得上了。在我的理解里面，企业级的应用在业务上是一个很专业的领域，需要对软件开发商具有相当的业务能力，公司喜欢把我们的业务人员叫业务顾问，大抵的意思就是我们能提供一个行之有效的解决方案吧。这更说明我们对业务要有相当的了解。所以我们可以专注的做一个行业，做一个领域，把这个领域做精做强了，才能主导市场。说大了。这些当然不是我现在考虑的问题。我只是介绍一下我的业务背景。技术方面，用的是j2ee环境。</p> <h2>我们面临的问题</h2> <p>主要还是两个方面吧。一个是业务方面的，需求不确定啦，永远不停止的变更啦，客户的抱怨啦，迟迟不能上线啦。一个方面是技术方面，代码都是copy/paste啦，大量的无聊的重复性劳动，写代码慢慢的成了体力活。其实这些都是大家经常遇到的问题。</p> <h2>我的看法</h2> <p>这些问题都很宽泛，不是我一个在叽叽喳喳几天就能够全部解决的。我想解决的问题是怎样通过技术手段实现业务的实现，从而形成一个高效的复用的解决方案。领导也想把我们的这个领域做成一个解决方案，形成一个产品，可以拿来实施。其实这个与我最自己的目标还是蛮相近的，我也希望我能从0开始做出一个产品，从技术走向市场，这是公司为用户创造价值的更好的体现，也是我个人的能力的体现。</p> <h2>写作计划</h2> <p>这个话题我想说的很多，都是自己在实践中的思考，我的想法是从技术的角度切入，然后到设计，最终我想形成一个我认为比较理想的业务实现框架。下面是这个系列的索引。</p><img src ="http://www.blogjava.net/Hafeyang/aggbug/307269.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Hafeyang/" target="_blank">衡锋</a> 2009-12-25 15:23 <a href="http://www.blogjava.net/Hafeyang/archive/2009/12/25/307269.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>