OOAD 板


LINE

很开心你有注意到这个问题, 以我个人来说,我是到了正式进入工作後, 才渐渐意识到我写的东西很难跟别人放在一起用。 因为过去学习程式语言的书本, 一开始都着重在语法的学习, 还有写一些 class 跟继承的结构。 渐渐熟悉了之後,误以为自己就是会 OO 了。 这是个美丽的错误, 实际上,整个系统是动态的。 一个 class 产生的实体(instance),在不同的系统时间点,拥有不同的状态。 所谓不同的状态,具体来说就是物件内含的资料不同。 把状态(资料)「封装」在物件里,只是初学阶段最熟知的 OO 特性。 但是,能被封装的不只是有状态。 只要你不要把封装只想成把资料藏起来, 那麽在对 OO 的想法上, 就会相当地海阔天空。 由 Design Pattern 得来的启示: 你也可以封装一套流程或演算规则。 在带入了 Design Pattern 这个主题後, 书上对每个 Pattern 的介绍,都会说明 client 如何使用产出。 而 client 就是使用 class 或 library 甚至 framework 的那一个 invoke。 如果状态会改变,client 也会时不同的时机乎叫它使用的物件方法。 以 Builder Pattern 来说 http://en.wikipedia.org/wiki/Builder_pattern 图中的 Director 就是 client,它使用别人写好的 Builder。 首先,你可以确认一下,你的东西应该是要给 client 呼叫的。 也就是抓图的主程式。 我这里做个假设,假设你们的程式是要抓网路相本用的。 (这听起来跟 diggirl.net 很像不是吗?) 那你写的东西,例如是专门抓取无名相本的类别 WretchStrategy。 我们先不说他应该有什麽方法, 因为这只要想清楚 client 需要什麽, 那些方法就自然能够浮现了。 client 是一个相片汇入(汇入到 diggirl)的程式。 class PhotoImporter { WretchStrategy strategy; public void doImport(String url) { /*该做什麽呢?*/ } } 当 client 想清楚他该做些什麽事时, 才能明确且完整订下 callee 的所有功能。 而 client 到该作些什麽,就关系到最後要留下什麽资料? 虽然,很明确地所有相片必需被存下来。 那再上一步呢? 就是所有相片的网址必需被找到。 那再上一步呢? 使用者也许给你的是任何一个单张相片的连结, 我们该把他转换成相本的主要连结。 也许是第一页或是相本特有的首页。 思考到这里,我们似乎能由一个相片的网址输入, 回推至整个流程需要做什麽事了。 class PhotoImporter { WretchStrategy strategy; public void doImport(String url) { String album = strategy.getAlbumPage(url); String[] pages = strategy.getAllPages(album); for (String page: pages) { downloader.queue(strategy.getThumbs(page)); downloader.queue(strategy.getPhotos(page)); } } } 这样写完後,你会新发现。似乎还差一个 Downloader 需要实作。 还有 WretchStrategy 该加上什麽功能。 如果要增加不同的相本抓取,那就是该将 WretchStrategy 抽象化的时机了。 而且要判断该用何种 Strategy 来抓取相本: class PhotoImporter { public void doImport(String url) { // 判断该用那一个 Strategy 来抓取相本 IStrategy strategy = Strategy.getInstance(url); String album = strategy.getAlbumPage(url); String[] pages = strategy.getAllPages(album); for (String page: pages) { downloader.queue(strategy.getThumbs(page)); downloader.queue(strategy.getPhotos(page)); } } } 而一个 IStrategy 应该就像: interface IStrategy { public String getAlbumPage(String url); public String[] getAllPages(String albumUrl); public String[] getThumbs(String pageUrl); public String[] getPhotos(String pageUrl); } 故事说到这,其实该点出 PhotoImporter 是 Template Method Pattern。 而 IStrategy 是它的 Hook Method。 IStrategy 负责封装抓取特定相本的规则,为一个 Strategy Pattern。 如果您觉得,你写的东西没办法跟别人合起来, 那表示,制定流程的人,大概有什麽少跟你说了。 试着用不同的观点去看待,把问题找出来呗 :D --



※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 61.231.49.42 ※ 编辑: qrtt1 来自: 61.231.49.42 (08/18 00:24)
1F:推 goodGG :public String[] getAllPages(String albumUrl); 08/18 00:31
2F:→ goodGG :也可以丢出一个 iterator, 这又是一个 pattern XD 08/18 00:32
3F:推 aecho :我觉得一起合作比较麻烦,但很重要的,是要一直沟通 08/19 07:22
4F:→ aecho :写作过程中,双方对原有问题的理解,会逐渐加深 08/19 07:23
5F:→ aecho :频繁的沟通,哪怕只是闲聊,也是很重要的。 08/19 07:23







like.gif 您可能会有兴趣的文章
icon.png[问题/行为] 猫晚上进房间会不会有憋尿问题
icon.pngRe: [闲聊] 选了错误的女孩成为魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一张
icon.png[心得] EMS高领长版毛衣.墨小楼MC1002
icon.png[分享] 丹龙隔热纸GE55+33+22
icon.png[问题] 清洗洗衣机
icon.png[寻物] 窗台下的空间
icon.png[闲聊] 双极の女神1 木魔爵
icon.png[售车] 新竹 1997 march 1297cc 白色 四门
icon.png[讨论] 能从照片感受到摄影者心情吗
icon.png[狂贺] 贺贺贺贺 贺!岛村卯月!总选举NO.1
icon.png[难过] 羡慕白皮肤的女生
icon.png阅读文章
icon.png[黑特]
icon.png[问题] SBK S1安装於安全帽位置
icon.png[分享] 旧woo100绝版开箱!!
icon.pngRe: [无言] 关於小包卫生纸
icon.png[开箱] E5-2683V3 RX480Strix 快睿C1 简单测试
icon.png[心得] 苍の海贼龙 地狱 执行者16PT
icon.png[售车] 1999年Virage iO 1.8EXi
icon.png[心得] 挑战33 LV10 狮子座pt solo
icon.png[闲聊] 手把手教你不被桶之新手主购教学
icon.png[分享] Civic Type R 量产版官方照无预警流出
icon.png[售车] Golf 4 2.0 银色 自排
icon.png[出售] Graco提篮汽座(有底座)2000元诚可议
icon.png[问题] 请问补牙材质掉了还能再补吗?(台中半年内
icon.png[问题] 44th 单曲 生写竟然都给重复的啊啊!
icon.png[心得] 华南红卡/icash 核卡
icon.png[问题] 拔牙矫正这样正常吗
icon.png[赠送] 老莫高业 初业 102年版
icon.png[情报] 三大行动支付 本季掀战火
icon.png[宝宝] 博客来Amos水蜡笔5/1特价五折
icon.pngRe: [心得] 新鲜人一些面试分享
icon.png[心得] 苍の海贼龙 地狱 麒麟25PT
icon.pngRe: [闲聊] (君の名は。雷慎入) 君名二创漫画翻译
icon.pngRe: [闲聊] OGN中场影片:失踪人口局 (英文字幕)
icon.png[问题] 台湾大哥大4G讯号差
icon.png[出售] [全国]全新千寻侘草LED灯, 水草

请输入看板名称,例如:BabyMother站内搜寻

TOP