1. 程式人生 > >在重構ZUI中對使用者介面實現的思考

在重構ZUI中對使用者介面實現的思考

    首先,在寫ZUI的時候對程式設計思想不能很好的理解,只知道面向物件以及面向過程。現在回頭看以前寫的無疑是面向過程,當然最後對於整個程式碼封裝成類,這個不算這是為了便利性。在重構中認識這種面向過程好處主要是是幾點。首先節省記憶體,這點在像arduino pro mini rom32k ram2k 這類配置極低的微控制器來說顯得尤為重要。在面向過程中控制元件的繪製是通過函式來實現的,例如zui的text函式Text(0,0,"hello world");所有的變數都屬於自動儲存,在函式結束完即釋放,面向過程在這點上對面向物件有著天生的優勢。面向物件new屬於動態儲存,離開了這個函式它還是存在需要手動釋放。然而因為這是使用者介面不能一個頁面結束就給釋放了,如果釋放了下次需要進入這個會看到一片空白或者亂碼,因為原來記憶體地址上的資料已經釋放現在這裡要麼是空的要麼被其他的資料佔了。所以如果是面向物件在執行時所有頁面,控制元件的屬性儲存在記憶體中就會造成記憶體的大量佔用,而即使是面向過程的zui光一個空殼介面就佔用到30%的記憶體。

   面向過程的優勢其次是寫法簡單直接在home的函式內Text(0,0,"hello world");,在重構時我是考慮過改面向物件的,想象一下首先需要

Page* home =new Page(0);//0是頁面編號

Text* text0 = new Text(0,0,"hello world",home);//home是父控制元件

Text肯定是Page的派生類不用說,其它控制元件類也是,統一介面。這樣首先你需要取名,因為不進行釋放,所以這個頁面控制元件的取名還不能其它頁面衝突豈不是很麻煩.而且還需多打很多字母,其實我覺得這個優勢有點強行了。

    再來說說像ZUI這樣面向過程的缺點,事件的發生必須寫在頁面函式內部,而這樣控制元件的繪製與事件的發生放在一起有個極大的缺點那就是不便於維護,一堆程式碼堆在一起,並且因為沒有物件的封裝,想要找到相應的變數變得更加困難或者根本連宣告都沒有直接就寫上去了還得一個一個修改,如果面向物件直接text0->Text="xxxxxx";搞定,當然也可以全域性變數,不過這得一個個單獨寫出來。面向過程還有個比較嚴重的缺點,不能獲取其它頁面的屬性,當然還是可以全域性變數解決,當然這是也得一個個單獨寫出來。

 寫這麼多不是說哪種更好,而是需要因地制宜,具體情況具體分析。面對arduino pro mini 這樣配置極低 ,程式碼撐死幾千行的來說超輕量級的ZUI選擇面向過程還是挺合適的。而在越複雜越重量級的工程上一個可維護性直接讓面向過程狗帶。

未完待續。。。。。