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