【今天,你總結了嗎?】


  

  畢業后工作也快有兩個月,試用期期間也沒有太大的壓力,工作日正常上班,平時住在公司,晚上加點班,整理整理學習到的知識。上班的感覺還不錯,畢竟也有能力養活自己,比在學校的時候狀態要好些,更容易約束自己。這里是不是也潛伏着很多Dotaer呢,畢業了,對DOTA的熱情慢慢的淡下來了。咱還是安心的工作吧。

 學校

  在學校的時候主要跟着導師學習嵌入式方面的一些知識,參與割草機項目的開發,每學期領着導師發的微薄的“工資”,兩年半的時間很快,現在想想還是比較膚淺的,范圍不是很廣泛,使用C語言完成一些簡單的功能,也不會考慮深層次方面的東西,例如:代碼的優化上,內存的分配,代碼的健壯性等。


 公司

  進入進公司后,我被分配到了傳感器網絡部門,面對新的環境,咱也不虛,雖然技術不是很扎實,但是感覺前景還是有的。既來之,則安之嘛。我的直接上司在這公司已經有6年了,有着豐富的技術經驗,我的目標就是要慢慢的榨干他,當然是榨干他的知識。來了2個月,感覺他人還不錯,在分配了任務之后,會經常過來問問情況,我也不好意思老是問,怕一下子一大堆簡單的問題嚇到他,經常看到一些老員工很反感這樣的新員工,咱還是在他不在的時候問baidu吧,實在不能解決的,我就記在本子上,有關於技術方面的,有關於需求方面的。用謙虛的口吻跟老員工交流還是挺受用的。

  由於這個部門是用C++開發的,主要負責數據的通道和數據的處理轉發,很多要用到面向對象的思想,類的繼承等等,雖然在大學的時候學習過,但不曾有實質性的項目鍛煉,那時候的時間都奉獻給我的同學了。有失必有得嘛,至少還有幾個玩的比較好的朋友。(在這里忽然想到句話:當你失去一些重要東西的時候,其實上天在告訴你,你已經得到了很多了。)在剛着手的時候,經常犯一些低級錯誤,其實,咱在畢業前好一段時間沒認真的寫過代碼了。我覺得還是有必要記錄下易錯的知識點,免得以后再同一個地方在跌倒,也避免其他人走彎路。


 背景

  先扯點從項目中得來的感受吧。這個部門不是在我來才成立的,然而它的目標也很明確,就是解決數據的通道和處理,主要是網絡的通信,所以在軟件架構上已經有一套體系,個人感覺寫的不錯,很多地方都體現了C++面向對象的特點,因此最近我也惡補了一些相關知識,好在我以前學習的不多,要不然我現在還有這感悟嗎?(先找個以前不好好學習的借口)。通過類的繼承,能夠很好的適應不同的平台,這里指Windows和Linux上的,因為想讓程序在linux上運行還不是特別的方便,可以現在Windows上測試通過,再弄到Linux上測試。相關的底層函數也已經封裝了七七八八,對於我這個新碼農而言,只要學會如何使用它們就行了,多看看他們以前寫的代碼,呵呵。


 知識點

  1)面向對象特點有三:其一封裝,其二繼承,其三多態。

  ①  封裝防止了程序相互依賴性而帶來的變動影響。最直觀的是,一個類要控制另一個類里的數據成員時,不能直接對其操作,要通過相應的接口完成。當設計的好時,可以保證在面向對象模型下不會存在全局數據。

  ②  繼承性是子類自動共享父類數據結構和方法的機制,這是類之間的一種關系。在軟件開發中,類的繼承性使所建立的軟件具有開放性、可擴充性,這是信息組織與分類的行之有效的方法,它簡化了對象、類的創建工作量,增加了代碼的可重性。 例如在Windows和Linux中,它們對外的接口可以是一樣的,只是在實現上會有所差異,相同的部分我們可以抽象出來,作為基類(父類)。而將類的細化作為子類。

  ③  多態是指兩個或多個屬於不同類的對象,對於同一個消息(方法調用)作出不同響應的方式。多態則是為了實現接口重用,增強了軟件的靈活性和重用性。

  最近也看了博客園里很多大神的文章,也能學到一些知識,根據自己的情況,又在當當上買了三本書。

  《設計模式:可復用面向對象軟件的基礎》這本書好像評論還不錯。畢竟寫代碼不是難事,關鍵在於能不能設計出一個好的模式,嗯,我現在就缺這個。

  《大話設計模式》,在網上搜索到一部分內容,寫的很生動,容易理解,搭配着第一本看看吧。

  《大象——Thinking in UML》注重軟件的分析、設計與建模過程,軟件江湖盛傳的“UML第一書”,開發人員夢寐以求的“九陽真經”,真正助您打通軟件開發“任督二脈”。希望看了它,我的“任督二脈”也能通一下。

  好了,下面再簡單的談談項目中常發生的錯誤吧。

  2)第一個就是指針,類的指針,以前接觸不多,這次就吃了大虧,先是不申請內存就使用,其實這點我也注意,但是往往理解的不徹底,例如:

