引言:本文旨在提供讀者制作一個(gè)自己的聚合sdk的思路,拋磚引玉,讓更多的讀者對(duì)聚合sdk有好的理解。
在上一篇《TypeSDK總體思路和架構(gòu)》中,簡(jiǎn)述了一個(gè)聚合sdk,需要哪些模塊,實(shí)現(xiàn)哪些功能,模塊之間的相互關(guān)系是怎么樣的。
有了基本思路和架構(gòu),那么任何一個(gè)程序一個(gè)解決方案,都會(huì)有一個(gè)基本的設(shè)計(jì)原則。作為聚合sdk,我們要秉承哪些基本原則呢。
1.和游戲項(xiàng)目的低耦合性
2.聚合sdk具有易用性
3.具有較強(qiáng)的拓展性
1.先來(lái)探討怎么去做低耦合性。
作為聚合sdk,最直接需要面對(duì)的問(wèn)題就是跨平臺(tái)問(wèn)題。我們要先有一個(gè)概念,那就是游戲的開(kāi)發(fā)平臺(tái)以及游戲的發(fā)型平臺(tái)是完全不同的。游戲的開(kāi)發(fā)平臺(tái),是指游戲用什么語(yǔ)言,在什么樣的生產(chǎn)環(huán)境開(kāi)發(fā)。游戲的發(fā)行平臺(tái),指的是游戲在什么樣的終端上運(yùn)行。
移動(dòng)游戲主要的發(fā)布平臺(tái)是iOS、安卓?jī)纱笃脚_(tái),windows phone占有量太小,國(guó)內(nèi)幾乎沒(méi)有發(fā)行渠道。
游戲主流開(kāi)發(fā)平臺(tái)包括了unity、cocos2dx。而使用原生安卓和ios用來(lái)開(kāi)發(fā)軟件的相對(duì)多。鑒于以上這些我們將原生Android和ios作為發(fā)布基礎(chǔ),并正對(duì)unity和cocos2dx提供開(kāi)發(fā)封裝。
實(shí)現(xiàn)的邏輯關(guān)系如下:
1. 作為游戲的開(kāi)發(fā)者,在游戲客戶端層面,只需要關(guān)注開(kāi)發(fā)平臺(tái)的sdk接口調(diào)用邏輯,而不用關(guān)心sdk接口的實(shí)現(xiàn)邏輯。Sdk接口的申明,由typesdk提供的typesdkclient部分給出
2. 作為聚合sdk接入層,接入各大渠道自己的sdk代碼實(shí)現(xiàn)部分,即各大發(fā)布平臺(tái)的實(shí)現(xiàn)層,只需要在typesdk的框架下,實(shí)現(xiàn)各個(gè)邏輯接口的功能,而不用關(guān)心具體是誰(shuí)去調(diào)用,是怎么調(diào)用的。
3. 而開(kāi)發(fā)平臺(tái)的接口申明,發(fā)布平臺(tái)的統(tǒng)一接口的規(guī)范,這一整套,就是聚合sdk客戶端部分的主要框架。
4. 接口的調(diào)用,和接口的實(shí)現(xiàn)完全的分離,實(shí)現(xiàn)了游戲邏輯代碼和渠道sdk的解耦。整個(gè)聚合sdk體系相互獨(dú)立,又相互有關(guān),使得整體的功能實(shí)現(xiàn),可以達(dá)到模塊化,功能化,區(qū)分話的目的。讓整個(gè)項(xiàng)目可以由多人共同開(kāi)發(fā),大大提高開(kāi)發(fā)進(jìn)度。
2.如何做聚合sdk具有易用性
人們都愛(ài)和簡(jiǎn)單的人相處,人們也愛(ài)使用簡(jiǎn)易容易上手的東西。iphone的成功,其中有一點(diǎn)那就是其外觀的簡(jiǎn)潔,其系統(tǒng)的易于理解。
聚合SDK使用對(duì)象有兩類,1.
說(shuō)到簡(jiǎn)單,不得不提及一個(gè)和簡(jiǎn)單有關(guān)的詞,統(tǒng)一,凡事簡(jiǎn)單的事物,都能讓用戶很快的形成統(tǒng)一的使用習(xí)慣。那么從代碼設(shè)計(jì)上來(lái)說(shuō),統(tǒng)一中最具有代表性的就是,程序中的單例模式。
我們?cè)O(shè)計(jì)一個(gè)單利的類(TypeSDKClass),讓用戶的一切接口調(diào)用,回調(diào)函數(shù)接收,事件處理等等事物,都從這一個(gè)入口出發(fā),也只從這一個(gè)入口導(dǎo)出,其內(nèi)部結(jié)構(gòu)無(wú)論如何復(fù)雜,用戶不需要關(guān)心。他們只要記得,我想做一件事,我找到那個(gè)單例TypeSDKClass 從他提供的方法和需要實(shí)現(xiàn)的回調(diào)中,都能滿足我的需求就行。
并且,這個(gè)單例對(duì)象TypeSDKClass 不需要關(guān)心他如何創(chuàng)建,如何銷毀,只需要我想用的時(shí)候,隨時(shí)隨地能用。
有了單例對(duì)象為主體,在程序設(shè)計(jì)中,不可避免的是數(shù)據(jù)傳遞。
最易用的易懂的數(shù)據(jù)結(jié)構(gòu),hashmap類應(yīng)該算其中之一。我們程序提供接口中傳遞的參數(shù),使用的數(shù)據(jù)結(jié)構(gòu)是一個(gè)經(jīng)過(guò)包裝過(guò)的hashmap,有一套容易理解的通過(guò)key來(lái)存取對(duì)應(yīng)的value值。
用戶并不需要關(guān)心這個(gè)數(shù)據(jù)結(jié)構(gòu)在跨平臺(tái)傳遞時(shí)候是如何工作的,只需要在使用的時(shí)候感覺(jué)容易理解,容易使用。
3.我們來(lái)說(shuō)說(shuō)拓展性
各大渠道的sdk都是發(fā)展的,各大發(fā)行平臺(tái)同樣也是在不斷發(fā)展的,安卓從2.0已經(jīng)成了現(xiàn)在的7.1,ios保持著一年一個(gè)大版本的穩(wěn)定節(jié)奏,新老版本的更替,部分老的接口被棄用,部分新的接口被啟用。更多的情況是,有了新的功能,來(lái)提升游戲的體驗(yàn)性和功能性。
作為我們的聚合sdk,要能保持與時(shí)俱進(jìn),才能不斷綻放新的生命活力。而與時(shí)俱進(jìn)最好的辦法就是具有很強(qiáng)大的拓展性。
我們?cè)谟螒虻陌l(fā)布平臺(tái),需要設(shè)計(jì)一個(gè)接口,該接口可以通過(guò)函數(shù)名來(lái)調(diào)用指定的函數(shù),而該函數(shù)的參數(shù),也需要是string類型。這樣一來(lái)有幾個(gè)優(yōu)勢(shì)。
1.函數(shù)名是string類型,接入聚合sdk的cp并不需要重新的更新開(kāi)發(fā)平臺(tái)(unity或者coco2dx)的聚合sdk部分,只需要新增幾個(gè)string字段就能調(diào)用函數(shù)
2.參數(shù)是string類型,那就是可以把我們之前的hashmap類型數(shù)據(jù)轉(zhuǎn)成string類型的json,既有了通用型,也不乏豐富性。
3.通過(guò)string類型函數(shù)名來(lái)執(zhí)行函數(shù),哪怕該函數(shù)不存在(例如運(yùn)行設(shè)備版本過(guò)低,并不支持該功能),我們可以在發(fā)布平臺(tái)層面,做相應(yīng)的邏輯處理,而不會(huì)造成游戲的崩潰。
4.不論以后會(huì)有多少新的功能出現(xiàn),我們做到了以不變應(yīng)萬(wàn)變。一招鮮吃遍天。我們只需要不斷的在運(yùn)行平臺(tái)的實(shí)現(xiàn)接口層面不斷的新增新功能接口的實(shí)現(xiàn),就可以做到,在游戲客戶端部分,隨時(shí)隨地的使用到我們支持的新功能。
以上這些是博主對(duì)一套聚合sdk設(shè)計(jì)中,需要秉承的一些原則的看法,當(dāng)然肯定還有其他的原則,比如代碼規(guī)范中的hasmap數(shù)據(jù)結(jié)構(gòu)類型的key值是string類型,而string類型的內(nèi)容,要有統(tǒng)一的命名規(guī)則,這樣可以避免因?yàn)闀鴮懙腻e(cuò)誤,造成數(shù)據(jù)操作的bug。
博主拋磚引玉,希望更多的讀者不吝言辭,可以提出你們的看法和建議。
在下一篇,我們會(huì)主要講解發(fā)行平臺(tái)層面(安卓和ios)的聚合sdk實(shí)現(xiàn)詳細(xì)思路和結(jié)構(gòu)。讓大家都能對(duì)聚合sdk有自己的看法和理解,最終能做出屬于你自己的聚合sdk。
這個(gè)項(xiàng)目已開(kāi)源,大家有興趣可以自己研究或者參照項(xiàng)目編寫自己的聚合SDK
項(xiàng)目地址:https://code.csdn.net/typesdk_code
項(xiàng)目地址:https://github.com/typesdk
更多建議: