我有一堂課,其中的大綱基本上列在下面。我的方法太具體。我怎樣才能使它更通用?
import org.apache.commons.math.stat.Frequency;
public class WebUsageLog {
private Collection<LogLine> logLines;
private Collection<Date> dates;
WebUsageLog() {
this.logLines = new ArrayList<LogLine>();
this.dates = new ArrayList<Date>();
}
SortedMap<Double, String> getFrequencyOfVisitedSites() {
SortedMap<Double, String> frequencyMap = new TreeMap<Double, String>(Collections.reverseOrder()); //we reverse order to sort from the highest percentage to the lowest.
Collection<String> domains = new HashSet<String>();
Frequency freq = new Frequency();
for (LogLine line : this.logLines) {
freq.addValue(line.getVisitedDomain());
domains.add(line.getVisitedDomain());
}
for (String domain : domains) {
frequencyMap.put(freq.getPct(domain), domain);
}
return frequencyMap;
}
}
此應用程序的目的是讓我們的人力資源人員能夠查看我們發送給他們的Web使用日誌。不過,我相信隨着時間的推移,我希望能夠提供選項,不僅可以查看訪問網站的頻率,還可以查看LogLine的其他成員(例如指定類別的頻率,訪問類型[文本/ html,img/jpeg等]過濾判斷,等等)。理想情況下,我希望避免爲每種類型的數據編寫單獨的方法,並且每種方法最終看起來幾乎與方法相同。
所以,我的問題是雙重的:首先,從機械的角度來看,你能看到哪裏應該改進這種方法嗎?其次,如何讓這種方法更通用,以便它能夠處理任意數據集?
如果您遵循敏捷方法,你不應該下YAGNI(你是不是要去做任何代碼需要它)的原則。說過你應該始終關注未來。 – ChrisF 2010-05-20 19:34:40
那麼,我知道我至少想要getFrequencyOfCategory()和getFrequencyOfVerdict()。我可以很容易地寫兩者,但三者之間的方法非常相似,但它們都需要以不同的方式從LogLine類中提取信息,而且我不確定如何區分它們。 – EricBoersma 2010-05-20 19:41:22
有序映射是一個壞主意,因爲它不允許和忽略重複鍵。除非您確定無法確定兩次使用相同的頻率,否則最好拿着ArrayList並對其進行排序。 – 2010-05-20 20:45:15