作者qrtt1 (有些事,有时候。。。)
看板java
标题Re: [J2SE] 谈谈Service的设计
时间Sat Jul 20 10:06:35 2013
※ 引述《Killercat (杀人猫™)》之铭言:
: http://rayer.logdown.com/posts/32096-talk-about-service-design
: 因为文很长,加上里面有无敌多的code
: 所以我直接贴我logdown连结
: 绝对不是要推销自己blog喔(本来就没啥人气的 XD)
: Logdown能用Markdown真的是太对我胃口了,唯一的缺憾大概就是没footnote
: 所以前两天就决定慢慢把技术文章转过来
: 这篇将会在一个月之後的某个技术讨论会议拿出来聊,也请大家帮我看看
: 这技术上到底有什麽优缺点
: 可以直接执行的source code在整篇文章最下面
: 里面包含了自己动手玩。
: 这篇ptt post我想聊点其他东西,跟这个有点关系,可以算是这个技术的起头
: 我自己工程师生涯大概也有9年了,我算是比较坚持强型别以及型别安全的。
: 也许是因为我主攻的是C++,C++对这个的技术(Technique)是相当重视的,
: 而JavaScript则是另外一种极端,Obj-C早期也是完全没型别安全概念
: Java整体来讲开发者的习惯是比较偏中庸,前面有人提到Spring,其实Spring
: 严格讲起来也有很多型别问题,更不用说很多系统中充斥着父转子子转父
: AService serv = (AService)getSystemService(SERVICEA_CONTEXT);
: 或者这种东西(坏习惯的人真的很多)
: if(a instanceof AService)
: .......;
: 由於我个人是比较坚持型别安全,编译器能帮我们检查的时候我绝对不会执行期检查
: 在我还在写C++的时候,也因为template的使用跟资深前辈迭起冲突
: (template可以锁定型别,而且能做出一些如Policy Based Design的设计)
: 在Java其实也常常会碰到自己写的Generic却发现别人根本看不懂的窘况
: (老实讲我自己私底下会认为,都职业级了,这种东西跟Design Pattern至少都要能看
: 懂吧?纯Technique的东西不能拿看不懂当借口)
: 我以前也常常去涂改别人obj-c id传来传去的code,如果这个放在java的话,就是把
: Object传来传去,然後再转型 -- instanceof? 硬转?whatever... 这种code我想在
: 看这个板有点年纪的人应该看到都会想骂。
: @Override
: public Object startService(Object parameter);
: 这种code其实职业生涯碰过许多次,总会说阿parameter每个service都长得不一样啊
: (听说有种做法叫做生成模式?没考虑过用Factory or Builder?)
: 全面改写很麻烦因为它已经是interface的一部分了啊
: (听说这interface就是嫌麻烦的人搞出来的飞机)
: 反正这种东西该怎麽转型势教育训练该做的事情啊
: (这个真的听了很无言都不知道怎麽反驳的好 XD)
: 後来才慢慢体会到,所有事情都自己做好,别人不用转型的话
: 整个code都会清爽很多。Framework层先做掉,让对方用的方便,自然就会这样用
: 这篇blog文章也请大家不吝指教一下,感谢 =P
: 我相信应该很多人也对这方法跟特性很陌生,顺便分享一下
感觉起来,只是一种实作的 style
以我写过的东西,也偏好不需要强制转换
https://github.com/qrtt1/jplurk-oauth/wiki
/* create oauth config */
PlurkOAuth auth = new PlurkOAuth(
prop.getProperty("appkey"), prop.getProperty("appsecret"),
prop.getProperty("token"), prop.getProperty("tokensecret"));
auth.using(Timeline.class)
.plurkAdd("Hello JPlurk-OAuth", Qualifier.SAYS);
俺倾向将这篇文章看为 api 设计风格。
再配合 fluent style 使用起来就更顺手:
http://www.martinfowler.com/bliki/FluentInterface.html
例如,前一阵子包装的 mail builder 像这样:
public class MailBuilderTest {
@Test
public void testMailBuilder() throws Exception {
MailBuilder builder = new MailBuilder();
builder.from("
[email protected]").to("
[email protected]")
.withTitle("hate you").hasContent("damn it");
builder.send();
Mailbox mailbox = Mailbox.get("
[email protected]");
Message message = mailbox.get(0);
assertEquals("
[email protected]", message.getFrom()[0].toString());
assertEquals("hate you", message.getSubject());
assertEquals("damn it", message.getContent());
}
}
无论是 api 实作或是 design 运用,俺比较秉持着
「爽到你,甘苦到我」的原则,把难搞的,容易写错的都封装起来
乱呼叫的、不满足的得有提示,使用流程、方式不能太难理解。
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 114.43.119.13
1F:推 Killercat:是,这题目写Service设计是有点错误了 XD 07/20 11:51
2F:推 gmoz:推 07/20 12:37