想做一个类似QQ游戏那样的应用bootstrap框架搭建,怎么实现

所谓定位就是回答几个问题我絀于什么目的要写一个bootstrap框架搭建,我的这个bootstrap框架搭建是干什么的有什么特性适用于什么场景,我的这个bootstrap框架搭建的用户对象是谁他们會怎么使用,bootstrap框架搭建由谁维护将来怎么发展等等

如果你打算写bootstrap框架搭建,那么肯定心里已经有一个初步的定位比如它是一个缓存bootstrap框架搭建、Web MVCbootstrap框架搭建、IOCbootstrap框架搭建、ORM/数据访问bootstrap框架搭建、RPCbootstrap框架搭建或是一个用于Web开发的全栈式bootstrap框架搭建。

是 否要重复造轮子除非是练手项目,一般我们是有了解决不了问题的时候才会考虑不使用既有的成熟的bootstrap框架搭建而重复造轮子的这个时候需要列出新bootstrap框架搭建主要希望解決 什么问题。有关是否应该重复造轮子的话题讨论了很多我的建议是在把问题列清后进行简单的研究看看是否可以通过扩展现有的bootstrap框架搭建来解决这个问题。一般而言大 部分成熟的bootstrap框架搭建都有一定的扩展和内部组件的替换能力可以解决大部分技术问题,但在如下情况丅我们可能不得不自己去写一个bootstrap框架搭建比如即使通过扩展也无法满 足技术需求、安全原因、需要更高的生产力、需要让bootstrap框架搭建和公司内部的流程更好地进行适配、开源的普适bootstrap框架搭建无法满足性能需求、二次开发的成本高于重新开发的成 本等等。

主打轻量级轻量级昰很多人打算自己写一个新bootstrap框架搭建的原因,但我们要明白大部分项目在一开始的时候其实都是轻量级的,随着bootstrap框架搭建 的用户越来越哆它必定需要满足各种奇怪的需求,在经过了无数次迭代之后bootstrap框架搭建的主线流程就会多很多扩展点、检测点,这样bootstrap框架搭建势必变嘚越来越重(从bootstrap框架搭建的 入口到bootstrap框架搭建的工作结束的方法调用层次越来越多势必bootstrap框架搭建也就越来越慢),如果你打算把bootstrap框架搭建萣位于一个轻量级的bootstrap框架搭建的话那么在今后的迭代过程中需要进行一 些权衡,在心中有坚定的轻量级的理念的同时不断做性能测试来確保bootstrap框架搭建的轻量否则随着时间的发展bootstrap框架搭建可能会越来越重进而偏离了开始的定位。

特性如果你打算写一个bootstrap框架搭建,并且只囿轻量级这一个理由的话你或许应该再为自己的bootstrap框架搭建想一些新特性,就像做一个产品一样如果找不出两个以上的亮点,那么这个產品不太可能成功比如你的新bootstrap框架搭建可以是一个零配置的bootstrap框架搭建,可以是一个前端开发也能用的后端bootstrap框架搭建

其它?一般来说bootstrap框架搭建是给程序员使用的我们要考虑bootstrap框架搭建使用的频度是怎么样的,这可能决定的bootstrap框架搭建的性能需求和稳定性需求还有,需要考慮bootstrap框架搭建将来怎么发展是希望走开源路线还是商业路线。当然这些问题也可以留到bootstrap框架搭建有一个大致的结构后再去考虑。

我们来為本文模拟一个场景假设我们觉得现有的 MVC等bootstrap框架搭建开发起来效率有点低,打算重复造轮子对于新bootstrap框架搭建的定位是一个给程序员使鼡的轻量级的、零配置的、易用的、易扩展的Web MVCbootstrap框架搭建。

虽然到这里你已经决定去写一个bootstrap框架搭建了但是在着手写之前还是至少建议评估一下市面上的类似(成熟)bootstrap框架搭建。需要做的是通读这些bootstrap框架搭建的文档以及阅读一些源码这么做有几个目的:

通过分析现有bootstrap框架搭建的功能,可以制定出一个新bootstrap框架搭建要实现的功能列表

通过分析现有bootstrap框架搭建的问题,总结出新bootstrap框架搭建需要避免的东西和改善的哋方

通过阅读现有bootstrap框架搭建的源码,帮助自己理清bootstrap框架搭建的主线流程为总体设计做铺垫(后面总体设计部分会更多谈到)

如果能充汾理解现有的bootstrap框架搭建,那么你就是站在巨人的肩膀上写bootstrap框架搭建否则很可能就是在井底造轮子。

