Tiny

悠然乱弹:聊聊模块化

|▌冷眼眸甩不掉的悲伤 提交于 2019-12-07 11:15:58
序言 熟悉了TINY相关开源内容的同学都有一个印象,那就是 Tiny框架 的目录分得非常细,比如Tiny工程的目录结构是下面的样子的: 比如 TinyUiEnterprise 项目的目录结构是这样的: 再比如,我们开源的 软件开发过程管理 软件的地目录结构是这样的: 有少许的人看了之后,深以为然,而更多的人看了之后却觉得莫名其妙。所以今天就乱弹一下模块化。 什么是模块化? 百度了一下,发现下面的说法非常经典,就此引用一下: 模块化是一种处理复杂系统分解为更好的可管理模块的方式 。 百度百科中,关于模块化设计是这样描述的: 模块化设计,简单地说就是程序的编写不是开始就逐条录入计算机语句和指令,而是首先用主程序、 子程序 、子过程等框架把软件的主要结构和流程描述出来,并定义和调试好各个框架之间的输入、输出链接关系。 逐步求精 的结果是得到一系列以功能块为单位的算法描述。 以功能块为单位进行程序设计,实现其求解算法的方法称为模块化。模块化的目的是为了降低程序复杂度,使程序设计、 调试 和维护等操作简单化。 前半拉和我想表述的意思没有太大关系,大家只要看我加粗变红了的部分,就可以了。 TINY框架模块化之后的效果 随心所欲:想要啥就要啥,不想要啥就不要啥 自动组装:只要通过POM依赖或去除依赖,就可以增加或去除某一功能及其相应配置 这么说说可能比较抽象,那我说几个场景。 比如

悠然乱弹:一段SQL引发的性能危机及其背后隐藏的设计缺陷

