外架全件架盐船是什么意思思

您的位置: | 公司简介
无锡光伟环保设备有限公司,?是一家专注于环保节能的表面处理设备和周边设备的研发、制造、销售和服务于一体的高新技术企业。 公司拥有一批表面处理行业20多年经验的专业技术人才,自成立以来,一直秉承“品质为本,技术领先、信誉至上、合作共赢,”的企业理念,全面推进ISO9002质量管理体系和“5S”现场管理,未来仍将不断的提升公司的科学管理水平。公司位于交通便利、经济活跃的无锡市惠山区杨市镇,拥有6000多平米的生产组装基地。公司遵照客户要求提供定制的设备和个性化的服务,目前主要产品包括:卷对卷高速连续电镀设备、针对直插式、贴片式、大功率、SMD等各类LED支架的专业化精密电镀设备、各类IC引线框架及工业用线材电镀设备、新型全自动及半自动滚挂镀设备,以及工业用水处理、车间空气净化、工业清洗等各类电镀周边设备。 公司提供的产品和服务已经涉及电子电气、汽车、新能源、五金工具等多个领域,客户群体遍布于长三角、珠三角等中国经济发达地区,且已经出口至南亚、中东等国外市场。公司的产品和服务深受客户的一致肯定和好评。 真诚希望各界朋友及有识之士继续关注和支持光伟环保,一起携手不断拓展合作领域,共同开创美好未来!
通讯地址:洛社镇杨市镇北工业园祥和路3号&&&&联系人:赵伟华&&&&移动电话:&&&&无锡光伟环保设备有限公司,是一家环保设备、电镀设备的研发设计、制造、安装和维护的一体型企业。主要生产卷对卷连续电镀线,LED支架电镀线,SMD支架电镀线、接插件端子电镀线,五金件滚挂镀电镀线及电镀周边设备,冲压周边设备。公司依靠自身强大的研发能力,结合质量管理体系要求,使产品在设计、制作上领先于其它专业制造商,为众多的国内外用户提供全方位的专业服务。,无锡光伟环保设备有限公司香港六合彩天线宝宝,六合彩大全,香港本期开奖结果,香港开码本期结果软件框架设计的艺术 _百度百科
特色百科用户权威合作手机百科 收藏 查看&软件框架设计的艺术本词条缺少概述、信息栏,补充相关内容使词条更完整,还能快速升级,赶紧来吧!
作者 (捷)Jaroslav Tulach
[作译者介绍]译者 王磊 朱兴
丛书名 图灵程序设计丛书
出版社人民邮电出版社
出版日期2011 年3月
版次1-1软件框架设计的艺术帮助你解决api 设计方面的问题共分3 个部分分别指出学习api 设计是需要进行科学的训练的java 语言在设计方面的理论及设计和维护api 时的常见情况并提供了各种技巧来解决相应的问题
软件框架设计的艺术作者是netbeans 的创始人也是netbeans 项目最初的架构师相信在api 设计中遇到问题时本书将不可或缺
软件框架设计的艺术适用于软件设计人员阅读
本书提供作译者介绍
Jaroslav Tulach NetBeans的创始人也是NetBeans项目最初的架构师有着丰富的项目开发经验一直致力于如何提高开发人员的设计技巧从而保证了NetBeans项目的成功
王磊 工学学士及硕士2006年起任职于普元公司一直担任普元公司主任架构师同时是自由软件Aquarius ORM Studio的作者
朱兴 软件工程师一直从事软件研发工作熟悉JavaEclipse插件开发API设计等相关技术本书帮助你解决API 设计方面的问题共分3 个部分分别指出学习API 设计是需要进行科学的训练的Java 语言在设计方面的理论及设计和维护API 时的常见情况并提供了各种技巧来解决相应的问题
本书作者是NetBeans 的创始人也是NetBeans 项目最初的架构师相信在API 设计中遇到问题时本书将不可或缺
本书适用于软件设计人员阅读读者也许会想在程序开发领域中讲述软件设计的技术图书是不是太多了的确如此因而你有理由来质疑为什么我还要写一本这样的书而你又凭什么还要再读这样一本书说起软件设计的经典图书那本由GoF执笔的设计模式对每一个想要掌握面向对象技术的开发人员来说已经成为案头必备之书此外对于不同类型的应用开发也存在大量专业的软件设计模式图书还有Effective Java这本传世之作已经成为众口相传的Java程序开发圣经基于以上事实还有必要再多一本关于软件设计的图书吗?
我相信这自有其必要性从1997年开始我一直从事NetBeans的API设计工作在此期间与其他设计框架或者通用功能库的人一样我也经历了各种酸甜苦辣刚开始时我一边尝试将其他语言的一些好的代码风格照搬到Java语言上一边慢慢地找感觉随后我对Java语言使用渐趋熟练将已知的模式应用到我写的Java语言代码上看起来也就容易多了当然后来我又发现事情远不是想象中的那么简单我认识到要设计NetBeans这样一种面向对象的应用框架直接套用传统的模式并不恰当不管那些传统的模式有多成功它所需要的是一门全新的技艺
NetBeans中最早的API要追溯到1997年了距今已有10多年的历史至今仍然有不少用户在使用这些API而且程序运行一切正常当然坦率地说其中有很多内容与开始时的设计已经不尽相同在这10多年中我们也经常根据新的需求来调整和扩展类库的功能同时对开始时犯下的一些错误进行修正尽管如此那些使用了这些API的客户仍然可以使用最新版本的类库来编译并运行他们早先的程序这一切并非偶然因为我们一直在尽最大的努力来保证类库的向后兼容性即使客户使用我们10多年前提供的类库来编写程序然后用最新版本进行编译和运行这些程序仍然可以平稳地工作这种有效地保护客户原有的软件投资的理念非常重要但在常见的设计图书中却无法找到至少在我读过的那些书中无人提及当然在NetBeans平台的开发过程中并不是所有的API 的演化之路都是一帆风顺的但我相信NetBeans的团队成员已经炉火纯青地掌握了这方面的API设计技巧而其他组织的开发人员也同样需要了解这些技巧基于这个原因向后兼容性这个话题在本书中占用了大量篇幅书中还大量介绍了特殊的API设计模式有助于编写适合向后兼容的代码
NetBeans团队工作的扩展能力是当时所面临的另外一个挑战1997年项目刚刚开始的时候由我个人负责API的开发其他工程师的工作则只是写代码也就是说他们负责完成用户界面并实现其他NetBeans IDE这些工作都需要频繁用到我所设计的API毫无疑问当时我就变成了整个项目的瓶颈我开始认识到实现NetBeansIDE功能的开发人员越来越多我一个架构师不可能完成所有的API需求随着时间的流逝急需做出改变NetBeans的开发团队中的大部分开发人员都应该能够设计他们自己的API而且不管是哪个开发人员设计的API我们希望保持一致性但一致性在这里却成为最大的一个问题原因不是出在开发人员身上他们其实也想保持一致性只是因为我当时无法给他们解释清楚我所指的一致性到底是什么东西相信很多人也有过与我类似的感觉自己知道如何去做一件事但就是无法清楚地解释给别人听我当时就处于这种状态我觉得自己知道如何设计API但却花了好几个月的时间才整理出想让大家遵守的最重要的规范
铭记于心的API讲座
一直以来我对设计和发布API都有着浓厚的兴趣在Sun公司内部以及为NetBeans合作伙伴我也做过多次关于该议题的讲座但直到2005年在旧金山举行JavaOne会议时我才第一次就这个议题进行了公开讲座当时我和我的朋友Tim Boudreau向大会提交了一份议题名为如何设计历久弥新的API也许是因为在议题摘要中没有写上Ajax和Web 2.0这种吸引眼球的字样我们的议题被安排在晚上10点30分对于讲座而言这个时间点实在算不上理想各种聚会免费的啤酒宵夜以及午夜的各种娱乐活动都会抢走我们的听众我们深受打击只能期望讲座期间会有一两个朋友来露上一小脸问上几个问题当晚我们抵达会场看到隔壁将要进行一场JDBC 的讲座时我们的情绪更是一下子跌到了谷底走廊里挤满了人我们以为这些人都是对数据库感兴趣准备来参加隔壁的JDBC技术讲座的但让我们吃惊的是大部分听众其实是冲着我们的讲座来的举办讲座的房间很快就水泄不通了座无虚席还有些听众干脆坐在地板上或者倚墙而立甚至门都不能关上因为还有部分人只能站在外面的走廊听最终我做了一场从未有过的激动人心的讲座
自那以后我确信有很多人想要了解如何设计API这种需求并非凭空臆造而是真实存在的因此在我撰写此书的过程中每当快要失去动力的时候便会想起那场激情澎湃的讲座就又重燃热情这场讲座时刻提醒着我那些源于实践并指导我们正确设计API的原则应当被记录下来这些原则虽然基于大量的设计图书介绍的设计知识但在本书中得到强调和扩展因为API设计有其特殊性
API设计的特殊所在
为什么说市场上现有的设计图书还不够用呢这是因为设计框架或者通用类库是一件非常复杂的事情其复杂度与自行设计内部系统不可同日而语打个比方在一台服务器上基于一个小型数据库来搭建一个Web应用之类的小系统就和盖一间房子差不多当然有些房子可能很小也有些房子会很大有时也许是一座摩天大楼这些建筑通常情况下都只有一个主人只有他才会改造这个房子如果需要的话改一下屋顶换上新窗户也许会砌面墙多隔出一间来再拆旧墙打通两个房间等等当然有些改变算不上什么麻烦事如换个屋顶不会对地板造成什么大的破坏换个窗户只要大小规格不变也不会影响别的部位但是如果想把窗户从小变大就不那么简单了而想换个两倍大的新电梯更是不可能完成的任务再如罕有人会疯狂到盖个新的一楼然后把原来的楼层都往上移一层这样做实在是问题多多弊大于利当然从技术角度来看上面这些变化仍然是可行的只要这个房间的主人确有这个需要铁了心也能做到
内部软件系统也有些相似通常也只有一个所有者而且它还具有完全的控制权如果现在需要对系统中的部分功能进行升级那么尽管放手去做就是了如果要改变一下数据库的模式也可以悉听尊便当然有些改变会比较复杂拿以下两种情况作个比较修改一行代码来修复一个NullPointerException的bug和调整数据库模式显然后者的影响会大得多但对于内部系统来说一切改变都是可行的因为其所有者有着绝对的控制权只要系统确实需要大的升级甚至可以暂时关闭这个应用系统等完成升级以后再重新运行此外我们已经有了不少相关的设计原则帮助我们更好地管控一个内部系统的变化有设计模式的书籍帮助开发人员更好地组织代码还有不少关于设计系统和测试系统的方法论还有大量的图书介绍如何组织和领导员工进行团队合作可以说维护一个内部系统的方方面面都是非常清楚明了的也有很多详细文档可供参考
但是编写API则有所不同可以拿宇宙来打个比方尽管宇宙不像先前说的房子那么直观但还算得上比较形象先来回忆一下我们已知的宇宙我说已知的宇宙是因为没有人能洞悉宇宙的一切所有那些恒星银河以及其他天体还包括无形的内容如所有物理规律当然人类现在对宇宙所了解的其实只算得上沧海一粟我们的视野有多宽就限定了宇宙在我们眼中的样子也就是说我们所说的宇宙只是在我们自己眼中的宇宙是真实宇宙在我们眼中的一个缩影它包含了无数的天体和状态然而我们的经验和想象告诉我们在我们视野范围以外还有其他的星星和银河但我们对它们一无所知千百年来人类通过打造更先进的设备及不断地认识和理解自然的规律不停地扩展自己的视野不断地发现新事物或者新规律人类关于宇宙的认识和经验就是基于上述实践而逐渐形成的
宇宙并非亘古不变而是时刻都在变化但其变化却有规律可循这些规律告诉我们行星恒星以及其他天体之间是如何相互影响的举例来说假设某个人通过自己的观察发现了一颗新的恒星那么不管明天后天还是大后天都可以观察到这颗恒星这并不奇怪虽然现有的自然规律告诉我们恒星不仅会移动而且会旋转甚至还会爆炸但这些变化都会遵从自然规律不会有人隔一两周就发现一件宇宙大事说有某个恒星出现了消失了或者是进行随机性的移动如果宇宙真有这么疯狂那么就完全颠覆了我们今天对于宇宙的认识我们通常认为一旦一颗恒星被发现它就会长久存在甚至相信即使无人观察到它它依然存在这颗恒星可以被地球上的一个人观察到也可以被太阳系其他地方的另外一个人观察到甚至还有宇宙中其他智慧生物观察到当然也可能无人注意它但恒星本身并不知道自己是否被他人所观察它只会默默遵照自然规律存在和运行因此一旦被发现它便一直陪伴着我们
好的API也是如此一旦某个通用的类库在某个版本引入了一个新方法就好像发现了一颗新的恒星所有使用该类库的人都可以看到并使用该方法至于是否在自己的程序中使用则要视乎程序员自己的需要了有可能多数API的使用者对你添加的新方法完全不在意但你不能把希望寄托在这种并无根据的猜测之上多年的开发经验告诉我API的用户太有创意了有时候他们涉及的领域甚至超过了API设计者换句话说只要API有可能被误用就一定会有人去误用这个API随之而来的结果就是不管是方法本身还是其设计者都不知道该方法是否被使用及其使用频率有多大也许会有很多用户使用它也许一个都没有但除非你想破坏优秀API的设计法则即打破其向后兼容性否则就必须假定有人在观察必须保证这些API得到良好的维护和保留API就如同恒星一旦出现便与我们永恒共存
宇宙与API的设计还有一个相似之处我们对宇宙的认识不断加深正如我们的类库在不断演进古希腊人已经可以识别和观察远至土星和木星的所有行星的运行路线这就是他们眼中的宇宙的样子他们尽力去解释行星运行背后的原因但以今天的标准来看他们显然并不成功他们还不能揭示出行星运行的规律到了文艺复兴时期哥白尼提出了日心说而开普勒则用行星三大定律来诠释行星相对于太阳的运行轨迹和速度这些探索丰富了人类对宇宙的发现从而能够对宇宙是什么进行精确的解释但没有人知道宇宙为什么是这个样子直到1687年牛顿才对这个问题给出了诠释他引入了万有引力的概念万有引力不仅可以用来解释开普勒定律还极大地扩展了我们对宇宙的认识因为对于已知宇宙中多个天体间发生的所有事情基于牛顿定律的物理学 几乎都可以给出合理的解释
一切看来都很完美直到19世纪末很多实验都发现了一些无法用牛顿定律来解释的现象特别是对于一些高速运动的天体这些现象促使爱因斯坦创立了相对论帮助我们更深入地理解宇宙及其各种现象包括对高速运动的天体的理解事实上爱因斯坦的理论是牛顿理论的延伸只要天体慢到一个合理的速度那么使用这两个理论可以得到相同的结果此时可谓殊途同归
前文啰哩啰嗦地说了很多物理和历史背景的内容这些东西与设计API有半点关系吗接下来先让我们来假设有一个上帝万能的他通过一个API库与人类进行沟通这个库是人类通向这个已知的宇宙的桥梁古希腊人使用这个库的0.1版本其功能很简单只能用来列举不同的行星以及它们的名字这个库提供的API显然不够丰富但对于那时候的人来说已经足够了借助于这个简单的API库古希腊人已经可以分辨几颗行星在这个库的使用过程中会有不少人经常提出新的需求希望对这个API库加以改进当开普勒需要进一步了解行星的运行规律时就发现这个库的功能已经不能满足他的需要了因此这个万能的上帝就给了他一个升级版本姑且称之为1.0版吧这个版本的库能够为每个行星在某个时间点上提供空间坐标以确定其位置同时1.0版本很好地兼容了0.1版本也就是说原来那些古希腊人所使用的功能仍然可以正常使用
只不过用户从来没有知足的时候物理学家们亦如是为了帮助牛顿那位万能的上帝接着提供了宇宙2.0这个重要的版本该版本不仅描述了太阳和其他行星之间存在的万有引力还提供了一堆公式用以计算空间物体的引力加速度及速度也不再只局限于行星了不用说这个新版本仍然兼容以前的版本古希腊人和开普勒使用的那些功能仍然可以在新版本中正常使用
至此所有的变化都很直接一直以来那位万能的上帝只是为新版本添加了一些功能在经典物理学成熟以后物理学家声称宇宙的所有规律都已经被物理学家发现了在物理学的领域已经没有什么未解之谜了这个声明真是一个天大的讽刺上帝抛出了迈克尔逊实验 证明了这个臆断的荒谬进而导致爱因斯坦提出他的相对论这时候物理学家们发现最新版本的宇宙API库出现了无法简单向后兼容的问题因为新的理论指出以前所有的物理学家包括牛顿都存在少许的错误尽管出现了如此大的一个变动但新的API库仍然可以按向后兼容方式来处理那是因为只有以特别高速运动的物体根据原有方式来计算得到的结果才有可能不正确而在牛顿及其先行者的那个时代受限于技术等原因是无法对这样高的运动速度进行测量的因此尽管不兼容的问题早就存在但用以前的测量技术却发现不了从而也无法证实宇宙API库的功能发生了改变
上述这个荒诞的故事旨在说明我们对宇宙的认识一直在不停地进步我们编写的API库也同样如此或许乐观的人并不认同但我真的感觉人类永远都无法了解整个宇宙的奥秘当然我认为我们对宇宙的了解会越来越多虽然程序员的观点各有不同但我相信所有已经在使用的API库都会永无止境它们会继续演化对此我们必须做好准备我们必须准备好随时改进我们的API库就像我们必须准备好随时修正我们对宇宙的认识
与建造一所房子或一个内部的软件系统不同编写API库需要开发人员放眼未来看到今后潜在的需求但在我看来现在人们设计API的做法往往不是这样目前市面上的图书也并没有促使人们这样思考书中的设计模式大多只能用在特定版本使用者也只是在特定上下文的环境中去考虑问题他们极少参考老的版本也不太考虑未来的需求所举的例子以及相关的上下文都具有很大的片面性当然并非说这些书全无裨益在编写通用功能库和框架时还是需要这些技巧现在我们必须停止学习如何来设计内部系统而要开始学习如何来设计一套API库在学习中一定要坚持一个观点API一旦发布便与我们永恒共存
如果此时你正在书店面对这本书在买与不买之间犹豫不决那是因为你无法判断这本书对你是否有用老实说这点我帮不了你因为我不是你但我可以告诉你我自己为什么需要这本书以及我写作该书的缘由这样也许可以帮助你决定是否应该购买此书我在设计NetBeans框架的API时就像在一片迷茫中寻找光明总是摸不清方向最开始我完全凭直觉而且认为写API是一种艺术我知道对于艺术来讲需要创造力但设计API与艺术是不同的范畴时间慢慢过去我从已经完成的工作中汲取经验逐渐整理出一整套思路和度量标准借助于这些可量化的标准可以将一个普通的API优化成一个优秀的API
本书介绍了 NetBeans团队中一直以何种标准来评价API的质量并清楚地说明我们团队为什么一直坚持使用这个标准事实上这些标准都是我们经过多年的尝试并从错误中吸取教训才最终得到的地球人都知道重新发明轮子并不是一个好主意这是在浪费时间和金钱所以对于那些把API设计更多地看作是一种工程而非艺术的架构师们我郑重推荐此书在NetBeans的初创阶段只有我一个人来设计API 当时我们有一个比较极端的观点一群代码开发人员是不可能设计出一个好的API的其实对于一个单兵作战设计人员来说即使没有任何规则来约束他所设计的API也具有一致性但像NetBeans这样的一个大团队是不能只有一个设计人员的所以我的首要任务就是要去寻找一种方式让更多的人能够设计API同时还能保持整体设计上的一致性那个时候我已经开始撰写本书希望能告诉大家API设计方面的相关理论以及我们编写API的原因和目标等同时还根据我们过去的经验总结出一些规则方便大家来量化一个API的设计质量接下来我将我的经验与NetBeans团队中的成员分享从此我开始放手让他们也来编写API在开始和结束阶段花些时间来评审和指导他们的设计以我的标准来衡量可以说这么做很棒这10年来他们一直在努力地学习和进步现在看来我们设计的API具有了相当高的一致性并满足了我们的大部分需求如果你也处于相应的职位需要评审或者指导他人来设计API你将发现本书中的建议会对你有所裨益
当我想为API给出一个定义时却发现这个定义的范围非常广泛要知道不是说只有一个框架或者是通用库才算是API即使只是写了一个普通的类只要有同事使用了这个类那么也算是写了一个API为什么这样说呢假设你删除了这个类中的一些方法或者是改变了这些方法的名称哪怕是改变了这个类的一些功能这个类的使用者都会火冒三丈为共享库写API也面临同样的问题如果你所写的类有多个人使用了那么你对该类的修改也许会强制要求所有用户都进行相应调整这无异于一场噩梦这种噩梦其实是可以避免的如果在开始写代码时就把一个类当成一个 API来认真对待你会少许多麻烦换个角度来说其实这事也不难只需要设计类的时候再小心一些在调整的时候多多关注它的兼容性再参考和借鉴一些好的经验其实都搞得定如果根据前面所说的这个定义来分析一下几乎所有的开发人员都在编写和设计API
API的一个本质特性就是它的工作机制API的测试是非常重要的借助于它可以更加清楚地说明API的原理没有合适的测试就不可能编写一个好的API本书有几个章节会列出一些测试方式告诉读者如何来有效地测试一个库的公开接口而且即使是要处理该库的多个版本也无碍于测试的正常运行我会详细地说明测试时要注意的各项内容包括签名 单元测试和兼容性工具所以对于那些需要检查API兼容性的人来说本书非常有价值
最后要说的是一个得到广泛使用的类库将会是该库作者的财富如果这个类库能够很好地满足现有用户的需求就会吸引更多的用户来使用财富将会不停地增加要知道只有在类库拥有了大量的用户以后才能在这个基础上获得经济利益从而继续开发和维护这个类库本书会就这一点展开讨论那些喜欢从商业角度来审视软件开发的人会对这一个话题很感兴趣
这本书只适用于Java
NetBeans是一个使用Java语言开发的IDE框架我的大部分与API有关的知识都是从这个项目中学到的如果由我来回答这个问题这本书是否有益于那些非Java的开发那么答案仍然是肯定的对于如何评价API设计是否良好本书给出了很多准则这些准则同样适用于其他的编程语言本书中的一些议题例如开发API的原因编写具有良好结构的文档的规则和动机还有那些关于向后兼容的原则这些内容都可以适用于多种编程语言包括C FORTRANPerlPython和Haskell
当然涉及细节的时候就不得不提到Java语言的具体特性要知道Java 首先是一种面向对象的语言为面向对象的语言设计API的时候像继承虚方法 和封装这些特性都必须加以考虑因此本书给出的一些原则更适用于一些特定的面向对象语言如C+ +Python或Java至于C或FORTRAN这些面向过程的语言虽然不错但已经有点古老了不再适用本书中的原则
Java是一种非常新的面向对象语言它引入了垃圾收集器当前业界已经普遍接受了Java说明即使在产品的正式运行环境下垃圾收集器也是可用的且有益的但在 Java语言出现之前业界更倾向那种自行管理内存的传统方式如CC++都是采用这种方式来管理内存开发人员需要明确地声明如何去申请和释放内存当时也有一些语言像Smalltalk或Ada它们使用了垃圾收集器但它们都被当作实验品没有几个软件开发商敢冒着这样大的风险去使用它们来开发软件Java却从根本上扭转了这个现象目前可以说一个基于内存自动管理系统的语言可以用来编写高性能的程序大多数的软件工程师都已经普遍接受了这个观点而不像以往只会取笑或者害怕使用这种基于内存自动管理的语言一个能够自动管理内存的语言会对你写的API有所要求比如说Java只能通过malloc一样的构造函数来分配对象而不是像C一样需要对应地释放API而且Java中其内存的释放无须程序员关注所以本书中给出的一些意见或者做法更适用于带有垃圾收集器的语言就是那种与Java相似支持内存自动管理的语言
Java还推广了虚拟机和动态编译技术的使用Java的静态编译技术会将源代码编译成多个类文件在代码真正运行的时候才去部署和连接这些文件而这些编译好的类文件格式是不依赖于具体的处理器架构的而应用程序最终运行于这个架构上
以上所说的内容通过运行时环境实现它不仅将分散的类文件连接 起来还将指令转换成处理器可以识别的指令从Java诞生之初这一点就是Java与传统语言的相异之处大家都知道高性能程序不能通过虚拟机的解释来获得像Fortran语言就要在不同的操作系统上分别进行编译根据实际环境来生成相应的可执行汇编这样才能够更好地利用硬件的各种特性来提高程序的运行性能当时很多人包括我自己在内都认为只有使用C或C++才能编写出高性能的程序而Java则不可能做到这一点
然而时间证明基于虚拟机的编程语言具有一定的优势例如跨平台不管在什么硬件平台上所有的数字类型具有相同的长度不需要程序员去了解这些基础的硬件架构内容此外Java程序不会因为段错误而崩溃虚拟机对内存的自动化管理避免了C指针误用而引起的内存泄漏崩溃的问题 而且能够保证使用的变量始终都有正确的类型尽管具有以上所说的多项优势但对于早期的Java虚拟器来说性能仍然是一个长久困扰人们的问题随着时间的推移解释器越来越快而且用来取代解释器的即时编译器 能够生成更快的代码这些新的变化极具吸引力其他的一些新语言也开始采用虚拟机目前虚拟机已经被业界广泛接受并大量使用在一定程度上本书谈论了虚拟机多方面的内容虽有大量的篇幅用来讲述类文件的格式但类文件格式正是虚拟机 的通用语言
如果想全面掌握Java语言结构对于虚拟机的意义那么必须清楚地理解类文件的格式在虚拟机的世界里Java语言及其格式是非常简单的其他编程语言如C也有自己对应的ABI抽象二进制接口模型但Java的类文件非常有特色体现在两个方面首先它天生就是面向对象的其次它使用动态编译这就意味着它所包含的信息远远超过了简单的C对象文件因此学习虚拟机获得的知识几乎不能用于那些虽然优秀但已经很古老的非面向对象语言但对于那些与Java一样使用虚拟机的新程序语言这些知识就会非常有用
Java是第一个能够将实际代码和API文档紧密结合在一起的编程语言通过JavaDoc可以将代码中的注释变成公开的文档Java提倡开发人员使用这种代码即文档的方式这样可以保证文档随时都是最新的尽管其他的编程语言也允许开发人员在代码中加入注释但只有在Java语言中才支持通过JavaDoc将相应的注释转成可供程序员使用的文档从而保持文档和代码的高度一致另一方面这也不再是Java特有的功能了自从这种从代码生成文档的功能被证明了其实用性以后几乎每一种在Java语言之后创建的新编程语言都支持类似于JavaDoc的文档生成功能而且在Java语言出现之前就有的语言也提供了额外的工具用来通过代码生成文档因此本书虽然只分析了JavaDoc在帮助用户理解API方面的有效性以及文档格式的利弊但是给出的结论几乎可以适用于任何编程语言
Java 5中开始支持泛型为Java语言带来多方面的改变虽然本书并不想成为一本全面讲述Java语言构造的图书但泛型这样的一个重要特性是不可忽视的泛型是API设计中的一个重要内容其新颖之处体现在哪里呢要知道传统的面向对象语言通过继承来鼓励重用而其实组合也是一种常见的代码重用形式只不过大家往往都把注意力集中在继承而忽略了组合造成这一问题的根本原因是继承是面向对象语言内置的特性而组合则只能由程序员来手工编码并非常容易出现类型错误同时现代已经有大量的语言将组合作为首要的重用方式其次才是继承尤其是在Hashell这种函数语言中有些人认为这两种方式即继承和组合各有所长不可偏颇所以他们花了大量时间尝试将面向对象语言与多态类型函数语言结合起来
将继承和组合进行有效结合这正是 Java5 中引入泛型的原因一些人认为泛型过于复杂对其大肆批评但我自己在1997年的研究经验表明几乎无法找到比泛型更加合适的方式了在这点上我欣赏 Java语言的设计团队他们在继承和组合这两者之间尽量地保持相对均衡这也是本书讲述泛型的原因所在这样做使得本书的部分内容更加贴近于如 Haskell这种函数式语言
本书之所以适合于其他语言恰恰是因为使用了Java语言它不是去发明一种特定的新编程语言来处理API问题整本书都使用我们熟悉的Java语言书中所有的原则和建议都使用Java固有的编码风格没有引入任何新的关键字也不会对前置和后置条件或者对常量的检查进行一些特殊的支持对于开发一个通用类库的软件工程项目来说一旦确定了一种开发语言和实现目标都会设定一个相应的编码风格约束开发人员使用合适而且统一的编码风格要知道学习新API所需要的工作量与新学习一门编程语言相比可谓小巫见大巫
由于具体项目要使用的程序语言是确定的那么API的设计原则也必然使用该语言来描述我们相信如果能使用C语言来编写一个好的API那么也同样可以使用Java语言来写一个好的 API所以本书中只使用Java语言就足够了总之书中提供了可以应用到任何编程语言的通用内容书中还有一部分内容会更多地讲述面向对象的概念在需要进行深入讲述时会使用Java语言给出合适的例子
学习编写API
毫无疑问肯定有不少人用正确的方式开发了很多API否则现在的市场上就不会有这么多非常有用的软件产品但设计原则设计API的技巧及要点通常都是在开发过程中下意识积累而得而这一过程往往并不具有借鉴意义很多设计师往往没有知其所以然就做一些API设计上的决策结果就是在不停地尝试犯错再尝试再犯错周而复始才逐渐在其潜意识中形成了设计 API的相关知识耽误了很多时间这一过程中会产生很多指导人们正常做事的技巧虽然这种过程非常有用但因为它自身存在的问题导致其产生的大量技巧非常分散不易收集和管理首当其冲的问题就是这些技巧都有其特定的背景和作用域很多人都知道有大量的技巧对于某一个项目或者是特定的人群是非常有效的但只要换个团队或者换个项目就完全不能用了
其次因为各人的思路都不相同所以知识的传递就变得非常困难在解决某个特定问题的时候你觉得使用Java类要比使用Java接口更为合适但一旦换了一个问题这种解决方案可能就完全不合适了即使你尝试去说服别人接受这种方案但如果没有充足的理由去解释你只能使用以往自己成功的案例来说服他人来采用该方案肯定有人会赞同该方案也有人会反对但这都不是知识传承的本意
凭感觉的NetBeans API设计中
必须承认我们在开发NetBeans项目的过程中也经历过这个阶段在设计API时我们会觉得某种设计可行而另一种设计不可行这种判断完全是凭感觉来做出的而不是自底向上有坚实的基础的这就是说进行设计时我们没有严格的推理和分析只是凭着一种感觉依靠我们的潜意识来设计API想将知识传授给其他人的时候就会因为他们根本没有类似于我们的经验也就很难说服他们接受我们的知识这迫使我们深入思考这一现象考虑建立可度量的标准用来帮助大家设计优秀的API这本书就是深入思考后的结晶我们确信我们所积累的经验已经清楚地揭示了我们决策时的逻辑思路现在我们把这些决策时的逻辑清晰地整理出来传授给每一个愿意倾听的人
阅读本书的人首要关注的问题莫过于以下两个为什么创造APIAPI到底是什么东西本书会就这些问题展开详细的讨论
即使不读不理解甚至不同意本书中给出的建议软件产品从业人员只要理解书中的基本需求和思路就会从中受益这有助于更好地认识和理解API设计及其复杂性当开发团队中的所有成员都可以自行设计API时成员间的沟通就会非常简单决策也不再需要多余的解释因为他们拥有相同的知识并在此基础上进行思考这样做的最大好处是可以提高开发人员间的合作效率以及开发团队及其合作伙伴间的合作效率从而保证了软件产品的高质量
这本书尽力想帮助每个人都解决一些问题它尽力为每一位读者解释API设计的基本动机并为开发人员提供了例子和很多技巧它叙述了良好架构的方方面面不管是谁来设计API都可以使用书中给出的那些可度量的原则来评估API的质量
如果你还在怀疑是否应该阅读本书那么给你一个最简捷的回答你要读这本书
这是一本备忘录吗
决定要以何种风格来撰写本书无疑是一件非常困难的事情我当时在两种完全不同的写作风格之间摇摆不定无法定夺一种写作风格是用非常科学化公式化的方式来说明API设计时的动机原因及步骤使用这种方式来撰写的话书中给出的建议和规则具有通用性可以应用于任何项目当然通用性是本书的一个目的书中所说的内容必须是普遍适用的而不是简单地描述NetBeans项目的10年发展史而另一方面我坚信如果只是在不停地说着一些建议讲述着这些原则性的内容而不给出合适的诠释那么再好的建议也不能起到应有的作用我不喜欢只说上一堆是什么而不去详细地解释为什么我一直想清楚地分析上下文并以此来评估各种解决方案然后再根据具体的环境来选择一个最合适的方案这就是为什么我先把设计的背景和大家说明只有这样才有利于大家接受我们的设计原则那么最佳的方式就是把NetBeans项目中不同阶段面临的所有问题一五一十地摆出来因此可以将本书看作一本 NetBeans项目的备忘录
本书日志风格的写法也是一点点形成的本书的写作并不是一开始就列好提纲打好草稿书的议题是我在几年中陆陆续续地添加的每当我们需要解决一个具有普遍性问题的时候就会先在书中增加一个新的议题找到相应解决方案后就会记录下来所以这种方式有效地记录了我们当时解决问题的思路以及相应的规则以这种写作方式来完成本书使得本书读起来就像是记录实验日志一样但我们的实验日志不是像写日记一样每天一份而是针对每个问题进行记录!
为了从这两种写作风格中获得最佳的解决方案本书对每个专题的分析都详细说明了NetBeans项目中需要解决的问题的真实处境然后从特有的问题抽象出一般性的建议或者解决方案可以适用于任何框架或通用库项目这类似我们采用的如下思路首先是面对一个问题然后进行分析并提出解决方案按照这样的思路来阅读本书读者就可以一步步地验证我们给出的建议方案并判断我们推广的通用规则是否正确在任何情况下读者都可以灵活地调整书中所给出的方案意见建议等从而更好地应用到自己的项目中最后采用同样的思路步骤来看是否能得到与我们一致的意见
API设计的技术天地非常美妙但到目前为止都还处于探索阶段需要我们一步步地来积累这些知识今天的软件系统正在变得越发庞大我们需要运用最好的工程实践来正确地架构软件系统并提高它们的可靠性API设计就是其中的一种实践在21世纪的软件开发中希望这本书可以对你的开发进行指导让我们的NetBeans API设计探索成为供你学习的案例让我们总结的经验帮助你消除类似的错误回顾1997年我们踏上了崎岖不平的探索之路走过了峥嵘岁月今天希望读者借助于这本书一帆风顺地通过API设计的艰难险阻而不必重复我们的曲折经历软件框架设计的艺术第1章 软件开发的艺术 4
1.1 理性主义经验主义以及无绪 4
1.2 软件的演变过程 6
1.3 大型软件 8
1.4 漂亮真理和优雅 9
1.5 更好的无绪 12
第2章 设计api的动力之源 14
2.1 分布式开发 14
2.2 模块化应用程序 16
2.3 交流互通才是一切 20
2.4 经验主义编程方式 22
2.5 开发第一个版本通常比较容易 24
第3章 评价api好坏的标准 26
3.1 方法和字段签名 26
3.2 文件及其内容 27
3.3 环境变量和命令行选项 29
3.4 文本信息也是api 30
3.5 协议 32
.3.6 行为 35
3.7 国际化支持和信息国际化 35
3.8 api的广泛定义 37
3.9 如何检查api的质量 37
3.9.1 可理解性 37
3.9.2 一致性 38
3.9.3 可见性 39
3.9.4 简单的任务应该有简单的方案 40
3.9.5 保护投资 40
第4章 不断变化的目标 42
4.1 第一个版本远非完美 42
4.2 向后兼容 43
4.2.1 源代码兼容 43
4.2.2 二进制兼容 44
4.2.3 功能兼容阿米巴变形虫效应 50
4.3 面向用例的重要性 52
4.4 api设计评审 55
4.5 一个api的生命周期 56
4.6 逐步改善 60第5章 只公开你要公开的内容 67
5.1 方法优于字段 68
5.2 工厂方法优于构造函数 70
5.3 让所有内容都不可更改 71
5.4 避免滥用setter方法 72
5.5 尽可能通过友元的方式来公开功能 73
5.6 赋予对象创建者更多权利 77
5.7 避免暴露深层次继承 82
第6章 面向接口而非实现进行编程 85
6.1 移除方法或者字段 87
6.2 移除或者添加一个类或者接口 88
6.3 向现有的继承体系中添加一个接口或者类 88
6.4 添加方法或者字段 88
6.5 java中接口和类的区别 90
6.6 弱点背后的优点 91
6.7 添加方法的另一种方案 92
6.8 抽象类有没有用呢 94
6.9 要为增加参数做好准备 95
6.10 接口vs.类 97
第7章 模块化架构 98
7.1 模块化设计的类型 100
7.2 组件定位和交互 103
7.3 编写扩展点 116
7.4 循环依赖的必要性 117
7.5 满城尽是lookup 121
7.6 lookup的滥用 126
第8章 设计api时要区分其目标用户群 129
8.1 c和java语言中如何定义api和spi 129
8.2 api演进不同于spi演进 131
8.3 java.io.writer这个类从jdk 1.4到jdk 5的演进 131
8.4 合理分解api 143
第9章 牢记可测试性 147
9.1 api设计和测试 148
9.2 规范的光环正在褪去 151
9.3 好工具让api设计更简单 153
9.4 兼容性测试套件 155
第10章 与其他api协作 158
10.1 谨慎使用第三方api 158
10.2 只暴露抽象内容 162
10.3 强化api的一致性 164
10.4 代理和组合 168
10.5 避免api的误用 176
10.6 不要滥用javabeans那种监听器机制 180
第11章 api具体运行时的一些内容 184
11.1 不要冒险 186
11.2 可靠性与无绪 189
11.3 同步和死锁 191
11.3.1 描述线程模型 192
11.3.2 java monitors中的陷阱 193
11.3.3 触发死锁的条件 196
11.3.4 测试死锁 201
11.3.5 对条件竞争进行测试 204
11.3.6 分析随机故障 206
11.3.7 日志的高级用途 208
11.3.8 使用日志记录程序控制流程 210
11.4 循环调用的问题 215
11.5 内存管理 218
第12章 声明式编程 223
12.1 让对象不可变 225
12.2 不可变的行为 229
12.3 文档兼容性 230第13章 极端的意见有害无益 236
13.1 api必须是漂亮的 237
13.2 api必须是正确的 237
13.3 api应该尽量简单 240
13.4 api必须是高性能的 242
13.5 api必须绝对兼容 242
13.6 api必须是对称的 245
第14章 api设计中的矛盾之处 247
14.1 api设计中的自相矛盾 248
14.2 背后隐藏的工作 251
14.3 不要害怕发布一个稳定的api 252
14.4 降低维护费用 255
第15章 改进api 258
15.1 让有问题的类库重新焕发活力 259
15.2 自觉地升级与无意识地被迫升级 265
15.3 可选的行为 268
15.4 相似api的桥接和共存 274
第16章 团队协作 286
16.1 在提交代码时进行代码评审 286
16.2 说服开发人员为他们的api提供文档 290
16.3 尽职尽责的监控者 292
16.4 接受api的补丁 297
第17章 利用竞赛游戏来提升api设计技巧 300
17.1 概述 300
17.2 第一天 301
17.2.1 非public类带来的问题 304
17.2.2 不可变性带来的问题 304
17.2.3 遗漏实现的问题 308
17.2.4 返回结果可能不正确的问题 309
17.2.5 第一天的解决方案 310
17.3 第二天 313
17.3.1 我想修正犯下的错误 316
17.3.2 第二天的解决方案 317
17.4 第三天评判日 320
17.5 也来玩下这个游戏吧 327
第18章 可扩展visitor模式的案例 328
18.1 抽象类 331
18.2 为改进做好准备 333
18.3 默认的遍历 334
18.4 清楚地定义每个版本 337
18.5 单向改进 339
18.6 使用接口时的数据结构 340
18.7 针对用户和开发商的visitor模式 341
18.8 三重调度 343
18.9 visitor模式的圆满结局 345
18.10 语法小技巧 346
第19章 消亡的过程 348
19.1 明确版本的重要性 349
19.2 模块依赖的重要性 349
19.3 被移除的部分需要永久保留吗 352
19.4 分解庞大的api 352
第20章 未来 356
20.1 原则性内容 357
20.2 无绪长存 358
20.3 api设计方法论 360
20.4 编程语言的演变 361
20.5 教育的作用 363
20.6 共享 365
参考书目 366
新手上路我有疑问投诉建议参考资料 查看

我要回帖

更多关于 已下架是什么意思 的文章

 

随机推荐