A *a, *b;
a=new A();
b=a;

  當你看到這個知識點時,很好理解,指針是用來指向對像的。a指向類的一個對象,而b沒有用new關鍵字,而是直接指向a這個對象。

  其實,new跟指針沒有關系。new是在堆上分配內存,作用域由開發人員確定。不new是在棧上分配內存,作用域由變量作用域確定。

  ps:指針訪問前,必須指向一段有效的內存,不管是堆的還是棧的。比如你上面的代碼就是指向棧的內存。

再一個需要注意的是指針的作用域,例如:

char *GetMemory( void )
{ 
 char p[] = "hello world"; 
 return p; 
}

void Test( void )
{ 
 char *str = NULL; 
 str = GetMemory(); 
 printf( str ); 
}

  其中一個錯誤是p[]數組為函數內的局部自動變量,在函數返回后,內存已經被釋放。這是許多程序員常犯的錯誤,其根源在於不理解變量的生存期

在項目中,剛開始我沒有很好的理解生存期的意思,我就貼出一段代碼來簡單說明一下吧。 

/********************************************************
功能:返回沒發送的任務中優先級最小的
********************************************************/
CTaskInfo* CTaskMgr::GetLowPRI()
{
    BOOL        bFind=FALSE;
    CTaskInfo*    pTaskInfo;
    for(DWORD i=0;i<MAX_TASK_COUNT && i<m_TaskCount;i++)
    {
        if(!m_TaskList[i]->HasSendFrame)
        {
            if(bFind)
            {
                if(m_TaskList[i]->PRI<pTaskInfo->PRI)
                {
                    pTaskInfo=m_TaskList[i];
                }                
            }
            else
            {
                pTaskInfo=m_TaskList[i];                 bFind=TRUE;
            }
        }
    }
    if(bFind)
    {
        return pTaskInfo;
    }
    return NULL;
}

  粗略一看,嗯?以上2個不是一回事嗎?怎么第一個不行,第二個就行了呢?原來區別在於m_TaskList[i]是一個CTaskInfo*類型的模塊變量,當return時,pTaskInfo指向的是一個堆,在沒有用delete釋放內存時是一直存在的,所以它是可以返回的。而上面的那個例子就不一樣了,p是一個局部變量,在棧中,當函數執行完后,p就被回收掉了,所以返回是無效的。以前不認真思考的話還真是一知半解。

  3)由於我做的項目中涉及到了網絡多通道問題,所以要靈活使用消息隊列,它是解決數據共享的,相當於一個緩存,由另一個線程再處理數據。再一個需要注意的是,對於多線程,有時候要注意使用鎖機制。這里就不詳細說了。


 寫在最后

  這次就先總結到這里吧,有的知識點不及時整理的話又要遺失在記憶的角落里拉。平時還要勤快點呢。知識是一點一點積累的,慢慢來。每天進步一點點。

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM