微軟的MVC架構喊得紅紅火火,PHP當然也不遑多讓,網路上有很多的平臺提供MVC的功能,例如zend、CodeIgniter都是相當知名的,而且還是開放源碼,拿來研究的確會讓自己功力進步不少。不過裏面的程式碼通常都非常艱澀難懂,要看懂它自己的底子一定要夠硬才成。
要用PHP達到MVC的開發架構,最重要的原理就是讓網址變成/Control/Action/Params的方式,這個對現在的網站來說非常重要,因為SEO就是喜歡這樣格式的網址,要達到這個目的有兩個重要的步驟。
微軟的MVC架構喊得紅紅火火,PHP當然也不遑多讓,網路上有很多的平臺提供MVC的功能,例如zend、CodeIgniter都是相當知名的,而且還是開放源碼,拿來研究的確會讓自己功力進步不少。不過裏面的程式碼通常都非常艱澀難懂,要看懂它自己的底子一定要夠硬才成。
要用PHP達到MVC的開發架構,最重要的原理就是讓網址變成/Control/Action/Params的方式,這個對現在的網站來說非常重要,因為SEO就是喜歡這樣格式的網址,要達到這個目的有兩個重要的步驟。
開發系統難免會需要使用到虛擬主機,我選用了visualbox這個免費軟體,用起來還蠻簡單的,而且直接支援虛擬DVD的功能,要裝軟體只要準備好iso檔就好了。裝好一個虛擬機器沒有甚麼問題,一切都很直覺兩下子就裝起來了,對外連線也不會有問題,不過卻會碰到你的主機連接不到虛擬機器的情況。
網路上有使用兩個IP和虛擬兩個網卡的方式,不過這樣非常麻煩,如果是在辦公室,你還需要跟網管去要可以用的IP。
在高階程式語言裏面的函數宣告,參數都可以用byval byref來將參數設定為傳值或傳位(也有人說是傳址,反正就是傳入參數的位址啦)。但javascript是個死硬派,堅持所有的參數都是傳值,只有物件才是傳位(事實上是物件這個變數裏面只保留了物件的位址,而我們拿的時候因為是物件所以直接就變成物件了,根本上還是傳值啦)。那麼有甚麼方法可以讓javascript傳回多個值呢?
第一種方法,使用全域變數,這個方法是簡單,但是很呆,如果這樣的東西一多,你的全域變數就滿街跑了。應該不用寫範例吧。
網頁的多國語文一直是個頭痛的問題,如果用程式碼硬幹,不外乎兩種策略,一個是使用資源檔,另一個是在資料庫中動手腳,用語文夾雜在欄位名稱上,然後根據所選語文挑選對應的欄位。不過這兩種做法都會讓原始碼變得難以閱讀。
不過這也都只是針對網頁上的固定文字進行多國語文的方案,對於內容是真的就很難。
ASP.NET中的MasterPage實在是太好用了,而在PHP裏面如果只是用傳統的方法,那麼只能夠把主要版面分段,然後個別使用include()的方式將主要版面湊出來,總覺得說不出來的彆扭。而且如果切割不好,那麼主要版面一旦改版,那麼內容頁就會改到死。使用傳統方法的程式碼大概像這樣:
<body> <div><?php include('menu.php');?></div> <div><?php include($page_content);?></div> <div><?php include('footer.php');?></div> </body>
前面介紹了幾個序列化的方式,而dotNet也提供了壓縮的方法,我就在想是不是可以在序列化之後順便壓縮一下呢。
實際做的時候才發覺有許多問題,查了網上其他人的寫法,程式都變得落落長,其實都是利用串流Stream做出來的,怎麼會搞成那麼複雜。在多次修改之後終於有了最後的版本。
我們在寫一些程式的時候,偶爾會遇到因為不同選項需要使用不同的程式,例如說需要設計給不同客戶的程式,主程式不變,但是處理的程序不同,以前的做法就是直接使用switch的方式來設計,但是一旦選項多起來,程式就非常的難以維護。
雖然這個方法在C++裏面是很普通的方式,但是如果不是一直研究程式寫法的話,往往不知道怎麼寫這樣的程式碼,只好用傳統的方法一直痛苦下去。
枚舉很好用,他可以讓我們寫程式更加的方便,不過在實際應用至輸出的時候,直接輸出值也不對,使用者看不懂,輸出對應的名字,又是英文而且還是個奇怪的變數型英文,也是看沒有。這時候就會想到寫一個轉換函數來對應它,但總覺得不是那麼的直覺。
1: public enum ItemCreateType {
2: Porduction = 0,
3: Crossover = 1,
4: Mutation = 2,
5: Explosion = 3
6: }
之前曾經寫過一個可以共用的XML序列化函數,雖然XML是個很容易閱讀的資料格式,但是缺點就是檔案太大。dotNet另外提供了二進位序列化方法,也是蠻簡單的但是實際上寫起來卻沒有那麼容易。
因為XML是個文字格式,所以序列化的時候也只有針對可以文字化的屬性做處理,但是換成二進位的時候卻要多注意很多事情,要把可以序列化跟不可以序列化的東西分得很清楚才行,最容易忽略的就是事件了。
在開發程式的過程中,可能為了除錯方便,需要將執行的過程記錄到LOG檔案中,這樣的東西應該是大家所共有的方法。而且這樣的動作在每個地方都會發生,所以應該寫一個公用的物件來處理這件事情。
1: public static class EventLog {
2: public static string FilePath { get; set; }
3:
4: public static void Write(string format, params object[] arg) {
5: Write(string.Format(format, arg));
6: }
7:
8: public static void Write(string message) {
9: if (string.IsNullOrEmpty(FilePath)) {
10: FilePath = Directory.GetCurrentDirectory();
11: }
12: string filename = FilePath +
13: string.Format("\\{0:yyyy}\\{0:MM}\\{0:yyyy-MM-dd}.txt", DateTime.Now);
14: FileInfo finfo = new FileInfo(filename);
15: if (finfo.Directory.Exists == false) {
16: finfo.Directory.Create();
17: }
18: string writeString = string.Format("{0:yyyy/MM/dd HH:mm:ss} {1}",
19: DateTime.Now, message) + Environment.NewLine;
20: File.AppendAllText(filename, writeString, Encoding.Unicode);
21: }
22: }