循環結構是imperative
language的重要組成部分,一般也是程序中比較難以理解的部分。特別是沒有軟件技術背景的朋友,明顯對于循環的理解力較弱。在Von
Neumann體系結構中,賦值語句是必須的,因而引出了存儲概念,也引入了時間概念,因為我們可以區分出賦值前和賦值后的時刻。引入時間之后,本質性的
影響是程序串行化,而強迫我們從并行思考轉入串行處理。很多時候這是一種不自然的情況,在我們的自然思維中,我們看到的或想到的也許只是一組靜態結構,但
在程序中表達的時候卻往往不可避免的需要引入一個動態過程。而我們控制動態結構的能力總是不足的。最近對于函數式語言及處理風格的越來越強烈的要求可能也
從側面反映了大家對這種結構失配的不滿。
但是串行思維毫無疑問也是我們正常思維模式的一部分(當然這種思維模式在多大程度上是因為Von
Neumann
體系造成的,也是個很有趣的問題)。例如在頁面渲染的時候,我們可能希望預先把所有用到的數據都轉載到內存中,賦予不同的變量名,然后在頁面模板中我們只
要知道如何把這些數據變量表現出來就可以了。先做完A再做B,這是分層的思想,也是典型的串行思維。而基于數據進行處理,也是Von
Nenuman體系的基本思想。但是如果處處要求預先計算并賦值,往往增加了很多額外的步驟(glue
code),并且增大了對內存(計算空間)的需求。分層之后,還存在著一個各個層次之間結構匹配的維護問題。
面向對象在結構表達方面是一種
巨大的進步。經過多年的發展,我們在表達靜態結構關系方面已經是駕輕就熟了。通過屬性關聯,我們可以沿著對象圖進行結構遍歷。如果使用成員函數,在這種遍
歷過程中還可以包容更多的動態特性。而在數據持久化方面,ORM的盛行也在一定程度上證明了對象圖的有效性。使用對象圖可以大大降低對賦值語句的需求,減
輕了明確建模的壓力(每一次賦值都要求著一個明確的變量名,一個概念),也緩解了Von Neuman體系結構的束縛。例如,我們不再需要
var user = loadUser(userId);
var userOrgnization = loadOrgnization(user.orgId);
var userOrgnizationName = userOrgnization.name
而是直接使用 user.orgnization.name