項(xiàng)目經(jīng)驗(yàn)總結(jié) —— 簡(jiǎn)易新聞?wù)?/h1>

? ? ? ??歷時(shí)一個(gè)月,終于完成了這個(gè)練手項(xiàng)目,這個(gè)完整的項(xiàng)目讓我對(duì)原生 php、js、前后端交互有了更多的認(rèn)識(shí),首先是對(duì) DOM 熟練了很多(畢竟寫 js 時(shí)大多數(shù)情況要么是操作 DOM 節(jié)點(diǎn)要么是綁定 DOM 事件,想不熟練都難),然后是熟悉了 js 的 ajax 擴(kuò)展 XMLHttpRequest,不刷新頁(yè)面的交互目前我只能用它完成,另外,由于整個(gè)系統(tǒng)是由我自己經(jīng)過(guò)思考總結(jié)設(shè)計(jì)出來(lái)的,基本是摸著石頭過(guò)河,過(guò)程中頻繁踩坑,因此也就對(duì)系統(tǒng)級(jí)設(shè)計(jì)有了一點(diǎn)自己的初步認(rèn)識(shí),最后的一點(diǎn)感受是,我覺得前端并不比后端簡(jiǎn)單,事實(shí)上就這個(gè)項(xiàng)目來(lái)說(shuō),我的前端純 js 代碼量比后臺(tái)純 php 少不了多少,純展示的頁(yè)面還好,后臺(tái)系統(tǒng)的管理頁(yè)面需要添加的各種事件就比較多了,各種事件的嵌套、監(jiān)聽關(guān)系比起我后端寫的 php 來(lái)一點(diǎn)都不簡(jiǎn)單,所以要說(shuō)簡(jiǎn)單也頂多只能說(shuō)前端切靜態(tài)頁(yè)簡(jiǎn)單,而切圖本就是前端最基本的技能,復(fù)雜點(diǎn)的交互頁(yè)面做起來(lái)可一點(diǎn)都不比后端簡(jiǎn)單,所以我認(rèn)為主要是看業(yè)務(wù)吧,要談前后端誰(shuí)更復(fù)雜應(yīng)該是特定于某個(gè)業(yè)務(wù)的,有些業(yè)務(wù)前端復(fù)雜,有些業(yè)務(wù)后端復(fù)雜,不能籠統(tǒng)的說(shuō)前端比后端簡(jiǎn)單。
簡(jiǎn)要說(shuō)下項(xiàng)目,該項(xiàng)目是用純?cè)a實(shí)現(xiàn)的,沒(méi)有套用任何框架,包括模版引擎之類的都沒(méi)有使用,是個(gè)較為簡(jiǎn)陋的新聞?wù)?,除?shí)現(xiàn)了必要的增刪改查和新聞呈現(xiàn)外,還實(shí)現(xiàn)了簡(jiǎn)單的用戶系統(tǒng)、評(píng)論系統(tǒng)、專題系統(tǒng)、懶加載、數(shù)據(jù)統(tǒng)計(jì)等,雖然使用的是純?cè)?,但各部分代碼是完全分離的,即 HTML、CSS、JS、PHP 文件都是各自分開存放的。項(xiàng)目后臺(tái)響應(yīng)數(shù)據(jù)時(shí)采用了 index.php 處理所有數(shù)據(jù)的方式,這樣做的目的是為了提高網(wǎng)站的安全性,網(wǎng)站內(nèi)部結(jié)構(gòu)不會(huì)直接暴露出來(lái),在使用這種機(jī)制后,我能想到的只有頁(yè)面中少數(shù)幾個(gè)引用資源的地方會(huì)暴露一些結(jié)構(gòu)出來(lái),其余大部分內(nèi)部結(jié)構(gòu)都被隱藏掉了。
總的來(lái)說(shuō)這次項(xiàng)目很不輕松,畢竟這還是我第一次從頭到腳的實(shí)現(xiàn)整個(gè)網(wǎng)站系統(tǒng)(現(xiàn)在覺得從前寫過(guò)的幾個(gè)小靜態(tài)站、信息管理系統(tǒng)簡(jiǎn)直是過(guò)家家),沒(méi)任何人告訴我項(xiàng)目的業(yè)務(wù)流程是什么樣的、數(shù)據(jù)庫(kù)結(jié)構(gòu)該如何設(shè)計(jì)、各個(gè)模塊該如何實(shí)現(xiàn)、前后端該如何交互,甚至連需求都得靠我自己想,測(cè)試也得自己做 …… 我應(yīng)對(duì)的辦法就是一個(gè)人冥想苦思、百度、翻書,好在我還算有一點(diǎn)算法的底子(現(xiàn)在覺得算法是真的鍛煉人啊,益處太多),這些最終都扛了下來(lái),不過(guò)雖然預(yù)期功能大都實(shí)現(xiàn)了,但自我感覺代碼寫的并不到位,甚至很多地方自己都覺得寫的很爛,不過(guò)造成這些的原因并不在于算法上,也不在于某個(gè)模塊的實(shí)現(xiàn)上,畢竟這個(gè)項(xiàng)目中涉及到的大都是些簡(jiǎn)單數(shù)據(jù)處理,在我看來(lái)是相對(duì)輕松的事。
真正的難點(diǎn)在于對(duì)整個(gè)系統(tǒng)的布局把控,每當(dāng)有一個(gè)部位寫的不易銜接、可擴(kuò)展性不強(qiáng),就容易導(dǎo)致其它部位跟著遷就,而遷就多了就容易造成整個(gè)項(xiàng)目代碼冗余、邏輯難懂、難以維護(hù),例如最基礎(chǔ)的 HTML 標(biāo)簽嵌套、id、class 的分配就嚴(yán)重關(guān)系到 js、css 的書寫,可以說(shuō)把 HTML 做好是寫好 js、css 的基礎(chǔ)。后端 php 倒是不怎么受前端那三樣的影響,php 的書寫主要是受制于整個(gè)系統(tǒng)的運(yùn)作,尤其重要的是數(shù)據(jù)庫(kù)設(shè)計(jì),數(shù)據(jù)庫(kù)設(shè)計(jì)的好壞直接決定了存取數(shù)據(jù)是否繁瑣、功能實(shí)現(xiàn)是否方便,其次才是前后端交互方面的問(wèn)題,比如 cookie、session、跨域等。其實(shí)往大了看,無(wú)論前端、后端,很大一部分考驗(yàn)的都是對(duì)實(shí)際問(wèn)題抽象化的能力,例如 HTML 標(biāo)簽嵌套、id、class 這些就是對(duì)頁(yè)面布局的抽象,而數(shù)據(jù)庫(kù)結(jié)構(gòu)的設(shè)計(jì)是對(duì)業(yè)務(wù)邏輯的抽象,整個(gè)系統(tǒng)便是由前、后端等各模塊的抽象層所共同組合而成的一個(gè)大抽象層(或許設(shè)計(jì)模式研究的就是這個(gè)?),雖然有時(shí)這個(gè)大抽象層做的好,代碼實(shí)現(xiàn)難度反而會(huì)提高一些,但這對(duì)整個(gè)系統(tǒng)的運(yùn)作卻是有好處的,關(guān)于這個(gè)問(wèn)題,我的觀點(diǎn)是:在實(shí)現(xiàn)難度允許的范圍內(nèi),應(yīng)盡量將抽象層做的更完善一些,可擴(kuò)展性更強(qiáng)一些。
這個(gè)項(xiàng)目我是邊做邊想的,其實(shí)這完全不對(duì),起碼對(duì)做一個(gè)系統(tǒng)來(lái)說(shuō),在實(shí)操前就應(yīng)該將整個(gè)系統(tǒng)的抽象層設(shè)計(jì)好,而且是設(shè)計(jì)的越細(xì)越好,這樣在實(shí)現(xiàn)整個(gè)系統(tǒng)時(shí)便不容易出差錯(cuò)。最后,在真正開始代碼實(shí)現(xiàn)時(shí),要循序漸進(jìn),先搭建項(xiàng)目整體的大框架,然后一層一層的向內(nèi)推進(jìn)實(shí)現(xiàn)細(xì)節(jié),而不是先將一個(gè)模塊全部做完,再做另一個(gè)模塊,這樣可以及早發(fā)現(xiàn)問(wèn)題,降低模塊間出現(xiàn)不協(xié)調(diào)的概率。
其實(shí)做到后面我想改的東西很多,比如加上天氣預(yù)報(bào)、后臺(tái)的富文本編輯或其它一些功能,并且原有功能也做的不夠細(xì)致,但想想還是算了,時(shí)間不允許,如果現(xiàn)在將這個(gè)項(xiàng)目再推倒重來(lái),我有自信在十多天內(nèi)將數(shù)據(jù)庫(kù)設(shè)計(jì)的更好,代碼寫的更加精煉,功能更加完善,頁(yè)面更加美觀。但我不這么做,因?yàn)槲也幌朐僭谒砩侠速M(fèi)時(shí)間了,這實(shí)在太花時(shí)間了,它已經(jīng)用掉了我整整一個(gè)月時(shí)間,這是遠(yuǎn)超出我預(yù)期的,我原本的預(yù)計(jì)是最多在一周內(nèi)搞定,所以就這樣吧,讓它留下來(lái),也許以后偶爾會(huì)回來(lái)看看從前寫的屎代碼。
目前我的原生已經(jīng)算是有些基礎(chǔ)了,接下來(lái)我需要開始接觸框架,并且算法、網(wǎng)絡(luò)、linux 這些也都要跟上,時(shí)間緊迫。