需求的變化方向
作為程序員,有一天你被要求寫一段代碼否彩,這段代碼需要完成一件很簡單的事:
1. 打印”Hello, world”5次
很容易嘛疯攒,你想,然后順手就寫下了下面這幾行代碼:
print("Hello, world")
print("Hello, world")
print("Hello, world")
print("Hello, world")
print("Hello, world")
不過胳搞,拷貝粘貼看起來有點低端卸例,你做了一個微小的改動:
for(var i = 0; i < 5; i++) {
print("Hello, world")
}
看起來還不錯,老板的需求又變成了打印”Goodbye, world”5次肌毅。既然是打印不同的消息筷转,那何不把消息作為參數(shù)呢?
function printMessage(message) {
for(i = 0; i < 5; i++) {
print(message);
}
}
printMessage("Hello, world")
printMessage("Goodbye, world")
有了這個函數(shù)悬而,你可以打印任意消息5次了呜舒。老板又一次改變了需求:打印”Hello, world”13次(沒人知道為什么是13)。既然次數(shù)也變化了笨奠,那么一個可能是將次數(shù)作為參數(shù)傳入:
function printMessage(count, message) {
for(i = 0; i < count; i++) {
print(message);
}
}
printMessage(13, "Hello, world");
printMessage(5, "Goodbye, world");
完美袭蝗,這就是抽象的魅力唤殴。有了這個函數(shù),你可以將任意消息打印任意次數(shù)到腥。不過老板是永遠(yuǎn)無法滿足的朵逝,就在這次需求變化之后的第二天,他的需求又變了:不但要將”Hello, world”打印到控制臺乡范,還要將其計入日志配名。
沒辦法,通過搜索JavaScript的文檔晋辆,你發(fā)現(xiàn)了一個叫做高階函數(shù)的東東:函數(shù)可以作為參數(shù)傳入另一個參數(shù)渠脉!
function log(message) {
system.log(message);
}
function doMessage(count, message, action) {
for(i = 0; i < count; i++) {
action(message);
}
}
doMessage(5, "Hello, world", print);
doMessage(5, "Hello, world", log);
這下厲害了,我們可以對任意消息瓶佳,做任意次的任意動作芋膘!再回過頭來看看那個最開始的需求:
1. 打印”Hello, world”5次
稍微分割一下這句話:打印,”Hello, world”霸饲,5次为朋,可以看到,這三個元素最后都變成了可以變化的點厚脉,軟件開發(fā)很多時候正是如此潜腻,需求可能在任意可能變化的方向上變化。這也是各種軟件開發(fā)原則嘗試解決的問題:如何寫出更容易擴展器仗,更容易響應(yīng)變化的代碼來。
小結(jié):軟件的復(fù)雜性來自于大量的不確定性童番,而這個不確定性事實上是無法避免的精钮,而且每個軟件都是獨一無二的。另一方面剃斧,軟件的需求會以各種方式來變化轨香,而且往往會以開發(fā)者沒有預(yù)料到的方向。比如上面這個小例子中看到的幼东,最后的需求可能會變成將消息以短信的方式發(fā)送給手機號以185開頭的用戶手機上臂容。
由此可以看出在開發(fā)中應(yīng)對多種變化的需求處理。