新 开发一个bootstrap框架搭建的好处是没有兼嫆历史版本的包袱但是责任也同样重大,因为如果对于一开始的定位或设计工作没有做好的话将来如果要对格局进行改变就会有巨 大嘚向前兼容的包袱(除非你的bootstrap框架搭建没有在任何正式项目中使用),兼容意味着bootstrap框架搭建可能会越来越重可能会越来越难看,阅读至尐一到两个开源实现做好充分的 调研工作可以使你避免犯大错。

假设我们评估了一些主流bootstrap框架搭建后已经很明确我们的MVCbootstrap框架搭建是一個Java平台的、基于Servlet的轻量级的Web MVCbootstrap框架搭建,主要的理念是约定优于配置高内聚大于低耦合,提供主流Web MVCbootstrap框架搭建的大部分功能并且易用方面囿所创新,新特性体包括:

起手零配置总体上约定由于配置,即使需要扩展配置也支持通过代码和配置文件两种方式进行配置

除了Servlet之外不依赖其它类库,支持通过插件方式和诸如Spring等bootstrap框架搭建进行整合

更优化的项目结构,不需要按照传统的Java Web项目结构那样来分离代码和WEB-INF視图可以和代码在一起,阅读代码更便利

拦截器和bootstrap框架搭建本身更紧密,提供Action、Controller和Global三个级别的"拦截器"(或者说过滤器)

丰富的Action的返回徝,返回的可以是视图、可以是重定向、可以是文件、可以是字符串、可以是Json数据可以是Javascript代码等等。

支持针对测试环境自动生成测试的視图模型数据以便前端和后端可以同时开发项目。

支持在开发的时候自动生成路由信息、模型绑定、异常处理等配置的信息页面和调试頁面方便开发和调试。

提供一套通用的控件模版使得,并且支持多种模版引擎比如Jsp、Velocity、Freemarker、Mustache等等。

嗯看上去挺诱人的,这是一个不錯的开端如果你要写的bootstrap框架搭建自己都不觉得想用的话,那么别人就更不会有兴趣来尝试使用你的bootstrap框架搭建了

之 所以把解决难点放在開搞之前是因为,如果实现这个bootstrap框架搭建的某些特性甚至说实现这个bootstrap框架搭建的主流程有一些核心问题难以解决,那么就要考虑对bootstrap框架搭建的特性进行调 整甚至取消bootstrap框架搭建的开发计划了。有的时候我们在用A平台的时候发现一个很好用的bootstrap框架搭建希望把这个bootstrap框架搭建迻植到B平台,这个想法是好的但之所以在这以前这么 多年没有人这么干过是因为这个平台的限制压根不可能实现这样的东西。比如我们偠实现一个MVCbootstrap框架搭建势必需要依赖平台提供的反射特性,如果你的语言平台压 根就没有运行时反射这个功能那么这就是一个非常难以解决的难点。又比如我们在某个平台实现一个类似于.NET平台Linq2Sql的数据访问bootstrap框架搭建但如 果这个目标平台的开发语言并不像C#那样提供了类型推斷、匿名类型、Lambda表达式、扩展方法的话那么由于语法的限制你写出来的bootstrap框架搭建在使用的时候是无 法像.NET平台Linq2Sql那样优雅的,这就违背了实现bootstrap框架搭建的主要目的实现新的bootstrap框架搭建也就变得意义不大了。

对于我们要实现的MVC框 架貌似不存在什么根本性的无法解决的问题毕竟在Java岼台已经有很多可以参考的例子了。如果bootstrap框架搭建的实现总体上没什么问题的话就需要逐一评估bootstrap框架搭建的这 些新特性是否可以解决。建议对于每一个难点特性做一个原型项目来证明可行以免在bootstrap框架搭建实现到一半的时候发现有无法解决的问题就比较尴尬了。

分析一下貌似我们要实现的这8大特性只有第1点要研究一下,看看如何免配置通过让代码方式让我们的Web MVCbootstrap框架搭建可以和Servlet进行整合如果无法实现的話,我们可能就需要把第1点特性从零配置改为一分钟快速配置了

首先需要给自己bootstrap框架搭建取一个名字,取名要考虑到易读、易写、易记也需要尽量避免和市面上其它产品的名字重复,还有就是最好不要起一个侮辱其它同类bootstrap框架搭建的名字以免引起公愤
如果将来打算把項目搞大的话,可以提前注册一下项目的相关域名毕竟现在域名也便宜,避免到时候项目名和域名差距很大或项目的.com或.org域名对应了一個什么不太和谐的网站这就尴尬了。
然后就是找一个地方来托管自己的代码如果一开始不希望公开代码的话,最好除了本地源代码仓库還有一个异地的仓库以免磁盘损坏导致抱憾终身当然如果不怕出丑的话也可以在起步的时候就使用Github等网站来托管自己的代码。

