Katana Guidelines

本文檔收集了這些年來我們使用Katana定義的最佳實(shí)踐和準(zhǔn)則。

目標(biāo)

指導(dǎo)方針

1.使用管理器封裝邏輯

2.事件觀察者

3.避免復(fù)雜的副作用

4.利用封裝起愈,模塊化和可見性修改器

5.文件

6.項(xiàng)目文件結(jié)構(gòu)

項(xiàng)目中定義和共享準(zhǔn)則和最佳實(shí)踐的優(yōu)點(diǎn):

1. 當(dāng)做一件事有多種相同的方法時(shí)塔嬉,選擇一種方法并保持一致可以讓每個(gè)人立即了解事情是如何工作的,以及如何向應(yīng)用程序或庫(kù)引入更改,即使他們并不熟悉代碼庫(kù)。

2.?通過遵循共享的模式,我們可以在假設(shè)某些事情是以特定的方式完成的情況下實(shí)現(xiàn)工具恭取。

3.?在審查Pull請(qǐng)求時(shí),可以利用指導(dǎo)方針來提供有效的反饋熄守。

4.指南所保留的統(tǒng)一的書面知識(shí)蜈垮,新手們可以領(lǐng)先一步。


Guidelines

使用管理器來封裝邏輯

為了實(shí)現(xiàn)代碼的盡可能高的模塊化和可重用性裕照,我們定義了對(duì)象攒发,我們稱之為Manager。Manager負(fù)責(zé)處理業(yè)務(wù)邏輯的特定部分晋南。例如惠猿,健身應(yīng)用可能需要一個(gè)登錄管理器、一個(gè)計(jì)劃生成器负间,甚至需要更通用的邏輯來執(zhí)行API調(diào)用或跟蹤用戶指標(biāo)偶妖。

依賴容器負(fù)責(zé)啟動(dòng)這些管理器,并將它們暴露給Katana的Side Effects政溃。以下是創(chuàng)建管理器時(shí)需要遵循的一些指導(dǎo)方針:?

1.管理者是“被動(dòng)的”趾访,他們被Katana的?Side Effects所調(diào)用,他們不應(yīng)該以任何方式與武士刀交互(也就是說董虱,他們不能分派)

2.管理器既不能訪問存儲(chǔ)getState扼鞋,也不能訪問分派

3.管理器不應(yīng)該包含狀態(tài)。函數(shù)執(zhí)行計(jì)算所需的所有信息都作為參數(shù)傳遞愤诱。

4.管理者可能需要使用其他管理者來實(shí)現(xiàn)他們的部分邏輯藏鹊。我們稱這些下屬管理者為依賴關(guān)系。在初始化管理器時(shí)转锈,依賴項(xiàng)應(yīng)該作為參數(shù)傳遞。

在命名約定方面楚殿,作為管理器的類應(yīng)該使用Manager后綴命名撮慨。舉個(gè)具體的例子竿痰,Login不是一個(gè)有效的管理器名,而LoginManager是砌溺。


Event Observers

Katana?提供了一個(gè)攔截器影涉,可以用來觀察以下事件:

1.狀態(tài)變化,

2.一個(gè)狀態(tài)更新器或一個(gè)副作用已經(jīng)被發(fā)送规伐,

3.通知是否已經(jīng)被發(fā)布

有時(shí)這是不夠的蟹倾,我們需要觀察外部世界,并把我們從這個(gè)觀察中得到的信息帶回Katana的世界猖闪。正如指南(1)中所討論的鲜棠,管理器是應(yīng)用程序的被動(dòng)成員,因此它們不能分派培慌。為了解決這個(gè)特定的用例豁陆,我們引入了event observers。這些類是由依賴容器創(chuàng)建和擁有的吵护,它們唯一且唯一的職責(zé)是監(jiān)聽來自外部世界(例如盒音,F(xiàn)irebase、Websockets等等)的事件馅而,并在這個(gè)事件之后在Katana世界中分派一些東西祥诽。

雖然分開管理者(Manager)和Observers?可能看起來很奇怪,但這實(shí)際上有助于保持每個(gè)部分的簡(jiǎn)單和一致瓮恭。對(duì)于簡(jiǎn)單的情況使用管理器雄坪,對(duì)于更復(fù)雜的情況使用event observer。

在命名約定方面偎血,作為eventtobservers的類應(yīng)該使用Observer后綴命名诸衔。舉個(gè)具體的例子,HealthKit不是一個(gè)有效的觀察者名颇玷,而HealthKitObserver是笨农。


