Re: [其他] 面試題目
老實說和 OOAD 扯不上什麼關係吧.
回到問題上,可以大為簡化成:
// 後面全部是 psuedo-code
for (i = 1 to 100) {
boolean handled = false
if (isMultipleOfThree(i)) {
print "B" // 你的 constant 老實說極無意義
handled = true;
}
if (isMultipleOfFive(i)) {
printf "F"
handled = true
}
if (!handled) {
print i
}
}
然後加入一些和 OOAD 有點關係的東西, 套用類似 Strategy 的 pattern:
interface ItemHandler { // 用 generics 更佳,這裡簡單寫演示一下概念
// return true if handled, false if not
boolean handleItem(int i);
}
class PrintMultipleOfIntItemHandler implements ItemHandler {
int base;
String output;
public MultipleOfIntItemHandler(int base, String output) {
this.base = base;
this.output = output;
}
boolean handleItem(int i) {
if (i % base == 0) {
print output;
return true
}
return false
}
}
class SimplePrintItemHandler implements ItemHandler {
boolean handleItem(int i) {
print i
return true
}
}
你的 main loop 可以變成
// 這部份其實可以用不同方法達成,比如 config, DI etc
List<ItemHandler> handlers = [new PrintMultipleOfIntItemHandler(3,"B"),
new PrintMultipleOfIntItemHandler(5,"F")];
Handler defaultHandler = new SimplePrintItemHandler();
// 不必改動的 main loop
for (int i = 1 to 100) {
boolean handled = false
foreach (handler in handlers) {
result = handler.handleItem(i);
handled = handled || result;
}
if (!handled) {
defaultHandler.handleItem(i)
}
}
如果每個條件和處理是獨立的話,這做法可以讓你加入不同的
條件和處理方法時候,不需改動 main loop 的 logic
為了解決額外那個 defaultHandler,可以利用 chain-of-responsibility
pattern。
再進一步,如果你想連 item 的提供方法也可以替換,就弄一個
ItemProvider 的 interface 吧:
class ItemProvider {
// get next item. return null if no more item available
int nextItem();
}
這部份的實作留給你自己練習
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 223.19.45.197
※ 文章網址: http://www.ptt.cc/bbs/OOAD/M.1417232452.A.E2B.html
※ 編輯: adrianshum (223.19.45.197), 11/29/2014 11:49:54
→
11/29 12:03, , 1F
11/29 12:03, 1F
※ 編輯: adrianshum (223.19.45.197), 11/29/2014 15:29:05
→
12/20 02:54, , 2F
12/20 02:54, 2F
推
12/26 17:30, , 3F
12/26 17:30, 3F
推
03/05 14:20, , 4F
03/05 14:20, 4F
推
07/18 18:11, , 5F
07/18 18:11, 5F
推
07/18 20:37, , 6F
07/18 20:37, 6F
討論串 (同標題文章)
OOAD 近期熱門文章
PTT數位生活區 即時熱門文章