对 于总体設计我的建议是一开始不一定需要写什么设计文档画什么类图因为可能一开始的时候无法形成这么具体的概念,我们可以直接从代码开始做第一步bootstrap框架搭建的 使用者一般而言还是开发人员,抛开bootstrap框架搭建的内在的实现不说bootstrap框架搭建的API设计的好坏取决于两个方面。对于普通开发人员而言就是使用层面的API是否易于使 用拿我们的MVCbootstrap框架搭建举例来说:

最基本的,搭建一个HelloWorld项目声明一个Controller和Action,配置一个路由规則让Get方法的请求可以解析到这个Action可以输出HelloWorld文字,怎么实现
如果要实现从Cookie以及表单中获取相关数据绑定到Action的参数里面,怎么实现
如果偠配置一个Action在调用前需要判断权限,在调用后需要记录日志怎么实现?

我们这里说的API它不一定全都是方法调用的API,广义上来说我们认為bootstrap框架搭建提供的接入层的使用都可以认为是API所以上面的一些功能都可以认为是MVCbootstrap框架搭建的API。

bootstrap框架搭建除了提供基本的功能还要提供┅定程度的扩展功能,使得一些复杂的项目能够在某些方面对bootstrap框架搭建进行增强以适应各种需求比如:

我的Action是否可以返回图片验证码?

峩的Action的参数绑定是否可以从Memcached中获取数据

如果出现异常,能否在开发的时候显示具体的错误信息在正式环境显示友好的错误页面并且记錄错误信息到数据库?

一 般而言如果要实现这样的功能就需要自己实现bootstrap框架搭建公开的一些类或接口然后把自己的实现"注册"到bootstrap框架搭建Φ,让bootstrap框架搭建可以在某个时候去使用这些新的实现这就需 要bootstrap框架搭建的设计者来考虑应该以怎么样的友好形式公开出去哪些内容,使嘚以后的扩展实现在自由度以及最少实现上的平衡同时要兼顾外来的实现不破坏bootstrap框架搭建已有的 结构。

要想清楚这些不是一件容易的事凊所以在bootstrap框架搭建的设计阶段完全可以使用从上到下的方式进行设计。也就是不去考虑bootstrap框架搭建怎么实现而是以一 个使用者的身份来寫一个bootstrap框架搭建的示例网站,API怎么简单怎么舒服就怎么设计只从使用者的角度来考虑问题。对于相关用到的类直接写一个空的类(能鼡接口 的尽量用接口,你的目的只是通过编译而不是能运行起来)让程序可以通过编译就可以了。你可以从bootstrap框架搭建的普通使用开始写這样一个示例网站然后再写各种扩展 应用,在此期间你可能会用到bootstrap框架搭建内部的20个类这些类就是bootstrap框架搭建的接入类,在你的示例网站通过编译的那刹那其实你已经实现了bootstrap框架搭建的接入层的设计。

这里值得一说的是API的设计蕴含了非常多的学问以及经验要在目标平囼设计一套合理易用的API首先需要对目标平台足够了解,每一个平台都有一些约定俗成的规范如果设计的API能符合这些规范那么开发人员会哽容易接受这个bootstrap框架搭建,此外还有一些建议:

之 所以我们把API的设计先行而不是让bootstrap框架搭建的设计先行是因为这样我们更容易设计出好鼡的API,作为bootstrap框架搭建的实现者我们往往会进行一些妥协,我们可能会为 了在bootstrap框架搭建内部DRY而设计出一套丑陋的API让bootstrap框架搭建的使用者去做┅些重复的工作;我们也可能会因为想让bootstrap框架搭建变得更松耦合强迫bootstrap框架搭建的使用者去使用到bootstrap框架搭建的一 些内部API去初始化bootstrap框架搭建的組件如果bootstrap框架搭建不是易用的,那么bootstrap框架搭建的内部设计的再合理又有什么意义

尽量少暴露一些bootstrap框架搭建内部的类名吧,对 于bootstrap框架搭建的使用者来说你的bootstrap框架搭建对他一点都不熟悉,如果要上手你的bootstrap框架搭建需要学习一到两个类尚可接受如果要使用到十几个类会头暈脑胀的,即使你的bootstrap框架搭建有非常 多的功能以及配置可以考虑提供一个入口类,比如创建一个ConfigCenter类作为入口让使用者可以仅仅探索这個类便可对bootstrap框架搭建进行所有的配置。

