如何提高设计 API 的能力?

from: http://z.ihu.im/u/BZp(71、依赖倒置原则依赖倒置的意思,是不要想象别人应该怎么用你的API、以及用你的API做什么;而是“倒”过来想,我的API对外提供了一个什么样的抽象、这个抽象是否够好、够简洁,有没有把不必要的细节暴露给用户。比如说,之前我所在的公司做了个类似电子商城的东西,其它项目组做出产品,就放在这个商城里面销售。那个商城团队就犯了干涉他人实现的大忌:他们非要了解其他项目组的逻辑,才知道如何才能把别人的产品上架销售。不要这样。这种做法就导致两个团队耦合过重;且新产品和老产品逻辑无法兼容、甚至因为修改逻辑去迎合新产品,导致老产品销售逻辑出现问题——又因为怕老产品出现问题,于是不得不逼新产品去适应老产品的流程,而不管两者差别有多大。这就导致,我们经常花1个月实现了一个新产品;为了把它上架却经常需要3个月甚至超过半年——并且,商城团队和其它项目团队都必须加班、修改逻辑,甚至经常因为商城方提出的诡异逻辑/需求而出现摩擦(这伙人傻的……我都忍不住发过几次火……实在看不下去,我就给了一个方案,要求商城团队修改。这个方案基于依赖倒置原则,要求商城对外提供一个商品的抽象;商品的定义是有名字有价格、通过销售转移所有权的逻辑实体。如此一来,任何项目想要上架,只要给自己起个名字、定个价格、用html或某种富文本格式或商城项目组喜欢的任何格式提供一段商品介绍、最后再提供一个“所有权成功转移给xx用户”的回调接口即可。双方从此再不需要哪怕一个字的交流。这个接口可以永远不修改哪怕一个字节,足以支持任何商品种类的交易。(事实上,我们团队就是按这个要求写程序的。写完再和商城团队扯皮。这可以避免他们动辄增加的猪逻辑/需求影响到我们的内部结构:随便他们要什么,我们都可以弄个空逻辑或者不同商品规格搪塞过去)但商城团队觉得一旦做成这样,他们以后就没事可干了,所以拒绝修改……好在,后来他们集体辞职了。——如果你的接口不能稳定,那么你一定违反了依赖倒置原则,或者是做了一个超烂的抽象。——至于什么叫好抽象,请参考KISS原则2、完整且最小原则完整,就是接口的功能要完整,该有的功能必须有;最小,是接口功能没有冗余,不要接口A提供的功能,用一点外部逻辑再加上接口B或者接口B+接口C也能实现。当然,这是一个比较理想化的指标。某些时候,为了易用性或者性能,是可以甚至必须做一些更简单、方便、易用,但加起来却不是最简的接口的。但,这个完整且最小的接口必须找出来。它是一切的基础,也体现了开发者是否已经做出了一个清晰的抽象。有了它,其它可以以后慢慢补;但如果没有这个基础,什么易用、简洁,都不过是扯淡。我宁可用一个繁琐、难用、难理解,但可保证不变的接口,也不想碰做点简单的活计非常方便、易用,但根本没法实现稍难的需求、并且不能保证稳定的接口。事实上,两者的差别就在于有没有好的抽象;而一旦有了好的抽象,哪怕想做得繁琐、难用、难理解,都不是容易的事。总结:有了好的抽象,接口才可能稳定;然后找出完整且最小的接口,那么只要抽象不变,这个接口就绝对稳定;最后,在这个基础之上,做出易用、易理解的接口。

如何写出更好的Java代码