Avoid complex Side Effects(避免復(fù)雜的Side Effects)

在編寫應(yīng)用程序的邏輯時(shí),可能會(huì)創(chuàng)建一些高度靈活的Side Effects帖渠,這些Side Effects需要多個(gè)輸入(即谒亦,實(shí)現(xiàn)Side Effects的結(jié)構(gòu)有幾個(gè)參數(shù)),并根據(jù)這些輸入實(shí)現(xiàn)不同的東西空郊。

邏輯被封裝在分組的份招、可重用的函數(shù)中。這意味著您應(yīng)該盡量使Side Effects簡(jiǎn)單狞甚,并盡可能接近管理器功能和分派的簡(jiǎn)單鏈接锁摔。

關(guān)于在另一個(gè)Side Effects中發(fā)送一個(gè)Side Effects,應(yīng)該盡可能避免哼审,因?yàn)檫@會(huì)使整個(gè)邏輯更加難以遵循谐腰。如果您最終處于這種情況孕豹,請(qǐng)嘗試查看您的代碼,并考慮更多地利用管理員十气。


Leverage encapsulation, modularisation and visibility modifiers(利用封裝励背、模塊化和可見性修飾符)


應(yīng)用程序是由相互協(xié)作的獨(dú)立邏輯部分組成的。在編寫應(yīng)用程序邏輯時(shí)砸西,應(yīng)該創(chuàng)建名稱空間(模塊)叶眉,反映這些名稱空間中的劃分和組狀態(tài)更新器以及Side Effects。

Documentation


文檔是應(yīng)用程序中非常重要的部分芹枷。擁有出色的文檔衅疙,其他開發(fā)人員可以輕松進(jìn)入您的代碼庫(kù),并更快地提高生產(chǎn)力杖狼。

上面一條準(zhǔn)則定義了邏輯模塊的公共接口的概念炼蛤。在將該準(zhǔn)則應(yīng)用于代碼時(shí),還應(yīng)確保正確記錄了“公共接口”蝶涩。好的文檔應(yīng)包括:

1.功能/副作用/狀態(tài)更新程序的功能說明

2.參數(shù)說明

3.前提條件(如果有)

4.在編寫代碼時(shí)所做的假設(shè)

5.代碼無法輕易推斷出的任何其他信息理朋,這些信息在使用代碼或需要更改代碼時(shí)都非常有用


Project files structure (項(xiàng)目文件結(jié)構(gòu))


ProjectName

? ? |-- Logic

? ? ? ? ? |-- AppDependenciesContainer.swift

? ? ? ? ? |-- Home

? ? ? ? ? ? ? ? |-- HomeDispatchable.swift? // side effects and state updaters? ? ? ?

? ? ? ? ? |-- Login

? ? ? ? ? ? ? ? |-- LoginDispatchable.swift // side effects and state updaters

? ? ? ? ? ? ? ? |-- LoginManager.swift

? ? ? ? ? |-- PlanGenerator

? ? ? ? ? ? ? ? |-- PlanGeneratorDispatchable.swift // side effects and state updaters

? ? ? ? ? ? ? ? |-- PlanGeneratorModels.swift

? ? ? ? ? ? ? ? |-- PlanGeneratorManager.swift

? ? |-- UI

? ? ? ? ? |-- Login

? ? ? ? ? ? ? ? |-- LoginVC.swift

? ? ? ? ? ? ? ? |-- LoginView.swift?

? ? ? ? ? |-- Home

? ? ? ? ? ? ? ? |-- HomeVC.swift

? ? ? ? ? ? ? ? |-- HomeView.swift? ?

? ? ? ? ? ? ? ? |-- HomeVM.swift

? ? |-- State

? ? ? ? ? |-- AppState.swift? ?

如您所見,主文件夾包含3個(gè)主文件夾:邏輯绿聘,UI和狀態(tài)嗽上。

邏輯文件夾包含應(yīng)用程序的所有邏輯(狀態(tài)更新程序,副作用和管理器)以及依賴項(xiàng)容器熄攘。

即使所有邏輯都在一個(gè)文件中(例如Home.swift兽愤,它具有與Home視圖控制器嚴(yán)格相關(guān)的副作用),也應(yīng)該將該文件包含在文件夾中以方便搜索挪圾,而不必猜測(cè)它是文件夾還是文件夾浅萧。一份文件≌芩迹總體邏輯應(yīng)包含副作用洼畅,狀態(tài)更新程序,管理器和與邏輯相關(guān)的模型棚赔。