一 个好的bootstrap框架搭建是可以让使用者少犯错误的bootstrap框架搭建的设计者务必要考虑到,bootstrap框架搭建的使用鍺没有这个业务来按照bootstrap框架搭建的最佳实践来做所以在设计API的时候,如果你希 望API的使用者一定要按照某个方式来做的话可以考虑设置┅个简便的重载来加载默认的最合理的使用方式而不是要求使用者来为你的方法初始一些什么依赖, 同时也可以在API内部做一些检测如果發现开发人员可能会犯错进行一些提示或抛出异常。好的bootstrap框架搭建无需过多的文档它可以在开发人员用的时候告知它哪里错 了,最佳实踐是什么即便他们真的错了也能以默认的更合理的方式来弥补这个错误。

建议所有的API都有一套统一的规范比如入口都叫XXXCenter或XXXManager,而不是叫XXXCenter、YYYManager和 ZZZServiceAPI往往需要进行迭代和改良的,在首个版本中把好名字用掉也不一定是一个好办法最好还是给自己的bootstrap框架搭建各种API的名字留一点余 哋,这样以后万一需要升级换代不至于太牵强

下一步工作就是把项目中那些空的类按照功能进行划分。目的很简单就是让你的bootstrap框架搭建 的100个类或接口能够按照功能进行拆分和归类,这样别人一打开你的bootstrap框架搭建就可以马上知道你的bootstrap框架搭建分为哪几个主要部分而不是茬100个类中晕眩;还有因为 一旦在你的bootstrap框架搭建有使用者后你再要为API相关的那些类调整包就比困难了,即使你在创建bootstrap框架搭建的时候觉得我嘚bootstrap框架搭建就那么十几个类无需进行过多的分类但是在将 来bootstrap框架搭建变大又发现当初设计的不合理,无法进行结构调整就会变得很痛苦因此这个工作还是相当重要的,对于大多数bootstrap框架搭建来说可以有几种切蛋糕的方式:

分 层。我觉得bootstrap框架搭建和应用程序一样也需要進行分层。传统的应用程序我们分为表现层、逻辑层和数据访问层类似的对于很多bootstrap框架搭建也可以进行横向的层次划分。要分 层的原因昰我们的bootstrap框架搭建要处理的问题是基于多层抽象的就像如果没有OSI七层模型,要让一个HTTP应用去直接处理网络信号是不合理的也是不利于重鼡的 举一个例子,如果我们要写一个基于Socket的RPC的bootstrap框架搭建我们需要处理方法的代理以及序列化,以及序列化数据的传输这完全是两个層面的问题,前者 偏向于应用层后者偏向于网络层,我们完全有理由把我们的bootstrap框架搭建分为两个层面的项目(至少是两个包)rpc.core和rpc.socket,前鍺不关心 网络实现来处理所有RPC的功能后者不关心RPC来处理所有的Socket功能,在将来即使我们要淘汰我们的RPC的协议了我们也可以重用 rpc.socket项目,因為它和RPC的实现没有任何关系它关注的只是socket层面的东西。

横切刚才说的分层是横向的分 割,横切是纵向的分割(横切是跨多个模块的意思不是横向来切的意思)。其实横切关注点就是诸如日志、配置、缓存、AOP、IOC等通用的功能对于这部 分功能,我们不应该把他们和真正嘚业务逻辑混淆在一起对于应用类项目是这样,对于bootstrap框架搭建类项目也是这样如果某一部分的代码量非常大,完全有理由为它分出 一個单独的包对于RPC项目,我们可能就会把客户端和服务端通讯的消息放在common包内把配置的处理单独放在config包内。

功能也就是要实现一个bootstrap框架搭建主要解决的问题点,比如对于上面提到的RPCbootstrap框架搭建的core部分可以想到的是我们主要解决是客户端如何找到服务端,如何把进 行方法調用以及把方法的调用信息传给目标服务端服务端如何接受到这样的信息根据配置在本地实例化对象调用方法后把结果返回客户端三大問题,那么我们可能 会把项目分为routing、client、server等几个包

如果是一个RPCbootstrap框架搭建,大概是这样的结构:

对于我们的Web MVCbootstrap框架搭建举例如下:

我们可以囿一个mvc.core项目,细分如下的包:

common:公共的一组件下面的各模块都会用到

config:配置模块,解决bootstrap框架搭建的配置问题

startup:启动模块解决bootstrap框架搭建囷Servlet如何进行整合的问题

plugin:插件模块,插件机制的实现提供IPlugin的抽象实现

routing:路由模块,解决请求路径的解析问题提供了IRoute的抽象实现和基本實现

controller:控制器模块,解决的是如何产生控制器

model:视图模型模块解决的是如何绑定方法的参数

action:action模块,解决的是如何调用方法以及方法返囙的结果提供了IActionResult的抽象实现和基本实现

view:视图模块,解决的是各种视图引擎和bootstrap框架搭建的适配

我们可以再创建一个mvc.extension项目细分如下的包:

这里我们以IXXX来描述一个抽象,可以是接口也可以是抽象类在具体实现的时候根据需求再来确定。

这 种结构的划分方式完全吻合上面说嘚切蛋糕方式可以看到除了横切部分和分层部分,作为一个Web MVCbootstrap框架搭建它核心的组件就是routing、model、view、controller、action(当然,对于有些MVCbootstrap框架搭建它没有route部 汾route部分是交由Webbootstrap框架搭建实现的)。

如果我们在这个时候还无法确定bootstrap框架搭建的模块划分的话问题也不大,我们可以在后续的搭建龙骨嘚步骤中随着更多的类的建立继续理清和确定模块的划分。

经过了设计的步骤我们应该心里对下面的问题有一个初步的规划了:

我们嘚bootstrap框架搭建以什么形式来提供如何优雅的API?

我们的bootstrap框架搭建包含哪些模块模块大概的作用是什么?

在 经过了初步的设计之后我们可以栲虑为bootstrap框架搭建搭建一套龙骨,一套抽象的层次关系也就是用抽象类、接口或空的类实现bootstrap框架搭建,可以通过编译让bootstrap框架搭建撑起来,就像 造房子搭建房子的钢筋混凝土结构(添砖加瓦是后面的事情我们先要有一个结构)。对于开发应用程序来说其实没有什么撑起來一说,因为应用程序中很多模块 都是并行的它可能并没有一个主结构,主流程而对于bootstrap框架搭建来说,它往往是一个高度面向对象的高度抽象的一套程序,搭建龙骨也就是搭建一套抽象层这么说 可能有点抽象,我们还是来想一下如果要做一个Web MVCbootstrap框架搭建需要怎么为仩面说的几个核心模块进行抽象(我们也来体会一下bootstrap框架搭建中一些类的命名,这里我们为了更清晰为所有接口都命名为IXXX,这点不太 符匼Java的命名规范):

我们实现一个bootstrap框架搭建自带的DefaultRoute使得路由支持配置,支持默认值支持正则表达式,支持约束等等

RouteResult对象就是匹配的路由信息包含了路由解析后的所有数据

action 找到了控制器后就是来找要执行的方法了

我们需要实现一个DefaultActionInvoker以默认的方式进行方法的调用,也就是找箌方法的一些IFilter按照一定的顺序执行他们最后使用反射进行方法的调用得到上面说的IActionResult并执行它的execute()方法

filter 我们的bootstrap框架搭建很重要的一点就是便捷的过滤器

ViewEngineResult包含视图引擎寻找视图的结果信息,里面包含IView和寻找的一些路径等

IView自然代表的是一个视图提供render()方法(或者为了统一也可以叫莋execute)来渲染视图

common 这里可以放一些项目中各个模块都要用到的一些东西

上下文相比Action执行时的上下文信息肯定是多了视图的信息,其它同理の所以把这个信息放在common里面而不是放在各个模块自己的包内是因为这 样更清晰,可以一目了然各种对象的执行上下文有一个立体的概念

接丅去就不再详细阐述model、plugin等模块的内容了

看到这里,我们来总结一下我们的MVCbootstrap框架搭建在组织结构上有着高度的统一:

如果xxx本身并无选择筞略,但xxx的创建过程也不是一个new这么简单的可以由xxxFactory类来提供一个xxx

如果zzz的选择是有策略性的,会按照需要选择zzz1或zzzN那么我们可能会有一个zzzs來管理这些zzz并且(通过findzzz()方法)来提供合适的zzz

同 时我们bootstrap框架搭建的相关类的命名也是非常统一的,可以一眼看出这是实现、还是抽象类还是接口;是提供程序是执行结果还是上下文。当然在将来的代码实现过程中 很可能会把很多接口变为抽象类提供一些默认的实现,这并鈈会影响项目的主结构我们会在模式篇对bootstrap框架搭建常用的一些高层设计模式做更多的介绍。

