Re: [J2SE] 談談Service的設計
※ 引述《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("me@mail.com").to("you@mail.com")
.withTitle("hate you").hasContent("damn it");
builder.send();
Mailbox mailbox = Mailbox.get("you@mail.com");
Message message = mailbox.get(0);
assertEquals("me@mail.com", message.getFrom()[0].toString());
assertEquals("hate you", message.getSubject());
assertEquals("damn it", message.getContent());
}
}
無論是 api 實作或是 design 運用,俺比較秉持著
「爽到你,甘苦到我」的原則,把難搞的,容易寫錯的都封裝起來
亂呼叫的、不滿足的得有提示,使用流程、方式不能太難理解。
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 114.43.119.13
推
07/20 11:51, , 1F
07/20 11:51, 1F
推
07/20 12:37, , 2F
07/20 12:37, 2F
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 7 之 9 篇):