State文件夾包含該狀態(tài)一部分的所有結(jié)構(gòu)帝簇。請(qǐng)注意,遵循?準(zhǔn)則(4)靠益,您可能希望將狀態(tài)與邏輯共同定位丧肴,以對(duì)代碼實(shí)施某種信息隱藏技術(shù)(即,將某些變量設(shè)為私有或文件私有)胧后。這是唯一允許的例外芋浮。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市壳快,隨后出現(xiàn)的幾起案子纸巷,更是在濱河造成了極大的恐慌江醇,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,482評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件何暇,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡凛驮,警方通過查閱死者的電腦和手機(jī)裆站,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來黔夭,“玉大人宏胯,你說我怎么就攤上這事”纠眩” “怎么了肩袍?”我有些...
    開封第一講書人閱讀 152,762評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)婚惫。 經(jīng)常有香客問我氛赐,道長(zhǎng),這世上最難降的妖魔是什么先舷? 我笑而不...
    開封第一講書人閱讀 55,273評(píng)論 1 279
  • 正文 為了忘掉前任艰管,我火速辦了婚禮,結(jié)果婚禮上蒋川,老公的妹妹穿的比我還像新娘牲芋。我一直安慰自己,他們只是感情好捺球,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,289評(píng)論 5 373
  • 文/花漫 我一把揭開白布缸浦。 她就那樣靜靜地躺著,像睡著了一般氮兵。 火紅的嫁衣襯著肌膚如雪裂逐。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,046評(píng)論 1 285
  • 那天胆剧,我揣著相機(jī)與錄音絮姆,去河邊找鬼。 笑死秩霍,一個(gè)胖子當(dāng)著我的面吹牛篙悯,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播铃绒,決...
    沈念sama閱讀 38,351評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼鸽照,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了颠悬?” 一聲冷哼從身側(cè)響起矮燎,我...
    開封第一講書人閱讀 36,988評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤定血,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后诞外,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體澜沟,經(jīng)...
    沈念sama閱讀 43,476評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,948評(píng)論 2 324
  • 正文 我和宋清朗相戀三年峡谊,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了茫虽。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,064評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡既们,死狀恐怖濒析,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情啥纸,我是刑警寧澤号杏,帶...
    沈念sama閱讀 33,712評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站斯棒,受9級(jí)特大地震影響盾致,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜名船,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,261評(píng)論 3 307
  • 文/蒙蒙 一绰上、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧渠驼,春花似錦蜈块、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至蜓席,卻和暖如春器一,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背厨内。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評(píng)論 1 262
  • 我被黑心中介騙來泰國(guó)打工祈秕, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人雏胃。 一個(gè)月前我還...
    沈念sama閱讀 45,511評(píng)論 2 354
  • 正文 我出身青樓请毛,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親瞭亮。 傳聞我的和親對(duì)象是個(gè)殘疾皇子方仿,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,802評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • 用到的組件 1、通過CocoaPods安裝 2、第三方類庫(kù)安裝 3仙蚜、第三方服務(wù) 友盟社會(huì)化分享組件 友盟用戶反饋 ...
    SunnyLeong閱讀 14,601評(píng)論 1 180
  • 轉(zhuǎn)載自:https://github.com/Tim9Liu9/TimLiu-iOS[https://github...
    香橙柚子閱讀 8,460評(píng)論 0 35
  • 推薦指數(shù): 6.0 書籍主旨關(guān)鍵詞:特權(quán)此洲、焦點(diǎn)、注意力委粉、語(yǔ)言聯(lián)想呜师、情景聯(lián)想 觀點(diǎn): 1.統(tǒng)計(jì)學(xué)現(xiàn)在叫數(shù)據(jù)分析,社會(huì)...
    Jenaral閱讀 5,701評(píng)論 0 5
  • 昨天贾节,在回家的路上匣掸,坐在車?yán)镉圃沼圃盏乜粗摹度龉衬墓适隆罚冶焕锩娴膬?nèi)容深深吸引住了氮双,盡管上學(xué)時(shí)...
    夜闌曉語(yǔ)閱讀 3,778評(píng)論 2 9
  • 一月四號(hào)的大沙有個(gè)想法戴差。從昨晚到現(xiàn)在就一直圍繞在腦子里☆踔觯或許深受那些小說的影響暖释,或許真的就是我自己腦子或者精神么有...
    一個(gè)人的大沙閱讀 4,012評(píng)論 3 4