倾然丶 夕夏残阳落幕 提交于 2019-12-06 19:37:55
有个同学,说是系统中出现性能问题了,说是让我帮助诊断一下。本来是不想花这时间的,结果耐不住对方的死缠乱打,只要答应帮看看。 故事发生的背景是,在文件上传的时候,有时间会有人上传了文件,但是最后没有使用上传的文件,这样就会产生一些垃圾文件。 原来软件作者就想写一个后台定时任务程序,来清除这些垃圾文件? 由于作者坚定的不让我发她的SQL语句(这个我也理解,这么丑陋的SQL),所以这里就不发源代码了,发伪代码。 void deleteMissLinkFile{ List fileList=getFileList(); List deleteFileList=new ArrayList(); for(file:fileList){ int count1=execute(select count(*) from ...); int count2=execute(select count(*) from ...); int count3=execute(select count(*) from ...); int count4=execute(select count(*) from ...); int count5=execute(select count(*) from ...); if(count1==0&&count2==0&&count3==0&&count4==0&&count5=

Velocity宏定义的坑与解决办法

白昼怎懂夜的黑 提交于 2019-12-06 03:00:12
使用Velocity,当然就免不了要使用宏,或者说 使用Velocity而 不使用其宏,就相当于废了Velocity一半以上的武功,非常可惜的。 怎么使用Velocity的宏呢,才最大程度的发挥其作用但是又避免掉入其中的坑呢?且听悠然乱弹乱弹: 官方文档中,关于Macro是这么说的: #macro - Allows users to define a Velocimacro (VM), a repeated segment of a VTL template, as required Format: # [ { ] macro [ } ] ( vmname $arg1 [ $arg2 $arg3 ... $argn ] ) [ VM VTL code... ] # [ { ] #end [ } ] vmname - Name used to call the VM ( #vmname ) $arg1 $arg2 [ ... ] - Arguments to the VM. There can be any number of arguments, but the number used at invocation must match the number specified in the definition. [ VM VTL code... ] - Any valid VTL

悠然乱弹:从几个方法的重构讲开去--性能大优化

怎甘沉沦 提交于 2019-12-06 02:59:58
上一篇 讲到经过上面两篇的优化与重构,整体来说,前面提到的问题,除了性能问题之外,其它问题都已经顺利的解决了。 现在还存在多次扫描处理的问题,也就是说虽然代码结构性重构是成功的,但是性能问题还是没有根本解决。 在给出解决方案之前,需要对这个处理方式缕一缕: 处理方式1:每次遍历全路径找到待处理文件,文件然后批量进行处理。优点是处理起来比较简单,但是会重复扫描。 处理方式2:一次遍历所有文件,然后对每个文件进行注解检测。扫描全路径只有一次,然后要把每个文件与过滤器进行比较如果比较成功那就做,比较不成功就不做。 稍加分析就会发现,两种方式的比较次数是一样的,但是第二种方案遍历文件的次数就少到极限了,还能比1次更少么?? 这次的做法就有点复杂了(相对的,实际上也很简单),做一个过滤器,里面放个Map存储过滤器:处理器。 对于每个一个文件,都对所有的过滤器进行校验,如果校验成功,就执行对应的处理器。 public class ComplexFileFilter implements FileObjectFilter { Map<FileObjectFilter,FileObjectProcessor> filterProcessorMap; public boolean accept(FileObject fileObject) { for(FileObjectFilter filter

悠然乱弹:挑战编程极限的问题终于有解了

我的未来我决定 提交于 2019-12-05 06:58:35
问题的来历 在群里面一个小萝莉非要说拜我为师,呵呵,对于程序媛我一向--嗯嗯觉得程序不如人好看,再加上该名萝莉大学还没毕业,术语都多半没有听过,于是就想着拒绝,当时嘴一贱,就说了一句:你用一个For循环做个99表出来。 当然,这个对于小萝莉们来说,已经足够形成挑战了,但是对于群里的一众大佬们来说,自然是不在话下,3下5除二就搞定了。我又异想天开一下,如果不用判断语句,是不是也完成呢?粗想想是可以的,于是动手摆了几行代码,确实可以。于是就不断加码,不断增加新的完成条件,于是就形成了下面的问题,挑战极限这个定语,有一定的博眼球的意思,实际上不是那么难了。 挑战极限的问题 今天我想挑战一下OSCHINA的亲们的编程能力,出一道百度、谷歌不到答案的问题,第一个挑战成功的,直接奖励现金100元RMB(本人也是苦B码农,纯属意思一下)。 以前发过 一条循环语句打印螺旋矩阵和蛇型矩阵 的博客,今天我们来挑战只出现一条循环语句来打印99表。 注意,此题是考思想的,用“*”之外的运算符,如 "& | ^ >> << / % "的,虽然确实可以有解,但是代码逻辑与我倡导的:"一个好的算法首先是简单易懂的,其次是清晰明了的,再个一定是充满美感的"是相违背的。为什么下面条件这么多,实在是亲们的创意无限,我防不胜防哦。 特别声明: n可以是任意正整数,只要N的平方不要溢出都可以 一行一行print结果的无效

Tiny1.2.0预览版全面开源

Deadly 提交于 2019-12-04 19:39:50
感谢 感谢OSChina为我们提供了这么好的共享与交流平台。 感谢红薯及OSChina管理团队所有打过没打过交道同仁对Tiny一直以来的支持与帮助。 感谢所有鼓励和批评我的同学们,鼓励者为我们添加勇气,批评者让我们弥补不足。 感谢那些关注或点击过我的同学们,你们每一次的点击都会给我们力量,让我们坚信我们做的是有意义的;也感谢那些从来没有点击过我的同学们,因为你们让我知道我们还需要做得更多,更努力,更扎实。 当然尤其要感谢我的团队,正是我的团队们几年来对我的强力支持,才使我的梦想慢慢一步步变成现实。 一些时间节点及数字 让我们回顾一下,我们的几个重要时间与数字: 我们把源码库迁入OSC Git的时间是2014-2-21日,到目前为止,主工程已经有 1014 个commits,算上其它工程,commits应该在 2000 以上。 加入OSChina的时间是 2013-08-09,到目前为止,写的博客是 124篇 ,其中被OSC推荐的有 32 篇,其它的没有被推荐,但并不妨碍它们大多数都是精品。 到目前为目在OSC上的项目已经有 18 个之多,一部分是开放的,一部分是私有的,总共代码行数已经接近 30 万行,我们自己写的大概有 28 万行左右。 我们入驻SourceForge的时间是:2013-06-20 09:30:18 ,从开始到我们迁入OSChina,我们一共有 3451

Tiny快速入门之控制层开发

微笑、不失礼 提交于 2019-12-04 19:39:36
下面是一些常用的链接,供大家使用: GIT地址(必须是OSC家的): https://git.oschina.net/tinyframework/tiny 问题报告: https://git.oschina.net/tinyframework/tiny/issues 官方网站: http://www.tinygroup.org 更多内容,请看本人博客。不一样的内容,一样的精彩! 前面讲了 Tiny快速入门之服务开发 和 Tiny快速入门之Web界面快速开发实践 ,也就是说开发服务和界面都没有问题了,很明显要做一个完整的系统还是不够的,因此肯定有控制层,才可以把整个过程打通。 控制层充当着界面和服务之间协作的角色。控制器从界面层接收用户输入的信息,然后调用服务来执行特定的处理,并把最终的结果回传给界面层进行渲染。 Tiny框架中控制层的写法可以有许多种: 集成Struts或其它方案来完成 按Tiny框架的要求代码来完成 通过Tiny页面流来完成 集成Struts等方案,这里不再叙述,仅介绍通过Tiny框架来实现的方式: 一、通过代码编写控制层逻辑 1.代码示例 @Controller() public class HelloAction implements WebContextAware{ private WebContext webContext; public void

Tiny快速入门之Web界面快速开发实践

╄→гoц情女王★ 提交于 2019-12-03 17:48:49
前面讲了基于Tiny做 服务 ,这篇来讲讲用Tiny怎么做界面。f 下面是一些常用的链接,供大家使用: GIT地址(必须是OSC家的): https://git.oschina.net/tinyframework/tiny 问题报告: https://git.oschina.net/tinyframework/tiny/issues 官方网站: http://www.tinygroup.org 更多内容,请看本人博客,不一样的内容,一样的精彩! 本来想改改OSChina的界面,但是研究了一下,OSChina界面实在是高大上呀,不是做不出来,只是工作量比较大,因此还是做个简单的网站来展示一下用Tiny开发界面的过程,同时在展示过程的同时,会把相关的知识做一个充分的介绍 。 一、寻找网站模板 要做网站,不能没有模板,自己不会做网页设计,咋办?问谷歌找百度呗,找了一阵,看到下面这个模板不错,就它了。 http://www.tooplate.com/zip_files/2042_the_block.zip 相仔细了解这篇文章的同学,建议把原板的下载下来,对比着看,会更有感觉。 二、开工制作 1.编写default.layout布局文件 位置:/default.layout <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional/

TinyTemplate(Velocity Plus版)即将火热推出~~~

牧云@^-^@ 提交于 2019-12-03 04:17:41
本来是没有自己写一个模板引擎的计划的,因为按我的理解,一直认识这种“语言”级的引擎,难度是非常大的。总感觉自己的水平不够,因此不敢有这个念头。直到大量使用Velocty的时候,碰到velocty诸多尽如人意的地方,但是又无能为力,退回到JSP吧,又心不有甘。于是就期望着寻找一种语法结构接近velocty,但是又没有Velocity这些不方便之处的模板语言。于是进到一个模板语言群,一群大佬们个个至少是一个模板语言的作者,于是作者在里面表达了自己的期望,大佬们都介绍了自己的模板引擎,于是作者一个接一个的看源码,看文档。说实际,看文档,感觉都非常不错,都有自己的特色,看语法也都不错,除了一部分自己特别关注的点没有之外,其部分都非常不错了。但是距离自己的诉求还是有差距,怎么办呢?于是就准备找一个最接近的模板引擎来进行一定的扩展,挑来挑去就挑中了jetbrick这个模板语言(在此对Jetbrick致以强烈的衷心的感谢!!)。 之所以挑这个呢,是因为以下几个原因: Antlr语言文件编写非常清晰,对于我这种Antlr盲来说,也可以看得懂,甚至可以照葫芦画瓢修改修改,这个非常重要,在后期作者进行了相当的语法改进,这个方面有极度体现 代码质量较好,使用sonar进行进行分析,给的结果都还是相当不错的,在作者看过的所有的模板语言中,算上成之选 语法结构与Velocity的非常接近,这点对我也非常重要

悠然乱弹:“最好的模板引擎”Beetl 剖析及与Tiny模板引擎对比

早过忘川 提交于 2019-12-03 04:17:29
Beetl的环境搭建 输入命令 git clone https://git.oschina.net/xiandafu/beetl2.0.git 不一会儿,输出了下面的内容 Cloning into 'beetl2.0'... remote: Counting objects: 5807, done. remote: Compressing objects: 100% (2145/2145), done. remote: Total 5807 (delta 3050), reused 5383 (delta 2733) Receiving objects: 100% (5807/5807), 14.60 MiB | 684.00 KiB/s, done. Resolving deltas: 100% (3050/3050), done. Checking connectivity... done. 嗯嗯,好的开头是成功的一半,不错,代码取下来了。 cd beetl2.0 mvn install 输出结果: [WARNING] [WARNING] Some problems were encountered while building the effective settings [WARNING] 'servers.server.id' must be unique but