到了这里我们的项目里已经有几十个空的(抽象)类、接口了,其中也定义了各种方法可以把各个模块串起来(各种find()方法和execute()方法)可以说整个项目的龙骨已经建立起来了,这种感觉很好因为我们心里很有底,我们只需要在接下去的工作中做两个事情:

所谓走通主线流程就是让这个bootstrap框架搭建可以以一个HelloWorld形式跑起来,这就需要把几个核心类的核心方法使用最简单的方式进行实现还是拿我们的MVCbootstrap框架搭建来举例子:

然后需要完成相关默认类的实现:

在这一步,我们并不一定要去触碰filter和model这部分的内容我们的主线流程只是解析路由,获得控制器执行方法,找到视图然后渲染视图過滤器和视图模型的绑定属于增强型的功能,属于支线流程不属于主线流程。

虽 然在这里我们说了一些MVC的实现但本文的目的不在于教伱实现一个MVCbootstrap框架搭建,所以不用深究每一个类的实现细节这里想说的是,在前面的龙骨搭建完后 你会发现按照这个龙骨为它加一点肉仩去实现主要的流程是顺理成章的事情,毫无痛苦在整个实现的过程中,你可以不断完善common下的一些 context把方法的调用参数封装到上下文对潒中去,不但看起来清楚且符合开闭原则到这里,我们应该可以跑起来在设计阶段做的那个示例网站的 HelloWorld功能了

在这里还想说一点,有些人在实现bootstrap框架搭建的时候并没有搭建龙骨的一步骤直接以非OOP的方式实现了主线流程,这种方式有以下几个缺点:

不容易做到SRP单一指责原则你很容易把各种逻辑都集中写在一起,比如大量的逻辑直接写到了DispatcherServlet中辅助一些Service或Helper,整个bootstrap框架搭建就肥瘦不匀有些类特别庞大有些类特别小。
不容易做到OCP开闭原则扩展起来不方便需要修改老的代码,我们期望的扩展是实现新的类然后让bootstrap框架搭建感知而不是直接修改bootstrap框架搭建的某些代码来增强功能。
很难实现DIP依赖倒置原则即使你依赖的确实是IService但其实就没意义,因为它只有一个实现只是把他当莋帮助类来用罢了。

我们想一下对于这个MVCbootstrap框架搭建有哪些没有实现的支线流程?其实无需多思考因为我们在搭建龙骨阶段的设计已经給了我们明确的方向了,我们只需要把除了主线之外的那些龙骨上也填充一些实体即可比如:

……实现更多model模块的内容和plugin模块的内容

实現了这一步后,你会发现整个bootstrap框架搭建饱满起来了每一个包中不再是仅有的那些接口和默认实现,而且会有一种OOP的爽快感爽快感来源於几个方面:

面对接口编程抽象和多态的放心安心的爽快感

为抽象类实现具体类享受到父类大量实现的满足的爽快感

实现了大量的接口和抽象类后充实的爽快感

我们再来总结一下之前说的那些内容,实现一个bootstrap框架搭建的第一大步就是:

为bootstrap框架搭建搭建由抽象结构构成的骨架

茬这个骨架的基础上实现一个HelloWorld程序

为这个骨架的其它部分填充更多实现

经 过这样的一些步骤后可以发现这个bootstrap框架搭建是很稳固的很平衡嘚,很易于扩展的其实到这里很多人觉得bootstrap框架搭建已经完成了,有血有肉其实个人觉得只能说开发工作实 现了差不多30%,后文会继续说毕竟直接把这样一个血肉之躯拿出去对外有点吓人,我们需要为它进行很多包装和完善

在这之前我们写的bootstrap框架搭建只能说是一个在最基本的情况下可以使用的bootstrap框架搭建,作为一个bootstrap框架搭建我们无法预测开发人员将来会怎么使用它所以我们需要做大量的工作来确保bootstrap框架搭建不但各种功能都是正确的,而且还是健壮的写应用系统的代码,大多数项目是不会去写单元测试的原因很多:

对于bootstrap框架搭建,恰恰相反没有配套的单元测试的bootstrap框架搭建(也就是仅仅使用人工的方式进行测试,比如在main中调用一些方法观察日志或输出或者运行一下礻例项目查看各种功能是否正常,是非常可怕的)原因如下:

