對(duì)于一個(gè)代碼小白來說,想要實(shí)現(xiàn)一個(gè)項(xiàng)目的具體功能,可能最先想到的方法是面向過程的,但從一個(gè)優(yōu)秀的代碼看來,面向?qū)ο蟮乃枷胧侵陵P(guān)重要、不可或缺的。從面向過程到面向?qū)ο笏季S的轉(zhuǎn)化與學(xué)習(xí)需要一定的時(shí)間與積累。
今天小編就帶大家一起來學(xué)習(xí)一個(gè)以面向?qū)ο笏季S來實(shí)現(xiàn)的具體小功能——游戲登陸。
首先我們要了解什么是面向?qū)ο螅?/em>
面向對(duì)象(Object Oriented)是軟件開發(fā)方法,一種編程范式。面向對(duì)象的概念和應(yīng)用已超越了程序設(shè)計(jì)和軟件開發(fā),擴(kuò)展到如數(shù)據(jù)庫(kù)系統(tǒng)、交互式界面、應(yīng)用結(jié)構(gòu)、應(yīng)用平臺(tái)、分布式系統(tǒng)、網(wǎng)絡(luò)管理結(jié)構(gòu)、CAD技術(shù)、人工智能等領(lǐng)域。面向?qū)ο笫且环N對(duì)現(xiàn)實(shí)世界理解和抽象的方法,是計(jì)算機(jī)編程技術(shù)發(fā)展到一定階段后的產(chǎn)物。
面向?qū)ο笫窍鄬?duì)于面向過程來講的,面向?qū)ο蠓椒?/a>,把相關(guān)的數(shù)據(jù)和方法組織為一個(gè)整體來看待,從更高的層次來進(jìn)行系統(tǒng)建模,更貼近事物的自然運(yùn)行模式。
面向?qū)ο笠还灿兴膫€(gè)特性,及:對(duì)象唯一性、抽象性、繼承性、多態(tài)性
故名思意,面向?qū)ο髮?shí)現(xiàn)解決的是代碼的可移植性以及可多方運(yùn)用性,相較于面向過程冗雜而不可移植的缺點(diǎn)來說大大提高了代碼的可讀、簡(jiǎn)便性。讓基礎(chǔ)性的代碼加以組合靈活應(yīng)用分配對(duì)應(yīng)到不同對(duì)象上實(shí)現(xiàn)不同對(duì)象的功能,提高了程序效率,也給開發(fā)帶來了更加廣闊的平臺(tái)。
項(xiàng)目實(shí)訓(xùn)——游戲登陸(Login)
了解了面向?qū)ο蟮闹匾院?,接下來我們將以一個(gè)小項(xiàng)目的完成來具體體現(xiàn)面向?qū)ο蟮乃季S,感受面向?qū)ο蟮拿钐帯?/em>
一、程序分析
回到寫程序,第一步就是程序分析,以面向?qū)ο蟮乃季S的角度來入手,分析整理部分大致可分為以下幾個(gè)步驟:理清功能、找對(duì)象->抽類、理清各個(gè)類中要實(shí)現(xiàn)的具體功能、畫時(shí)序圖與類圖
接下來我們就來一一實(shí)現(xiàn)
(1)理清功能
實(shí)現(xiàn)游戲登陸,即是玩家來到登錄頁面出入賬號(hào)信息,檢驗(yàn)賬號(hào)信息是否正確,顯示登陸結(jié)果成功或失敗
(2)找對(duì)象->抽類
用戶前來登陸——存放用戶信息(User)
來到游戲大廳登陸——游戲大廳類(GaneCenter)
賬號(hào)信息的輸入與系統(tǒng)提示——終端類(Console)
云端檢測(cè)賬號(hào)信息——服務(wù)器類(Serive)
儲(chǔ)存正確賬號(hào)信息——常量類(Constants)
(3)理清各個(gè)類中要實(shí)現(xiàn)的具體功能
首先作為玩家來到游戲大廳,第一步實(shí)現(xiàn)登陸功能,需要用戶通過終端先輸入自己的相關(guān)信息,得到輸入的信息后來到服務(wù)器檢測(cè)賬號(hào)信息是否正確,此時(shí)服務(wù)器就需要拿出從原有儲(chǔ)存好的賬號(hào)信息來與輸入的信息對(duì)比,如果相同,則輸入正確,登陸成功,如果不相同則輸入不正確,登陸失敗。最后將結(jié)果返回到游戲大廳,才算完成整個(gè)登陸的過程。
(4)畫時(shí)序圖與類圖
接下來即可根據(jù)各個(gè)類之間的關(guān)系來畫時(shí)序圖,時(shí)序圖如下:

