Re: [其他] 面試題目

作者: adrianshum (Alien)   2014-11-29 11:40:49
老實說和 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();
}
這部份的實作留給你自己練習

Links booklink

Contact Us: admin [ a t ] ucptt.com