如果bootstrap框架搭建的时间需求不是特别紧的话单元测试的引入可以是走通主线鋶程的阶段就引入,越早引入bootstrap框架搭建的成熟度可能就会越高以后重构返工的机会会越小,bootstrap框架搭建的可靠性也肯定会大幅提高之前峩有写过一个类库项目,并没有写单元测试在项目中使用了这个类库一段时间也没有出现任何问题,后来花了一点时间为类库写了单元測试出乎我意料之外的是,我的类库提供的所有API中有超过一半是无法通过单元测试的(原以为这是一个成熟的类库其实包含了数十个BUG),甚至其中有一个API是在我的项目中使用的你可能会问,为什么在使用这个API的时候没有发生问题而在单元测试的时候发生问题了呢原洇之前提到过,我是bootstrap框架搭建的设计者我在使用类库提供的API的时候是知道使用的最佳实践的,因此我在使用的时候为类库进行了一个特別的设置这个问题如果不是通过单元测试暴露的话,那么其它人在使用这个类库的时候基本都会遇到一个潜在的BUG

其实个人觉得,一个bootstrap框架搭建的主逻辑代码并不一定是最难的最难的是对一些细节的处理,让bootstrap框架搭建保持一套规范的统一的日志和异常的使用反而对bootstrap框架搭建开发者来说是一个难点下面是针对记录日志的一些建议:

2、按照上面的级别规范,在需要记录日志的地方记录日志除了DEBUG级别的日誌其它日志不能记录过多,如果bootstrap框架搭建总是在运行的时候输出几十个WARNNING也容易让使用者忽略真正的问题
3、日志记录的消息需要是明确的,最好包含一些上下文信息比如"无法在xxx下找到配置文件xxx.config,bootstrap框架搭建将采用默认的配置"而不是"加载配置失败!"

很多bootstrap框架搭建提供了多种配置方式,比如Spring MVC同时支持上面三种方式的配置个人觉得对配置,我们还是应该区别对待而不是无脑把所有的配置项都同时以上面三种方式提供配置,我们要考虑高内聚和低耦合原则对于Webbootstrap框架搭建来说,高内聚需要考虑的比低耦合更多我的建议是对不同的配置项提供鈈同的配置方式:

所谓状态服务就是反映bootstrap框架搭建内部运作状态的服务,很多开源服务或系统(Nginx、Mongodb等)都提供了类似的模块和功能作为bootstrap框架搭建的话我觉得也有必要提供一些内部信息(主要是配置、数据统计以及内部资源状态)出来,这样使用你bootstrap框架搭建的人可以在开发嘚时候或线上运作的时候了解bootstrap框架搭建的运作状态我们举两个例子,对于一个我们之前提到的Web MVCbootstrap框架搭建来说可以提供这些信息:

对于┅个Socketbootstrap框架搭建来说,有一些不同Socketbootstrap框架搭建是有状态的,其状态服务提供的信息除了当前生效的配置信息之外更多的是反映当前bootstrap框架搭建内部一些资源的状态以及统计数据:

这是一个老话题,之前已经说过很多次你在设计bootstrap框架搭建的时候心里如果把一个类定位成了单例嘚类但却没有提供单例模式,你是无法要求使用者来帮你实现单例的这其中涉及的不仅仅是多线程问题,可能还有性能问题比如见过某分布式缓存的客户端的CacheClient在文档中要求使用者针对一个缓存集群保持一个CacheClient的单例(因为其中有了连接池),但是用的人还是每一次都实例囮了一个CacheClient出来几小时后就会产生几万个半死的Socket导致网络奔溃。又见过某类库的入口工厂的代码注释中写了要求使用的人把XXXFactory作为单例来使鼡(因为其中缓存了大量数据)但是用的人就没有注意到这个注释,每一次都实例化了一个XXXFactory造成GC的崩溃。所以我觉得作为bootstrap框架搭建的設计者开发人员最好还是把bootstrap框架搭建的最佳实践直接做到API中,使得使用者不可能出错(之前说过一句话再重复一次,好的bootstrap框架搭建不會让使用的人犯错)你可能会说对于CacheClient的例子,不可能做成单例的因为我的程序可能需要用到多个缓存的集群,换个思路我们完全可鉯在封装一层,通过一个CacheClientCreator之类的类来管理多个单例的CacheClient即使在某些极端的情况下,你不能只提供一条路给使用者去走也需要在bootstrap框架搭建內做一些检测机制,及时提醒使用者 "我们发现您这样使用了bootstrap框架搭建这可能会产生问题,你本意是否打算那样做呢"

2,如果你的入口类夲来就是单例的那么你是类中是否持有共享资源,你的API在并发的情况下被调用是否可以确保这些资源的线程安全在解决多线程问题的時候往往有几个难点:

百密难有一疏,你很难想到这段代码会有人这样去并发调用比如某init()方法,某config()方法你总是假设使用者会调用并且僅调用一次,但事实不一定这样有的时候调用者自己也不清楚我的容器会调用我这段代码多少次。
好吧解决多线程问题各种烦躁,那僦对各种涉及到共享资源的方法全部加锁对方法进行粗犷(粒度)的锁可能会导致性能急剧下降甚至是死锁问题。
自以为使用了优雅的無锁代码或并发容器但却达不到目的我们往往在大量使用了并发集合心中暗自窃喜解决了多线程问题的同时又达到了极佳的性能,但你鉯为这样是解决了线程安全问题但其实根本就没有我们不能假设A和B都方法是线程安全的,但对A和B方法调用的整个代码段是线程安全的

需要非常仔细的过一遍代码,把涉及到共享资源的地方以及相关的方法和类列出来,不要去假设什么只要API暴露出去了则假设它可能被並发调用。共享资源不一定是静态资源哪怕资源是非静态的,在并发环境下对相同对象的资源进行操作也可能产生问题
一般而言对于公开的API,作为bootstrap框架搭建的设计者我们需要确保所有的静态方法(或但单例类的实例方法)是线程安全的对于实例方法我们可以不这么做(因为性能原因),但是需要在注释中明确提示使用者方法的非线程安全如果需要并发调用请自行处理线程安全问题。
可以看看是否有鈳能让这些资源(字段)变为方法内的局部变量有的时候我们并不是真正的需要类持有一个字段,只是因为多个方法要使用相同的东西随手一写罢了。
对于使用频率低的一些方法相关的一些资源没有必要使用并发容器直接采用粗狂的方式进行资源加锁甚至是方法级别加锁,先确保没有线程安全如果以后做压测出现性能问题再来解决。
对于使用频率高的一些方法相关的一些资源可以使用并发容器但需要仔细思考一下代码是否会存在线程安全问题,必要的话为代码设计一些多线程环境的单元测试去验证

之前也提到过,你不会预测到伱的项目会在怎么样的访问量下使用我们不希望bootstrap框架搭建和同类的bootstrap框架搭建相比有明显的性能差距(如果你做的是一个ORMbootstrap框架搭建或RPCbootstrap框架搭建,这个工作就是必不可少的)所以在bootstrap框架搭建基本完成后我们需要做Benchmark:

个人觉得一个bootstrap框架搭建如果只是能用那是第一个层次,能很方便的进行扩展或二次开发那是另外一个层次如果我们龙骨阶段的工作做的足够好,bootstrap框架搭建是一个立体饱满的bootstrap框架搭建那么这部分嘚工作量就会小很多,否则我们需要对bootstrap框架搭建进行不少的重构以便可以达到这个层次

其实也不一定是在重构的时候再去处理上面所有嘚问题,如果在写代码的时候都带着这些意识来写的话那么重构的负担就会小一点(不过写代码思想的负担比较大需要同时考虑封装问題、优雅问题、日志异常问题、多线程问题等等,所以写一套能用的代码和写一套好的代码其实不是一回事情)

看到这里你可能相信我┅开始的话了吧,bootstrap框架搭建可以使用到完善可以商用差距还是很大的而且还要确保在迭代的过程中bootstrap框架搭建不能偏离开始的初衷不能有佷大的性能问题出现,任重道远

在较新版本的Android Studio上直接新建项目 囿不少符合Android规范的界面模板可选。至于地图同样有一个基于Google map的模板,拿过来改用一下SDK就可以用了(另外,Google map似乎在国内已经可以正常使鼡了直接用也问题不大)

大家好作为19195手游网()站长的峩,今天为广大朋友们介绍下怎样才能快速搭建自己的网站从域名,服务器程序,部署等各个方面做个全民的讲解希望能帮助到你們。这次已游戏网站为列子

告诉朋友们怎么成为游戏站长因为目前手机游戏是最赚钱的领域。豆瓣游戏也是小赚了一把

首先建站第一步,你需要注册一个域名一般在易名中国注册(//blog/2066795

第五步:当然是部署程序了。像这种网站都是php开发的,因为php开发快速简单。你可以到網上搜网站源码之类的基本都能找到。程序下载之后呢上传到服务器。

这五步是建站的主要流程后续会补充一些细节,也欢迎大家吔提问

我要回帖

更多关于 安卓框架 的文章

 

随机推荐