時(shí)序圖能幫助我們理清功能的先后順序,方便寫代碼時(shí)參考。
二、寫代碼
根據(jù)分好的各個(gè)類來分別寫出各個(gè)類要實(shí)現(xiàn)的功能
首先是用戶類(User),存放輸入用戶的信息
data class User(val name:String,val password:String)
游戲大廳類(GameCenter)
class GameCenter {
lateinit var user:User
lateinit var game:IGame
// game as HappyPokerGame 可以將父類轉(zhuǎn)換為子類
fun login(){
while (true){
"請(qǐng)輸入用戶名".show()
val name= getDate()
"請(qǐng)輸入密碼".show()
val password= getDate()
// 檢測(cè)用戶是否存在
val result=Server.checkUser(name,password)
if (result){
"登錄成功".showWithEnter()
user= User(name, password)
// 如果成功就初始化創(chuàng)建實(shí)例User
break
}else{
"用戶名或密碼錯(cuò)誤,請(qǐng)重新登錄".show()
}
}
}
}
終端(Consulo類)實(shí)現(xiàn)輸入輸出的封裝,作為一個(gè)工具類,因此不需要以類來封裝,寫在一個(gè)文件里,作為頂層函數(shù)靜態(tài)方法來使用
fun getDate():String= readLine()!!
fun String.show()= print(this)
//實(shí)例對(duì)象方法,可用this,一句話實(shí)現(xiàn)直接等號(hào)
fun String.showWithEnter()= println(this)
服務(wù)器類(Server),提供檢驗(yàn)方法,并向GameCenter類傳回一個(gè)結(jié)果值
class Server(){
companion object{
// 檢測(cè)用戶密碼是否正確
fun checkUser(name:String,pwd:String):Boolean{
return name== DEFAULT_NAME && pwd== DEFAULT_PASSWORD
}
}
}
常量類(Constants),儲(chǔ)存正確賬號(hào)信息等一系列常量,同理與Consule一樣,作為頂層函數(shù)供全局使用不需要類來封裝
const val DEFAULT_NAME="jake"
const val DEFAULT_PASSWORD="123"
這樣就實(shí)現(xiàn)了通過多個(gè)類來共同實(shí)現(xiàn)登陸功能,各個(gè)部分各司其職,相互作用又相互獨(dú)立,實(shí)現(xiàn)了封裝也對(duì)繼續(xù)開發(fā)提供了便捷易用的基臺(tái)
運(yùn)行截圖如下:

當(dāng)然啦,以上代碼順序是根據(jù)時(shí)序圖任務(wù)步驟的先后順序來排列的,但在我們真實(shí)寫代碼時(shí)的順序一般是倒著來的,從內(nèi)容(箭頭)最少的部分寫起,這樣從小往上堆,簡(jiǎn)單明了也更好上手
三、小結(jié)
從小程序來分析,面向?qū)ο蟮乃季S讓我們實(shí)現(xiàn)了類的功能板塊化,雖然運(yùn)用到的許多類,卻能十分清晰的展現(xiàn)出各個(gè)部分要完成的具體 功能,各司其職,相互作用又相互獨(dú)立。不難發(fā)現(xiàn),在此基礎(chǔ)上還能對(duì)程序的功能進(jìn)行更多的擴(kuò)展,讓多功能或多協(xié)作成為簡(jiǎn)單而易上手的事,這就是面向?qū)ο蠛苊畹牡胤健?/p>
今天就學(xué)到這里啦,路漫漫其修遠(yuǎn)兮,我們一同加油~