![java面向?qū)ο蟮膶W(xué)習(xí)心得_第1頁](http://file3.renrendoc.com/fileroot_temp3/2022-2/15/bdd8bebc-dffa-4722-a4a5-af7c968ba070/bdd8bebc-dffa-4722-a4a5-af7c968ba0701.gif)
![java面向?qū)ο蟮膶W(xué)習(xí)心得_第2頁](http://file3.renrendoc.com/fileroot_temp3/2022-2/15/bdd8bebc-dffa-4722-a4a5-af7c968ba070/bdd8bebc-dffa-4722-a4a5-af7c968ba0702.gif)
![java面向?qū)ο蟮膶W(xué)習(xí)心得_第3頁](http://file3.renrendoc.com/fileroot_temp3/2022-2/15/bdd8bebc-dffa-4722-a4a5-af7c968ba070/bdd8bebc-dffa-4722-a4a5-af7c968ba0703.gif)
![java面向?qū)ο蟮膶W(xué)習(xí)心得_第4頁](http://file3.renrendoc.com/fileroot_temp3/2022-2/15/bdd8bebc-dffa-4722-a4a5-af7c968ba070/bdd8bebc-dffa-4722-a4a5-af7c968ba0704.gif)
![java面向?qū)ο蟮膶W(xué)習(xí)心得_第5頁](http://file3.renrendoc.com/fileroot_temp3/2022-2/15/bdd8bebc-dffa-4722-a4a5-af7c968ba070/bdd8bebc-dffa-4722-a4a5-af7c968ba0705.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、Java面向?qū)ο蟮膶W(xué)習(xí)心得大三的時候?qū)W校組織我們?nèi)ヌK州NIIT參加四個月的java實(shí)訓(xùn),我開始系統(tǒng)的學(xué)習(xí)期java,之前大學(xué)的時候?qū)W的比較寬泛,沒有專門的正對java的學(xué)習(xí)。首先我是從學(xué)習(xí)Java編程開始接觸OOP(面向?qū)ο缶幊?,剛開始使用Java編寫程序的時候感覺很別扭,因?yàn)槲以缫粤?xí)慣用C來編寫程序,很欣賞C的簡潔性和高效性,喜歡C簡練而表達(dá)能力豐富的風(fēng)格,特別忍受不了Java運(yùn)行起來慢吞吞的速度,相對冗長的代碼,而且一個很簡單的事情,要寫好多類,一個類調(diào)用一個類,心里的抵觸情緒很強(qiáng)。 我對Java的面向?qū)ο蟮奶匦宰聊チ季?,自認(rèn)為有所領(lǐng)悟,也開始有意識的運(yùn)用OOP風(fēng)格來寫程序,然而還是經(jīng)常
2、會覺得不知道應(yīng)該怎樣提煉類,面對一個具體的問題的時候,會覺得腦子里千頭萬緒的,不知道怎么下手,一不小心,又會回到原來的思路上去。舉個例子,要發(fā)廣告郵件,廣告郵件列表存在數(shù)據(jù)庫里面。倘若用C來寫的話,一般會這樣思考,先把郵件內(nèi)容讀入,然后連接數(shù)據(jù)庫,循環(huán)取郵件地址,調(diào)用本機(jī)的qmail的sendmail命令發(fā)送。然后考慮用Java來實(shí)現(xiàn),既然是OOP,就不能什么代碼都塞到main過程里面,于是就設(shè)計(jì)了三個類:一個類是負(fù)責(zé)讀取數(shù)據(jù)庫,取郵件地址,調(diào)用qmail的sendmail命令發(fā)送;一個類是讀郵件內(nèi)容,MIME編碼成HTML格式的,再加上郵件頭;一個主類負(fù)責(zé)從命令讀參數(shù),處理命令行參數(shù),調(diào)用發(fā)
3、email的類。把一件工作按照功能劃分為3個模塊分別處理,每個類完成一件模塊任務(wù)。仔細(xì)的分析一下,就會發(fā)現(xiàn)這樣的設(shè)計(jì)完全是從程序員實(shí)現(xiàn)程序功能的角度來設(shè)計(jì)的,或者說,設(shè)計(jì)類的時候,是自低向上的,從機(jī)器的角度到現(xiàn)實(shí)世界的角度來分析問題的。因此在設(shè)計(jì)的時候,就已經(jīng)把程序編程實(shí)現(xiàn)的細(xì)節(jié)都考慮進(jìn)去了,企圖從底層實(shí)現(xiàn)程序這樣的出發(fā)點(diǎn)來達(dá)到滿足現(xiàn)實(shí)世界的軟件需求的目標(biāo)。這樣的分析方法其實(shí)是不適用于Java這樣面向?qū)ο蟮木幊陶Z言,因?yàn)?,如果改用C語言,封裝兩個C函數(shù),都會比Java實(shí)現(xiàn)起來輕松的多,邏輯上也清楚的多。我覺得面向?qū)ο蟮木柙谟诳紤]問題的思路是從現(xiàn)實(shí)世界的人類思維習(xí)慣出發(fā)的,只要領(lǐng)會了這一點(diǎn),就
4、領(lǐng)會了面向?qū)ο蟮乃季S方法。舉一個非常簡單的例子:假使現(xiàn)在需要寫一個網(wǎng)頁計(jì)數(shù)器,客戶訪問一次頁面,網(wǎng)頁計(jì)數(shù)器加1,計(jì)數(shù)器是這樣來訪問的后臺有一個數(shù)據(jù)庫表,保存每個id(一個id對應(yīng)一個被統(tǒng)計(jì)訪問次數(shù)的頁面)的計(jì)數(shù)器當(dāng)前值,請求頁面一次,對應(yīng)id的計(jì)數(shù)器的字段加1(這里我們忽略并發(fā)更新數(shù)據(jù)庫表,出現(xiàn)的表鎖定的問題)。如果按照一般從程序?qū)崿F(xiàn)的角度來分析,我們會這樣考慮:首先是從HTTP GET請求取到id,然后按照id查數(shù)據(jù)庫表,獲得某id對應(yīng)的訪問計(jì)數(shù)值,然后加1,更新數(shù)據(jù)庫,最后向頁面顯示訪問計(jì)數(shù)?,F(xiàn)在假設(shè)一個沒有程序設(shè)計(jì)經(jīng)驗(yàn)的人,他會怎樣來思考這個問題的呢?他會提出什么樣的需求呢?他很可能會這
5、樣想:我需要有一個計(jì)數(shù)器,這個計(jì)數(shù)器應(yīng)該有這樣的功能,刷新一次頁面,訪問量就會加1,另外最好還有一個計(jì)數(shù)器清0的功能,當(dāng)然計(jì)數(shù)器如果有一個可以設(shè)為任意值的功能的話,我就可以作弊了。做為一個沒有程序設(shè)計(jì)經(jīng)驗(yàn)的人來說,他完全不會想到對數(shù)據(jù)庫應(yīng)該如何操作,對于HTTP變量該如何傳遞,他考慮問題的角度就是我有什么需求,我的業(yè)務(wù)邏輯是什么,軟件應(yīng)該有什么功能。按照這樣的思路(請注意,他的思路其實(shí)就是我們平時在生活中習(xí)慣的思維方式),我們知道需要有一個計(jì)數(shù)器類 Counter,有一個必須的和兩個可選的方法:getCount() / 取計(jì)數(shù)器值方法resetCounter() / 計(jì)數(shù)器清0方法setCou
6、nt() / 設(shè)計(jì)數(shù)器為相應(yīng)的值方法把Counter類完整的定義如下:public class Counter public int getCount(int id) public void resetCounter(int id) public void setCount(int id, int currentCount) 解決問題的框架已經(jīng)有了,來看一下如何使用Counter。 在count.cgi里面調(diào)用Counter來計(jì)數(shù),程序片斷如下:/ 這里從HTTP環(huán)境里面取id值.Counter myCounter = new Counter(); / 獲得計(jì)數(shù)器int currentCoun
7、t = myCounter.getCount(id); / 從計(jì)數(shù)器中取計(jì)數(shù)/ 這里向客戶瀏覽器輸出.程序的框架全都寫好了,剩下的就是實(shí)現(xiàn)Counter類方法里面具體的代碼了,此時才去考慮具體的程序語言實(shí)現(xiàn)的細(xì)節(jié),比如,在getCount()方法里面訪問數(shù)據(jù)庫,更新計(jì)數(shù)值。從上面的例子中看到,面向?qū)ο蟮乃季S方法其實(shí)就是我們在現(xiàn)實(shí)生活中習(xí)慣的思維方式,是從人類考慮問題的角度出發(fā),把人類解決問題的思維方式逐步翻譯成程序能夠理解的思維方式的過程,在這個翻譯的過程中,軟件也就逐步被設(shè)計(jì)好了。在運(yùn)用面向?qū)ο蟮乃季S方法進(jìn)行軟件設(shè)計(jì)的過程中,最容易犯的錯誤就是開始分析的時候,就想到了程序代碼實(shí)現(xiàn)的細(xì)節(jié),因此
8、封裝的類完全是基于程序?qū)崿F(xiàn)邏輯,而不是基于解決問題的業(yè)務(wù)邏輯。學(xué)習(xí)JDBC編程的經(jīng)典錯誤問法是:“我怎樣封裝對數(shù)據(jù)庫的select操作?”面向?qū)ο蟮脑O(shè)計(jì)是基于解決業(yè)務(wù)問題的設(shè)計(jì),而不是基于具體編程技術(shù)的設(shè)計(jì)。我不會去封裝select語句的,我只封裝解決問題的業(yè)務(wù)邏輯,對數(shù)據(jù)庫的讀取是在業(yè)務(wù)邏輯的編碼實(shí)現(xiàn)階段才去考慮的問題。回過頭看上面那個發(fā)廣告郵件的例子,應(yīng)該如何應(yīng)用面向?qū)ο蟮乃季S方法呢?對于一個郵件來說,有郵件頭,郵件體,和郵件地址這三個屬性,發(fā)送郵件,需要一個發(fā)送的方法,另外還需要一個能把所有郵件地址列出來的方法。所以應(yīng)該如下設(shè)計(jì):類JunkMail屬性:headbodyaddress方法
9、:sendMail() / 發(fā)送郵件listAllMail() / 列郵件地址用Java來表示:public class JunkMail private String head;private String body;private String address;public JunkMain() / 默認(rèn)的類構(gòu)造器/ 從外部配置文件讀郵件頭和郵件體this.head=.;this.body=.;public static boolean sendMail(String address) / 調(diào)用qmail,發(fā)送emailpublic static Collection listAllMai
10、l() / 訪問數(shù)據(jù)庫,返回一個郵件地址集合當(dāng)把JunkMail設(shè)計(jì)好了以后,再調(diào)用JunkMail類完成郵件的發(fā)送,將是非常輕松的事情。如果說傳統(tǒng)的面向過程的編程是符合機(jī)器運(yùn)行指令的流程的話,那么面向?qū)ο蟮乃季S方法就是符合現(xiàn)實(shí)生活中人類解決問題的思維過程。在面向?qū)ο蟮能浖治龊驮O(shè)計(jì)的時候,要提醒自己,不要一上來就去想程序代碼的實(shí)現(xiàn),應(yīng)該拋開具體編程語言的束縛,集中精力分析我們要實(shí)現(xiàn)的軟件的業(yè)務(wù)邏輯,分析軟件的業(yè)務(wù)流程,思考應(yīng)該如何去描述和實(shí)現(xiàn)軟件的業(yè)務(wù)。畢竟軟件只是一個載體,業(yè)務(wù)才是我們真正要實(shí)現(xiàn)的目標(biāo)。但是在設(shè)計(jì)過程中,心里卻往往在擔(dān)心,如果我完全不去考慮程序代碼的實(shí)現(xiàn)的話,那么我怎么知道
11、我的設(shè)計(jì)一定合理呢?我怎么知道我設(shè)計(jì)的類、接口一定可以實(shí)現(xiàn)呢?所以經(jīng)??梢钥吹降默F(xiàn)象就是:在設(shè)計(jì)過程中,雖然知道不能過早考慮代碼實(shí)現(xiàn),但是每設(shè)計(jì)一個類,一個接口,心里都要不知不覺的用自己熟悉的編程語言大概的評估一下,看看能否編出來,因此,一不小心,就會又回到按照程序功能實(shí)現(xiàn)的思路進(jìn)行設(shè)計(jì)的老路上去了。舉個例子來說明,在做Web程序設(shè)計(jì)的時候,經(jīng)常要遇到分頁顯示數(shù)據(jù)的情況。比如說需要把系統(tǒng)中所有的用戶都列出來這樣的功能。假設(shè)使用User類來表示用戶,增加用戶addUser(),刪除用戶deleteUser(),查詢所有用戶listUsers()方法。而數(shù)據(jù)庫中有一個user表,一條記錄是一個用戶
12、的信息。下面考慮一下User類的方法的實(shí)現(xiàn):addUser()和deleteUser()方法都好實(shí)現(xiàn),就是對數(shù)據(jù)庫增加記錄和刪除記錄。對于listUsers()方法,其實(shí)就是對user表的select,取出一個記錄集。但是該怎么從listUsers()方法中得到所有用戶的列表呢?一個方法調(diào)用的返回值只有一個,沒有多個,所以很多情況下采用的辦法就是返回值定義為集合類型,比如Vector。這樣就可以在listUsers()方法的具體代碼實(shí)現(xiàn)的時候,從數(shù)據(jù)庫依次取出一個個記錄,插入到Vector里面來。在主程序里面,調(diào)用listUsers()方法可以返回一個Vector,然后再對Vector遍歷操作
13、,就可以得到用戶列表了。public class User public static void addUser(.) / 數(shù)據(jù)庫insert一條記錄public static void deleteUser(.) / 數(shù)據(jù)庫delete一條記錄public Vector listUsers(.) / 數(shù)據(jù)庫select結(jié)果放到一個集合里面這樣的設(shè)計(jì)基本合理,但是仍然有點(diǎn)小問題。因?yàn)樵谠O(shè)計(jì)的時候,就考慮到了用Java的集合類Vector來實(shí)現(xiàn)對不定長數(shù)據(jù)集的存放,因而違反了面向?qū)ο笤O(shè)計(jì)的一個原則:在設(shè)計(jì)的時候不應(yīng)過早的考慮具體程序語言的實(shí)現(xiàn)。所以必須用抽象的方法,和具體實(shí)現(xiàn)無關(guān)的方法來表達(dá)業(yè)務(wù)
14、邏輯。我們知道,通常對具有集合特征的數(shù)據(jù)結(jié)構(gòu)進(jìn)行遍歷通??梢允褂胣ext和hasNext方法,next實(shí)現(xiàn)取下一個用戶,hasNext判斷是否還有元素。 因此我們定義一個接口Iterator,這個接口中定義兩個方法next和hasNext:public interface Iterator public boolean hasNext() public Object next() 而User類的listUses方法返回值改為Iterator接口的實(shí)現(xiàn)類:public class User .public Iterator listUsers() .這樣就把User類的設(shè)計(jì)和具體的實(shí)現(xiàn)方法分離開
15、了,因?yàn)榇藭r任何實(shí)現(xiàn)了next()和hasNext()方法的類都可以做為listUsers的返回值,都可以被用來表達(dá)“用戶列表”,而不僅僅可以使用Vector而已。比如,我可以用ArrayList來表達(dá)用戶列表,因?yàn)锳rrayList也實(shí)現(xiàn)了Iterator,當(dāng)然我也可以自己專門寫一個類來存放用戶列表,只要實(shí)現(xiàn)next()和hasNext()方法就行了。這樣在具體的編寫代碼的時候,程序員具有了最大的靈活性,可以根據(jù)具體的情況,采用不同的編程方法來存放用戶列表。特別是降低了程序的耦合度,提高了程序的可移植性。對于上面那個JunkMail的listAllMail()方法也同樣應(yīng)該改為接口類型。然后,在主程序里面就這樣來使用User類的listUsers方法:User myUser = new User();Iterator iterator = myUser.listUsers();while (iterator.hasNext() iterator.next();這樣就可以完全不用考慮程序代碼實(shí)現(xiàn)了,從高層次上把功能抽象出來,定義成為接口,同時又可以把系統(tǒng)設(shè)計(jì)的很合理,完全根據(jù)業(yè)務(wù)的需求來進(jìn)行設(shè)計(jì)。結(jié)語通過上面的幾個例子的設(shè)計(jì)說明,使用面向?qū)ο蟮乃季S方法,其實(shí)是一個把業(yè)務(wù)邏輯從具體的編程技術(shù)當(dāng)中抽象出來的過程,而這個抽象的過程是自上而下的,非常符合人類的思維習(xí)慣,也就是先不考
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 校園綜合評定系統(tǒng)科技與教育的結(jié)合
- 未來網(wǎng)絡(luò)直播銷售趨勢及前景展望
- 校園文化傳承塑造大學(xué)精神
- 現(xiàn)代綠色建筑的施工技術(shù)與質(zhì)量控制研究報告
- 現(xiàn)代企業(yè)年度報告的策劃與制作
- 《釘子板上的多邊形》(說課稿)-2024-2025學(xué)年五年級上冊數(shù)學(xué)蘇教版
- 《Module 7 Unit 2 This little girl can't walk.》(說課稿)-2024-2025學(xué)年外研版(三起)英語五年級上冊
- Unit 2 My week Part B Lets talk Lets learn大單元整體說課稿表格式-2024-2025學(xué)年人教PEP版英語五年級上冊
- 深入探索紅旅旅游中的文化傳承與教育功能
- 班級家長會的流程優(yōu)化與時間管理
- 電網(wǎng)工程設(shè)備材料信息參考價(2024年第四季度)
- 2025年江蘇農(nóng)牧科技職業(yè)學(xué)院高職單招職業(yè)技能測試近5年??及鎱⒖碱}庫含答案解析
- 2025江蘇連云港市贛榆城市建設(shè)發(fā)展集團(tuán)限公司招聘工作人員15人高頻重點(diǎn)提升(共500題)附帶答案詳解
- 江蘇省揚(yáng)州市蔣王小學(xué)2023~2024年五年級上學(xué)期英語期末試卷(含答案無聽力原文無音頻)
- 數(shù)學(xué)-湖南省新高考教學(xué)教研聯(lián)盟(長郡二十校聯(lián)盟)2024-2025學(xué)年2025屆高三上學(xué)期第一次預(yù)熱演練試題和答案
- 決勝中層:中層管理者的九項(xiàng)修煉-記錄
- 《港珠澳大橋演講》課件
- 《有機(jī)化學(xué)》課件-第十章 羧酸及其衍生物
- 人教版道德與法治五年級下冊《第一單元 我們一家人》大單元整體教學(xué)設(shè)計(jì)2022課標(biāo)
- 2024年海南公務(wù)員考試申論試題(A卷)
- 中醫(yī)培訓(xùn)課件:《經(jīng)穴推拿術(shù)》
評論
0/150
提交評論