網頁

2012年9月30日 星期日

State Pattern 狀態模式

今天想跟大家分享的設計模式叫做”State Pattern” 狀態模式,最近在工作上遇到一個案例,我覺得就非常適合使用這個模式去重構,當我今天看到在某個物件中,有過多的if….else if…..or Switch case…或許你可以試著思考是否可以使用State Pattern去把過多的條件敘述簡化掉,在我遇到的案例中,我發現了像下列的程式碼:

2012年8月16日 星期四

Unity Editor Mode的Update and Timer

 

在之前公司使用Unity開發某項專案的時候,由於要擴充Unity原有的EditorWindows功能去做一個編輯器,由於需要Timer的功能,但是在Unity的Editor Mode的時候,去呼叫Time.deltaTime卻永遠都是0。因為Time的功能只會在Play Mode的時候才會運行。

這時候我們只好自己去實做一個Timer。做法如下

  1: using UnityEditor;
  2: using UnityEngine;
  3: 
  4: [InitializeOnLoad]
  5: public class EditorTimer  
  6: {
  7: 
  8:     private static double lastTime = 0;
  9:     private static double deltaTime = 0;
 10:     public static double GetDeltaTime
 11:     {
 12:         get { return deltaTime; }
 13:     }
 14: 	
 15:     static EditorTimer()
 16:     {
 17:        lastTime = EditorApplication.timeSinceStartup;
 18:        //將Update這個function加入EditorApplication的Update中
 19:        EditorApplication.update += Update;
 20:     }
 21:     // Update is called once per frame
 22:     static void Update () 
 23:     {
 24:         deltaTime = EditorApplication.timeSinceStartup - lastTime;
 25:         lastTime = EditorApplication.timeSinceStartup;
 26:         //Debug.Log(deltaTime);
 27:     }
 28: }


這樣我們只需要在Editro Mode的時候去呼叫EditorTimer.GetDeltaTime


就可以取得我們所需要的時間,當然也可以再擴充其他的功能,例如TotalTime..等等。

2012年7月31日 星期二

2012面試心得Part2

6.三貝德
地點:三重湯城園區
工作內容:幼教軟體遊戲開發
面試過程:這個算是以前同事在那邊工作,一直叫我去談看看,最後就去了,其實內容還是做遊戲,面試過程非常Free..連一般正式該跑的流程都不太有,所以很像去跟朋友聊天,其實對這份意願工作不高,加上裡面制度尚未完善,面式的當下就得到Offer,只是我最後還是決定考慮再三再回覆。
結果:我發給他們感謝卡,後續這家公司有一些做法讓我很不高興,或許是好意,也不是我之前同事做的,但是我想這間公司以後打死也不會去上班吧XDDDD。

2012 面試心得 Part 1

 

由於某些緣故,所以開始轉換工作環境,從7月份來陸陸續續面試大大小小的遊戲公司、軟體公司,大約估計約有13家吧。在這邊就把這幾次面試的心得分享一下。

2012年6月26日 星期二

C++ Const用法

C++的const關鍵字有很多種用法,而善加利用const,可以改善程式的封裝安全性。

下列介紹4種很基礎的const 用法:

  1: int b = 123;
  2: //1. 針對指標所儲存的常數做const的修飾。
  3: //(*a) = 3 錯誤的操作,但是可以針對所指向的記憶體位址做操作。
  4: //例如: a++ 在這邊是可以的。
  5: const int* a = &b; 
  6: //2.同上
  7: int const *a = &b;     
  8: //3.針對指標所指向的記憶體位址做const的修飾。
  9: //a++ 錯誤的操作,但是可以針對所儲存的常數做操作。
 10: //例如 (*a) = 3 在這邊是可以的。
 11: int* const a = &b;     
 12: //4.結合1、2跟3,同時對常數以及記憶體位址做const的修飾
 13: const int* const a = &b;    
另外,const也可以用來修飾function。

Strategy 策略模式

何謂策略模式:

定義各別的演算法並將其封裝起來,讓他們之間可以互相替換,此模式讓演算法的變動,不會影響使用演算法的程式。

image_thumb1

由上面的UML圖可以得知Strategy類別只是一個演算法介面,而ConcreteStrategyA、B、C是真正實作的演算法內容,而Context是真正使用演算法的類別。

 

從上面的UML圖我們更可以發現兩個重點:

 

※ 寫程式是針對介面撰寫,而不是針對實踐方式。

 

※ 將程式中可能需要變動之處,取出並封裝起來,以後便可以輕易低擴充此部分,而不影響不需要更動的其他部分

 

在未來我們可以增加ConcreteStrategyD,E,F而不會去影響原有的程式功能。

初談設計模式

40112-59_thumb1

設計模式是對軟體設計中普遍存在(反覆出現)的各種問題,所提出的解決方案。設計模式並不直接用來完成程式碼的編寫,而是描述在各種不同情況下,要怎麼解決問題的一種方案。

 

物件導向設計模式通常以類別物件來描述其中的關係和相互作用,但不涉及用來完成應用程式的特定類別或物件。

 

求學期間,老師們教學生的是能夠把功能達成為第一原則,對於Code的品質要求並沒有那麼的高。

 

在進入業界之後,除了要把該做的功能達成,更要把事情做好,當然也包括程式設計這件事情。在教育訓練的期間,是以這本書為主要參考書。此書的內容以Java為主,因為Java對當時的我來說是個陌生的語言,所以就照著此書的範例把它改成C++的版本。