Shark提供的其它卓越特性包括:
事務(wù);時(shí)間模型;列級(jí)加密;支持批處理操作;對(duì)象域,支持對(duì)對(duì)象管理方式的控制。為對(duì)Shark具有更深的了解,InfoQ與Herridge進(jìn)行了如下訪談。
你是如何實(shí)現(xiàn)從DBAccess項(xiàng)目向Shark項(xiàng)目的轉(zhuǎn)變的?
“我們想要開(kāi)源DBAccess的動(dòng)機(jī),純粹因?yàn)槲覀冎挥杏邢薜拈_(kāi)發(fā)時(shí)間。越來(lái)越多的開(kāi)發(fā)人員聯(lián)系到我們,并提出在DBAccess項(xiàng)目中添加一些新特性的需求。這些特性我們認(rèn)為是完全合理的,但是在項(xiàng)目之初并未被我們所考慮到。鑒于項(xiàng)目主版本的開(kāi)發(fā)已經(jīng)作為一個(gè)階段而結(jié)束了,并且該主版本已對(duì)我們的所有項(xiàng)目可用了,因此對(duì)于項(xiàng)目改進(jìn)工作我們只能分配很少的時(shí)間,而且這些改進(jìn)對(duì)于我們的產(chǎn)品而言并沒(méi)有任何明顯的收益。當(dāng)前,已有一個(gè)足夠規(guī)模的社區(qū)愿意為該項(xiàng)目做出貢獻(xiàn)。相對(duì)于原項(xiàng)目,我們希望能向更好的方向推進(jìn)該產(chǎn)品。自開(kāi)源項(xiàng)目發(fā)布以來(lái),我可每周花費(fèi)至少8個(gè)小時(shí)在其中,當(dāng)前對(duì)項(xiàng)目的服務(wù)支持請(qǐng)求已經(jīng)顯著減少了。
但是我們無(wú)法獲準(zhǔn)去發(fā)布我們已經(jīng)編寫好的代碼。因而在與我們的CEO討論之后,我們確定了一個(gè)合適的變通方案,就是重寫該ORM的代碼,并給予新項(xiàng)目一個(gè)完全不同的名字。就這樣代碼重寫工作啟動(dòng)了。起始我們將原始代碼拿來(lái)并重構(gòu)到不同的源文件中,這使得代碼更加模塊化。然后對(duì)于代碼中相對(duì)復(fù)雜的部分,我們將這些部分從源代碼中剝離出來(lái),并在稍后的工作中對(duì)這些部分進(jìn)行重寫(例如查詢緩存管理器和共享內(nèi)存系統(tǒng))。令我們失望的是,這樣做的結(jié)果對(duì)性能改進(jìn)甚微。
其后,當(dāng)我們已完成了代碼庫(kù)重構(gòu),就開(kāi)始重寫每個(gè)函數(shù),并使其與原函數(shù)的代碼完全不同。這個(gè)工作看上去是對(duì)每個(gè)人的個(gè)人時(shí)間的一種浪費(fèi),但這樣做是十分必要,這使得Shark項(xiàng)目與原始項(xiàng)目完全不同,避免了將來(lái)可能導(dǎo)致的任何問(wèn)題。但是在工作復(fù)審時(shí),我們發(fā)現(xiàn)相對(duì)于原來(lái)的代碼庫(kù),新項(xiàng)目依然存在著一些細(xì)微的相似之處。注意這里我說(shuō)的不是一樣,而是相似。進(jìn)而我們做了更進(jìn)一步的協(xié)同開(kāi)發(fā),去實(shí)現(xiàn)代碼的模塊化,以及有易于二次開(kāi)發(fā)的代碼分割。大約在此后一年,盡管還是存在相似之處,新項(xiàng)目已經(jīng)成為了一個(gè)完全不同的代碼庫(kù)。我們已具有了持續(xù)測(cè)試新方法輸入輸出的能力,可確保項(xiàng)目的完整性及與DBAccess的兼容性。”
為什么沒(méi)有選擇Swift?
“這個(gè)問(wèn)題很難回答。Swift很明顯是未來(lái)的發(fā)展方向,并且Swift具有足夠豐富的特性去完成一個(gè)開(kāi)發(fā)任務(wù)。但溯本追源,DBAccess需要是靜態(tài)庫(kù),這使得如有必要App可以向后兼容到在iOS6上使用。
在我們啟動(dòng)項(xiàng)目移植時(shí),且就我當(dāng)時(shí)所知,Swift是不能被包含在靜態(tài)庫(kù)中的。但是這個(gè)原因與我們沒(méi)有選擇Swift是毫不相關(guān)的。因?yàn)槲覀儺?dāng)時(shí)還達(dá)成一個(gè)共識(shí),就是開(kāi)發(fā)中只是去使用XCode 7提供的項(xiàng)目模板,而避免去“破解”使用框架所提供的對(duì)象。這里XCode模版是生成面向iOS 8及以上版本的動(dòng)態(tài)框架。
該做法中仍然存在的問(wèn)題是,如果項(xiàng)目是用Swift編寫的話,那么Objective-C對(duì)象就不能繼承于Swift基礎(chǔ)類,該基礎(chǔ)類從本質(zhì)而言在我們的項(xiàng)目開(kāi)發(fā)中是無(wú)法回避的。
現(xiàn)在代碼庫(kù)已經(jīng)很好地重構(gòu)了,我們也面對(duì)用Swift編寫其中大部分,并最終整個(gè)代碼庫(kù)的工作,尤其是考慮到Swift已經(jīng)是很明顯是可取的發(fā)展趨勢(shì)。當(dāng)前我們已在頂層Swift對(duì)象實(shí)現(xiàn)上啟動(dòng)了工作,以啟用對(duì)所有Swift標(biāo)準(zhǔn)數(shù)據(jù)類型的持久化。”
與DBAccess項(xiàng)目相比,Shark當(dāng)前的成熟度如何?
“由于Shark采用了按函數(shù)依次遷移和模塊化的方法構(gòu)建,我們可對(duì)其進(jìn)行持續(xù)測(cè)試,整個(gè)代碼庫(kù)很少處于不可編譯的狀態(tài)。考慮到Shark項(xiàng)目是基于前期已構(gòu)建的代碼,并且實(shí)現(xiàn)了覆蓋面更廣的測(cè)試,雖然它是一個(gè)新的項(xiàng)目,但是在很多方面比原DBAccess項(xiàng)目更加可靠。Shark已在文檔上比DBAceess更進(jìn)一步,并且我們正盡可能地對(duì)其所有的特性給出更多的例子程序,更加清晰的用法。”
在Shark中,還有哪些你想要強(qiáng)調(diào)的高級(jí)功能嗎?
"對(duì)象域管理系統(tǒng)是Shark的一個(gè)高級(jí)特性。一般情況下,所有對(duì)象是各自獨(dú)立的,并且保存在不同的內(nèi)存空間中,因而對(duì)一個(gè)實(shí)體的實(shí)例所產(chǎn)生的改變只能作用于單一對(duì)象上,不能跨越到其它實(shí)例中。我們發(fā)現(xiàn)在我們的應(yīng)用開(kāi)發(fā)中,通常情況下這種經(jīng)深思熟慮的設(shè)計(jì)決是十分有用的。但是在簡(jiǎn)單添加了對(duì)象域管理功能后,與被改變實(shí)例在相同域中的實(shí)例就可同時(shí)發(fā)生改變。域僅是一個(gè)字符串值,可在任何時(shí)候發(fā)生改變,這樣設(shè)計(jì)的強(qiáng)大之處在于,當(dāng)一個(gè)網(wǎng)絡(luò)線程完成后,為實(shí)現(xiàn)對(duì)綁定控制的更新而更改其原有的網(wǎng)絡(luò)域?yàn)橛脩艚缑嬗驎r(shí),你可以同時(shí)擁有對(duì)包含有對(duì)象的網(wǎng)絡(luò)域和用戶界面域的控制。
優(yōu)化是Shark ORM的另一個(gè)關(guān)鍵特性;我們具有用于查詢優(yōu)化的常規(guī)工具。為實(shí)現(xiàn)更快的數(shù)據(jù)集檢索,可添加索引以及COUNT、SUM和DISTINCT操作到任何類中。為減少查詢時(shí)間并降低內(nèi)存使用,可使用限制查詢中檢索到的屬性個(gè)數(shù)的功能。這樣其余的屬性值可不急于進(jìn)行加載,直至有必要之時(shí)。為允許在開(kāi)發(fā)中截?cái)嗦牟樵儯⒉榭床樵冇?jì)劃,可添加委派代理的方法。這樣開(kāi)發(fā)人員可以調(diào)整和估量任何已做改進(jìn)的情況。”