from: http://it.deepinmind.com/java/2014/05/21/better-java.htmlJava是最流行的编程语言之一,但似乎并没有人喜欢使用它。好吧,实际上Java是一门还不错的编程语言,由于最近Java 8发布了,我决定来编辑一个如何能更好地使用Java的列表,这里面包括一些库,实践技巧以及工具。这篇文章在GitHub上也有。你可以随时在上面贡献或者添加你自己的Java使用技巧或者最佳实践。编码风格结构体* builder模式依赖注入避免null值不可变避免过多的工具类格式* 文档Stream部署框架Maven* 依赖收敛持续集成Maven仓储配置管理库遗失的特性* Apache CommonsGuavaGsonJava TuplesJoda-TimeLombokPlay frameworkSLF4JjOOQ测试jUnit 4jMockAssertJ工具IntelliJ IDEA* ChrononJRebel校验框架Eclipse Memory Analyzer资源书籍播客编码风格传统的Java编码方式是非常啰嗦的企业级JavaBean的风格。新的风格更简洁准确,对眼睛也更好。结构体我们这些码农干的最简单的事情就是传递数据了。传统的方式就是定义一个JavaBean:public class DataHolder { private String data;public DataHolder() {}public void setData(String data) { this.data = data;}public String getData() { return this.data;}}这不仅拖沓而且浪费。尽管你的IDE可以自动地生成这个,但这还是浪费。因此,[不要这么写](http://www.javapractices.com/topic/TopicAction.do?Id=84)。相反的,我更喜欢C的结构体的风格,写出来的类只是包装数据:public class DataHolder { public final String data;public DataHolder(String data) { this.data = data;}}这样写减少了一半的代码。不仅如此,除非你继承它,不然这个类是不可变的,由于它是不可变的,因此推断它的值就简单多了。如果你存储的是Map或者List这些可以容易被修改的数据,你可以使用ImmutableMap或者ImmutableList,这个在不可变性这节中会有讨论。Builder模式如果你有一个相对复杂的对象,可以考虑下Builder模式。你在对象里边创建一个子类,用来构造你的这个对象。它使用的是可修改的状态,但一旦你调用了build方法,它会生成一个不可变对象。想象一下我们有一个非常复杂的对象DataHolder。它的构造器看起来应该是这样的:public class ComplicatedDataHolder { public final String data; public final int num; // lots more fields and a constructorpublic class Builder { private String data; private int num; public Builder data(String data) { this.data = data; return this; } public Builder num(int num) { this.num = num; return this; } public ComplicatedDataHolder build() { return new ComplicatedDataHolder(data, num); // etc }}}现在你可以使用它了:final ComplicatedDataHolder cdh = new ComplicatedDataHolder.Builder() .data("set this") .num(523) .build();关于Builder的使用[这里](http://en.deepinmind.com/blog/2014/05/21/the-builder-pattern-in-practice.html)还有些更好的例子,我这里举的例子只是想让你大概感受一下。当然这会产生许多我们希望避免的样板代码,不过好处就是你有了一个不可变对象以及一个连贯接口。依赖注入这更像是一个软件工程的章节而不是Java的,写出可测的软件的一个最佳方式就是使用依赖注入(Dependency injection,DI)。由于Java强烈鼓励使用面向对象设计 ,因此想写出可测性强的软件,你需要使用DI。在Java中,这个通常都是用Spring框架来完成的。它有一个基于XML配置的绑定方式,并且仍然相当流行。重要的一点是你不要因为它的基于XML的配置格式而过度使用它了。在XML中应该没有任何的逻辑和控制结构。它只应该是依赖注入。还有一个不错的方式是使用Dagger库以及Google的Guice。它们并没有使用Spring的XML配置文件的格式,而是将注入的逻辑放到了注解和代码里。避免null值如果有可能的话尽量避免使用null值。你可以返回一个空的集合,但不要返回null集合。如果你准备使用null的话,考虑一下@Nullable注解。IntelliJ IDEA对于@Nullable注解有内建的支持。如果你使用的是Java 8的话,可以考虑下新的Optional类型。如果一个值可能存在也可能不存在,把它封装到Optional类里面,就像这样:public class FooWidget { private final String data; private final Optional<Bar> bar;public FooWidget(String data) { this(data, Optional.empty());}public FooWidget(String data, Optional&lt;Bar&gt; bar) { this.data = data; this.bar = bar;}public Optional&lt;Bar&gt; getBar() {…

程序猿学黑客 · Java WEB 安全系列课程

from: http://zhuanlan.zhihu.com/wooyun/19747591作者:园长 (@mm yz)攻击JavaWeb应用[1]-JavaEE 基础攻击JavaWeb应用[2]-CS交互安全攻击JavaWeb应用[3]-SQL注入[1]攻击JavaWeb应用[4]-SQL注入[2]攻击JavaWeb应用[5]-MVC安全攻击JavaWeb应用[6]-程序架构与代码审计攻击JavaWeb应用[7]-Server篇[1]攻击JavaWeb应用[8]-后门篇攻击JavaWeb应用[9]-Server篇[2]

Simditor 简单快速的富文本编辑器

Simditor是团队协作工具 Tower 使用的富文本编辑器。相比传统的编辑器它的特点是:功能精简,加载快速输出格式化的标准HTML每一个功能都有非常优秀的使用体验兼容的浏览器:IE10+、Chrome、Firefox、Safari。Demo和文档:http://simditor.tower.im/[repo owner=”mycolorway” name=”simditor”]

Chrome渲染Transition时页面闪动Bug

from

缓动函数速查表

缓动函数指定动画效果在执行时的速度,使其看起来更加真实。现实物体照着一定节奏移动,并不是一开始就移动很快的。当我们打开抽屉时,首先会让它加速,然后慢下来。当某个东西往下掉时,首先是越掉越快,撞到地上后回弹,最终才又碰触地板。网址: http://easings.net/zh-cn#

iconfont.cn 阿里出品的矢量图标库

Iconfont.cn是阿里巴巴推出的矢量图标库,其中涵盖了1000多个常用图标,并在持续更新中。(目前已有7000+图标,部分图标为用户上传,因此默认不公开,但是可以搜索到。)&nbsp;Iconfont提供以下功能:在线图标搜索图标分捡下载在线储存矢量格式转换图标库管理iconfont的优势自由变化大小(高清屏无压力)自由修改颜色(纯色)可以添加一些视觉效果如:阴影、旋转、透明度iconfont使用声明字体@font-face {font-family: ‘iconfont’;src: url(‘iconfont.eot’); /* IE9*/src: url(‘iconfont.eot?#iefix’) format(‘embedded-opentype’), /* IE6-IE8 /url(‘iconfont.woff’) format(‘woff’), / chrome、firefox /url(‘iconfont.ttf’) format(‘truetype’), / chrome、firefox、opera、Safari, Android, iOS 4.2+/url(‘iconfont.svg#iconfont’) format(‘svg’); / iOS 4.1- */}`定义样式`.iconfont{font-family:"iconfont";font-size:16px;font-style:normal;}`选择图标、获取字体编码,应用于页面`<i class="iconfont">&#33</i>

新婚祝福青儿

今天是高中同学青儿的婚礼,抱歉不能参加,只能遥祝一下了。送上一段祝福!My very best wishes to you for a lifetime of happiness.  向你俩致以最美好的祝愿,祝你们终生幸福。

西安-大雁塔20121201

[AFG_gallery id=’1’]

jnote开源笔记软件

整理了下做的一个笔记软件,以开放开源的态度做的.jnote是一个开源的笔记软件,类似于Evernote,wiz,麦库,界面也是参考他们做的.当初做只是为了做一个自己可以定制的笔记软件.目前完成的功能:1.新建日记,参考wiz的日记功能,这个功能很实用,可以按照年月分类.2.新建笔记,是一个笔记软件最基本的功能.3.编辑支持高级html编辑器 简单html编辑器 markdown编辑器4.分类支持无限级分类5.简单搜索6.缩小到托盘7.支持多标签8.支持笔记阅读模式9.阅读模式是可以和wiz一样,定义阅读的主题.以后的计划1.添加标签功能2.添加附件功能3.搜索功能加强,计划采用lucene,使用OSChina 网站的全文搜索框架源码做了测试,完成可以使用.4.同步,在选择上面,测试过dropbox的api,计划使用dropbox.5.和evernote 有道 麦库打通api接口,这个还没有测试过,evernote应该是首选.6.用户登录,头像…7.跨平台8…….目前存在的问题1.笔记字数,使用sqlite数据库,存储的文字多少还存在考量.2.编辑器还不完美,编辑器的切换还对笔记的格式存在转换问题.3.内嵌浏览器的问题,这个是java的硬伤,目前使用IE内核,Webkit 由于不支持linux就放弃了,打算使用JF X的内嵌浏览器来实现,提高性能和解决跨平台的问题.4……采用的技术1.界面使用BeautyEye,界面很漂亮2.nutzDao,小巧灵活.3.数据库使用sqlite,4.编辑器使用ueditor wysihtml5 pagedown做笔记软件真不容易,特别还是用java来做.在13年3月份差不多已经这个样子了,之后在忙其他事情,有时间就会继续完善的.看几张截图来看看.项目地址:http://git.oschina.net/imzhpe/jnote

1 4 5 6 77