框架架構(gòu)差異與選型實(shí)戰(zhàn))
跨平臺(tái)開發(fā)圈子里每隔一陣子就會(huì)冒出一個(gè)“新王登基”的話題。這回輪到了 ArkUI-X 6.0。最近我的技術(shù)群和私信里反復(fù)出現(xiàn)同一個(gè)問題“ArkUI-X 6.0 跨平臺(tái)框架能不能取代 Flutter”有人把它捧成跨平臺(tái)終局有人覺得它離工業(yè)級(jí)應(yīng)用還差十萬八千里兩邊吵得不可開交。直接說我的結(jié)論吧用“取代”這個(gè)詞本身就是把問題問窄了。ArkUI-X 和 Flutter 雖然都叫跨平臺(tái)框架但底層走的完全是兩條路線。你要真想在項(xiàng)目里做決策或者領(lǐng)導(dǎo)突然讓你出一份“評(píng)估 ArkUI-X 6.0 替代 Flutter 的可行性”的技術(shù)調(diào)研光看社區(qū)熱搜和發(fā)布會(huì)截圖是遠(yuǎn)遠(yuǎn)不夠的。這篇博文我會(huì)把架構(gòu)差異、語言成本、狀態(tài)管理、生態(tài)差距、真實(shí)遷移體驗(yàn)這幾塊從頭到尾拆透最后再告訴你什么情況下該選哪一邊爭(zhēng)取幫你少走點(diǎn)彎路。1. 先搞清楚 ArkUI-X 6.0 到底是一套什么東西1.1 它不是一門新語言而是一種生態(tài)出口很多不了解 ArkUI-X 的人一上來聽到 ArkTS、聲明式 UI、跨平臺(tái)容器這一堆詞本能覺得又要學(xué)一門新框架了直接被勸退。但實(shí)際上ArkUI-X 的核心并不是發(fā)明新語言而是把原本在一套體系內(nèi)運(yùn)行的 UI 能力搬到一個(gè)能跑多端的容器里讓開發(fā)者在 iOS 和 Android 上也能復(fù)用同一套界面邏輯。具體一點(diǎn)說你用 ArkTS 寫頁面用聲明式方式組織組件、狀態(tài)和事件這些聲明最終由 ArkUI 運(yùn)行時(shí)解釋或編譯落到目標(biāo)平臺(tái)的視圖體系里去執(zhí)行。用大白話講你不需要跟原生代碼直接對(duì)著干但你的界面最終是長(zhǎng)在原生視圖上的而不是像某些方案那樣整個(gè)界面都裝在一個(gè)網(wǎng)頁殼子里。這也是 ArkUI-X 和“套殼”框架的最大分界線。套殼通常是指用 WebView 包一層網(wǎng)頁性能天花板低滾動(dòng)流暢性和原生交互都容易露餡。ArkUI-X 走的是給原生視圖配一個(gè)自己的 UI 描述和運(yùn)行時(shí)的路子頁面元素最終用的還是平臺(tái)側(cè)真實(shí)控件和底層繪制能力說實(shí)話日常業(yè)務(wù)的流暢度比 WebView 那一路要可靠得多。1.2 6.0 版本真正值得關(guān)注的變化聊到 6.0很多自媒體喜歡拿“渲染引擎升級(jí)”來制造話題我反而覺得這個(gè)版本最值得關(guān)注的其實(shí)是工程鏈的成熟度??缙脚_(tái)框架最勸退團(tuán)隊(duì)的時(shí)候往往不是 UI 語法難而是工程配置一團(tuán)糟。6.0 在工程模板、構(gòu)建腳本、調(diào)試工具鏈上都有了肉眼可見的改善模板工程不再依賴一堆手工配置才能跑通真機(jī)調(diào)試和預(yù)覽器對(duì)跨平臺(tái)工程的支持也順暢了不少。這對(duì)團(tuán)隊(duì)選型來說比宣傳里那些炫酷動(dòng)畫數(shù)據(jù)要重要得多。因?yàn)榧夹g(shù)選型的核心痛點(diǎn)是“能不能讓團(tuán)隊(duì)穩(wěn)定交付”而不是“這個(gè)框架在某段演示視頻里有多猛”。工具鏈成熟一點(diǎn)點(diǎn)實(shí)際落地的成功率就高一大截。1.3 它的定位本質(zhì)上是讓一套代碼走得更遠(yuǎn)我理解 ArkUI-X 的戰(zhàn)略意圖不在于硬剛 Flutter 的跨平臺(tái)統(tǒng)治力而是把 ArkTS 這個(gè)生態(tài)的觸手伸到更多端上去。要知道一個(gè) UI 框架如果只能在自家設(shè)備上跑開發(fā)者生態(tài)很快就會(huì)見頂。一旦 ArkTS 能寫 Android、寫 iOS以后可能還能覆蓋桌面端那對(duì)上游生態(tài)來說就是一條高速公路。所以你說 ArkUI-X 是來“取代 Flutter”的嗎其實(shí)它更像是在做生態(tài)外延。這句話聽著像繞口令但你真的理解了它就不會(huì)再被“取代”這個(gè)非黑即白的說法帶節(jié)奏。2. 把它和 Flutter 放在手術(shù)臺(tái)上拆開看五個(gè)核心差異2.1 渲染路徑要不要重建一套自繪引擎跨平臺(tái)框架最大的分水嶺就是“渲染怎么做”。Flutter 走的是自繪引擎路線。它不直接依賴 iOS 或 Android 的原生控件而是自己用底層繪圖接口完成整套界面渲染從按鈕到文本框全是你自己畫的。最大好處是多端像素級(jí)一致iOS 上什么樣子Android 上也是那個(gè)樣子團(tuán)隊(duì)省掉了大量平臺(tái)適配的溝通成本。但代價(jià)也很明顯包體積大引擎獨(dú)立性強(qiáng)系統(tǒng)底層行為一變就容易偶發(fā)適配問題。而且因?yàn)?UI 徹底繞過了原生控件你要嵌一個(gè)原生地圖或原生相機(jī)流必須走橋接機(jī)制來對(duì)接橋接一旦復(fù)雜性能就容易失控。ArkUI-X 沒有復(fù)制這條極端自繪路線。它的 UI 聲明經(jīng)過運(yùn)行時(shí)映射后附著在目標(biāo)平臺(tái)的原生視圖體系上。基礎(chǔ)控件由原生側(cè)渲染ArkUI 負(fù)責(zé)統(tǒng)一編排布局、狀態(tài)、事件和業(yè)務(wù)邏輯。好處是安裝包相對(duì)輕深色模式、無障礙、字體縮放這類系統(tǒng)能力也能更自然地生效你不用為了一個(gè)彈窗圓角去跟底層繪制死磕。壞處恰恰藏在“相對(duì)”里。同一套聲明在 Android 和 iOS 上可能因?yàn)槟硞€(gè)原生控件的默認(rèn)行為不同出現(xiàn)間距、圓角、聚焦態(tài)的細(xì)微差異。團(tuán)隊(duì)必須接受一個(gè)事實(shí)你省下了自繪引擎的重量就得額外花人工做多端視覺走查。沒有絕對(duì)免費(fèi)的午餐。2.2 開發(fā)語言Dart 和 ArkTS 的勸退率完全不在一個(gè)量級(jí)Flutter 用 Dart這是選型繞不開的一道門檻。Dart 本身不難語法也清晰但認(rèn)知度低很多人聽到“還要專門學(xué)一門語言”就先擺手了。前端團(tuán)隊(duì)還能靠 JavaScript 經(jīng)驗(yàn)強(qiáng)行平移原生 iOS 或 Android 團(tuán)隊(duì)更是直接發(fā)問我為什么要學(xué)一門只能在 Flutter 里寫的語言這種天然的組織阻力讓 Flutter 在不少非互聯(lián)網(wǎng)前沿團(tuán)隊(duì)里招聘都挺費(fèi)勁。ArkTS 則聰明地站在了 TypeScript 這座人才大山上。TypeScript 程序員滿地都是ArkTS 在語法上和 TS 高度同構(gòu)只是為聲明式開發(fā)做了針對(duì)性收緊。對(duì)團(tuán)隊(duì)來說最大的友善就是“你以前的 TypeScript 直覺還能用”。我確實(shí)見過幾個(gè)做中后臺(tái)的前端小組靠?jī)扇炫嘤?xùn)就能上手寫 ArkUI-X 頁面這在 Flutter 項(xiàng)目里幾乎不敢想。不過門檻低不代表紀(jì)律松。ArkTS 把動(dòng)態(tài)類型和部分靈活特性都收緊了你不能像平時(shí)寫 TS 那樣到處用 any 糊弄編譯器會(huì)給你指出一堆問題。短期看有點(diǎn)煩長(zhǎng)期看反而是工程質(zhì)量的保護(hù)層。2.3 狀態(tài)管理單向數(shù)據(jù)流和響應(yīng)式的哲學(xué)分野Flutter 生態(tài)里最常見的狀態(tài)管理方案是 Provider、Riverpod、Bloc 這一套。開發(fā)者要理解 Stream、監(jiān)聽器、BuildContext 的刷新機(jī)制寫起來偏命令式調(diào)試時(shí)會(huì)順著數(shù)據(jù)流一路排查。好處是團(tuán)隊(duì)一旦形成統(tǒng)一模式代碼秩序感很強(qiáng)壞處是新成員很容易陷入“改了變量為什么 UI 不刷新”的困惑。ArkUI 更傾向于聲明式響應(yīng)式狀態(tài)模型。你定義狀態(tài)變量把它綁定到 UI 上狀態(tài)一改框架自動(dòng)調(diào)度對(duì)應(yīng)組件刷新。這種心智模型更接近前端 Vue、React 的開發(fā)直覺對(duì) Web 轉(zhuǎn)崗的團(tuán)隊(duì)極其友好。但響應(yīng)式自動(dòng)刷新是個(gè)雙刃劍。狀態(tài)粒度控制不好頁面復(fù)雜后特別容易在無關(guān)緊要的數(shù)據(jù)變動(dòng)時(shí)觸發(fā)整塊重建滾動(dòng)掉幀、動(dòng)畫卡頓就這么來的。你不能因?yàn)椤白詣?dòng)”就放棄思考復(fù)雜頁面依然要手動(dòng)做狀態(tài)隔離和局部刷新設(shè)計(jì)。這個(gè)坑等會(huì)兒遷移復(fù)盤里我會(huì)詳細(xì)講。2.4 平臺(tái)橋接大家都要碰原生姿勢(shì)完全不同F(xiàn)lutter 的平臺(tái)通道是成熟但繁瑣的機(jī)制。每次調(diào)用原生能力都要在 Dart 側(cè)寫抽象方法原生側(cè)寫對(duì)應(yīng) handler再用二進(jìn)制協(xié)議做參數(shù)編解碼。因?yàn)?Flutter 的自繪體系隔離得徹底橋接過程還經(jīng)常需要自己處理線程切換、生命周期對(duì)齊稍不留神就冒出詭異 bug。ArkUI-X 因?yàn)楸旧砭屯晥D體系靠寫原生模塊時(shí)摩擦面會(huì)小一些。但這不代表完全不需要寫橋接代碼原生 SDK 的能力調(diào)用依然要寫一層平臺(tái)適配。真正舒服的一點(diǎn)在于因?yàn)轫撁婵丶緛砭褪窃晥D某些原生 SDK 返回的 Texture 或自定義視圖可以直接掛到界面上不用再經(jīng)歷復(fù)雜的紋理同步流程。這個(gè)差異在接入人臉識(shí)別、地圖渲染、播放器這類底層組件時(shí)差距尤為明顯。2.5 工具鏈與調(diào)試體驗(yàn)經(jīng)驗(yàn)積累還不在同一層工具鏈這塊我得客觀一點(diǎn)。Flutter 的熱重載、性能 overlay、布局 inspector、時(shí)間軸分析器已經(jīng)打磨了很多年非常成熟。尤其熱重載幾乎成了跨平臺(tái)開發(fā)體驗(yàn)里的標(biāo)桿改完代碼一秒看到效果反饋迭代效率極高。ArkUI-X 6.0 在工具鏈上的進(jìn)步值得肯定預(yù)覽器和真機(jī)調(diào)試都比前幾個(gè)版本順暢但你要拿它的調(diào)試工具豐富度去跟 Flutter 比差距還得靠時(shí)間追。特別是做自定義渲染、復(fù)雜動(dòng)畫的團(tuán)隊(duì)會(huì)明顯感到 Inspector 里看到的層級(jí)不夠細(xì)定位問題經(jīng)常要靠自己打日志。這倒不是框架原理上的大缺陷純粹是工具鏈成熟度的問題只能等版本迭代慢慢完善。3. 一份真實(shí)遷移復(fù)盤從 Flutter 切到 ArkUI-X 6.0 流了多少血3.1 遷移項(xiàng)目的背景這一節(jié)我復(fù)盤一個(gè)幫朋友團(tuán)隊(duì)做的模擬項(xiàng)目 X。原工程是一個(gè)小型跨平臺(tái)應(yīng)用核心功能是信息流、表單、圖表和消息推送基于 Flutter 開發(fā)代碼量大約五萬行跑在 iOS 和 Android 上。團(tuán)隊(duì)想評(píng)估 ArkUI-X 6.0 到底值不值得全面切換于是抽了其中業(yè)務(wù)最典型的一個(gè)獨(dú)立模塊做了兩周的遷移驗(yàn)證。目標(biāo)不是把整個(gè)項(xiàng)目搬過去而是用真實(shí)代碼算清楚“從 Flutter 遷到 ArkUI-X工作量和風(fēng)險(xiǎn)到底是多大”。先說整體結(jié)論遷移工作量比想象中少也比想象中多。業(yè)務(wù)邏輯部分因?yàn)檎Z言同構(gòu)大部分能平移UI 聲明部分因?yàn)榻M件模型接近但 API 有差異大約要重寫四成左右的代碼。最耗時(shí)間的反而不是打字而是調(diào)整狀態(tài)模型和重新理解 ArkUI 的刷新邊界。3.2 UI 層遷移組件名看著像思路完全不一樣Flutter 里你已經(jīng)習(xí)慣了 Container、Row、Column、Stack 到處嵌套用嵌套組件的方式控制布局。到了 ArkUI 里你會(huì)發(fā)現(xiàn)組件還是那些熟悉的角色但寫法完全不同。ArkUI 更傾向于用屬性參數(shù)直接修飾組件而不是像 Flutter 那樣一個(gè) Padding 包一層、一個(gè) Align 再包一層。舉個(gè)例子Column 在兩邊都有但在 ArkUI 里主軸對(duì)齊必須顯式寫在 justifyContent 里。文本溢出Flutter 里你找 TextOverflow.ellipsisArkUI 里要同時(shí)給 Text 設(shè)置 maxLines 和 textOverflow 兩個(gè)屬性。點(diǎn)擊事件Flutter 的 onTap 到 ArkUI 變成 onClick但 ArkUI 的手勢(shì)體系其實(shí)更豐富一個(gè)簡(jiǎn)單點(diǎn)擊也能拆出多種手勢(shì)優(yōu)先級(jí)。這些單獨(dú)拎出來都是芝麻小事攢在一起就是遷移效率的殺手。我建議真要做遷移的話別急著寫腳本批量轉(zhuǎn)先拿三到五個(gè)典型頁面手動(dòng)重寫一遍總結(jié)出自己的“組件映射口訣”后面再鋪開會(huì)順暢得多。如果一上來就復(fù)制粘貼大概率會(huì)在各種屬性名上反復(fù)踩雷。3.3 狀態(tài)模型遷移語法不是難點(diǎn)刷新邊界才是原項(xiàng)目里我們用了 Bloc 管理業(yè)務(wù)狀態(tài)頁面監(jiān)聽 Stream 變化再通過 BlocBuilder 觸發(fā)局部刷新。ArkUI 這邊的狀態(tài)管理是響應(yīng)式的需要在結(jié)構(gòu)體里聲明 State、Prop、Link 這些裝飾器。兩種思想非常接近但遷移時(shí)真不是改改關(guān)鍵字就行。當(dāng)時(shí)最費(fèi)勁的是一個(gè)信息流頁面集成了下拉刷新、上拉加載、篩選條件和列表項(xiàng)聯(lián)動(dòng)。我們一開始圖省事把整個(gè)篩選對(duì)象封裝成一個(gè) State 變量結(jié)果用戶在篩選彈窗里每動(dòng)一次開關(guān)整個(gè)列表都跟著重建中低端真機(jī)上滾動(dòng)卡頓肉眼可見。后來把搜索條件、彈窗開關(guān)、列表數(shù)據(jù)拆成獨(dú)立的狀態(tài)粒度刷新才重新變得絲滑。這個(gè)教訓(xùn)讓我徹底明白跨平臺(tái)遷移最危險(xiǎn)的永遠(yuǎn)不是語法而是你沒重新思考狀態(tài)和渲染之間的關(guān)系。框架自動(dòng)幫你刷新不代表它知道你的業(yè)務(wù)該刷到多細(xì)。3.4 性能、包體積、真機(jī)適配的實(shí)測(cè)數(shù)據(jù)遷移驗(yàn)證的同時(shí)我們記錄了一組基礎(chǔ)數(shù)據(jù)做對(duì)照。純 Flutter 工程在 Android 上打出的 release 安裝包接近 20MB切到 ArkUI-X 之后底包明顯更小。當(dāng)然這只是單模塊 demo 的結(jié)果完整業(yè)務(wù)遷移后框架底包的差異會(huì)被業(yè)務(wù)代碼稀釋但框架基礎(chǔ)體積的優(yōu)勢(shì)是實(shí)打?qū)嵉?。啟?dòng)耗時(shí)上的差異更有意思。Flutter 應(yīng)用冷啟動(dòng)需要初始化自繪引擎過程偏重ArkUI-X 冷啟動(dòng)在某些中低端 Android 設(shè)備上反而感覺更輕快因?yàn)樵晥D體系的初始路徑更短。但進(jìn)入復(fù)雜頁面后持續(xù)滾動(dòng)的幀率表現(xiàn)ArkUI-X 的波動(dòng)幅度會(huì)比 Flutter 大。這意味著做重內(nèi)容產(chǎn)品時(shí)不能只看發(fā)布會(huì)數(shù)據(jù)一定要拿自己業(yè)務(wù)里最高頻的頁面去真機(jī)反復(fù)壓測(cè)。還有一個(gè)特別容易忽略的點(diǎn)系統(tǒng)字體變化和深色模式切換時(shí)因?yàn)?ArkUI-X 依賴原生控件適配起來會(huì)省力Flutter 的自繪體系在這些系統(tǒng)級(jí)變化面前反而需要額外處理。這就是兩條路線此消彼長(zhǎng)的典型體現(xiàn)。4. 常見問題與避坑清單都是拿淚換來的4.1 環(huán)境和構(gòu)建問題別手動(dòng)碰工程結(jié)構(gòu)ArkUI-X 6.0 的工程構(gòu)建依賴配套 IDE 和命令行工具工作流不像 Flutter 那樣一條命令走天下。我第一次配置時(shí)就踩了坑把當(dāng)前版本的 SDK 和某舊版工具鏈混裝結(jié)果工程模板一直沒法識(shí)別目標(biāo)平臺(tái)報(bào)出各種說不清道不明的配置錯(cuò)誤。最后把環(huán)境和緩存全部清理重裝一切才恢復(fù)正常。這條經(jīng)驗(yàn)必須分享嚴(yán)格使用官方模板生成工程不要手動(dòng)改造目錄結(jié)構(gòu)。很多莫名其妙的怪問題根源都在目錄約定和配置文件不一致上。4.2 渲染不一致按這個(gè)順序排查更快兩邊用同一套組件庫出現(xiàn)視覺差異先不要懷疑是框架 bug。排查順序我建議固定成三步第一步查全局主題有沒有改默認(rèn)控件的樣式第二步查父容器有沒有設(shè)置影響尺寸分配的約束第三步查不同系統(tǒng)默認(rèn)觸摸反饋的差異。根據(jù)我的經(jīng)驗(yàn)跨平臺(tái)不一致有一大半是自己布局寫得太松導(dǎo)致的。盡量多寫顯式尺寸、顯式對(duì)齊、顯式間距這些看似繁瑣的約束設(shè)置能幫你擋下大量隱性偏差。4.3 別被“取代論”綁架了技術(shù)判斷我見過太多團(tuán)隊(duì)一上來就把選題問錯(cuò)了。他們不是在評(píng)估框架適不適合自己的業(yè)務(wù)而是急著站隊(duì)去證明另一個(gè)框架該死。技術(shù)選型里最不靠譜的決策方式就是用“誰取代誰”來替代“誰適配我的場(chǎng)景”來思考。這套反思同樣適用于今天這篇文章。Flutter 的優(yōu)勢(shì)是成熟的插件生態(tài)、穩(wěn)定的渲染一致性、豐富的調(diào)試工具這些是多年積累下來的真資產(chǎn)。ArkUI-X 的核心競(jìng)爭(zhēng)力是語言門檻低、原生適配順、與上游生態(tài)協(xié)同好。它們要做的是不同團(tuán)隊(duì)、不同產(chǎn)品優(yōu)先級(jí)下的填空題而不是非此即彼的選擇題。5. 我的最終判斷到底該不該換什么時(shí)候換5.1 這些場(chǎng)景下我會(huì)優(yōu)先把 ArkUI-X 6.0 放進(jìn)選型池如果你所在的團(tuán)隊(duì)符合下面任意兩條我建議你把 ArkUI-X 6.0 當(dāng)作當(dāng)前重點(diǎn)評(píng)估對(duì)象團(tuán)隊(duì)以前端為主要背景對(duì) TypeScript 的熟練度遠(yuǎn)高于 Dart產(chǎn)品對(duì)多端 UI 像素級(jí)一致的要求中等不需要極端還原設(shè)計(jì)稿業(yè)務(wù)需要頻繁接入國(guó)內(nèi)原生 SDK比如地圖、支付、推送、人臉識(shí)別希望降低多端維護(hù)成本同時(shí)不想背一個(gè)過重的自繪引擎安裝包需要和上游自有業(yè)務(wù)生態(tài)做深度耦合ArkTS 同構(gòu)能明顯提升代碼復(fù)用率。這些條件下ArkUI-X 的收益往往是肉眼可見的。語言同構(gòu)讓招人變得簡(jiǎn)單原生控件貼近系統(tǒng)讓接入變得順滑長(zhǎng)期維護(hù)學(xué)成本也低團(tuán)隊(duì)不容易被框架拖垮。5.2 這些場(chǎng)景繼續(xù)用 Flutter 更有底反過來如果你的團(tuán)隊(duì)追求的是極致的多端一致性業(yè)務(wù)高度依賴 Flutter 的插件生態(tài)或者你已經(jīng)有一支 Dart 熟練的存量團(tuán)隊(duì)那就真的沒必要為了追新而遷移。遷移本身就是成本一個(gè)新框架剛剛進(jìn)入穩(wěn)定期它的最佳實(shí)踐、踩坑經(jīng)驗(yàn)、三方組件沉淀都還在積累這時(shí)候把主力項(xiàng)目整個(gè)押上去風(fēng)險(xiǎn)遠(yuǎn)大于收益。尤其是一些重動(dòng)畫、重編輯、重實(shí)時(shí)協(xié)作類的產(chǎn)品Flutter 自定義渲染的靈活性依然是王者級(jí)存在。如果你主力工程每天都要靠熱重載來飆效率那 Flutter 當(dāng)前的體驗(yàn)依然領(lǐng)先。5.3 我個(gè)人的體會(huì)兩個(gè)框架不是敵人是不同選擇技術(shù)選型做得多了你會(huì)越來越不迷信“最強(qiáng)”這個(gè)詞。我在實(shí)際折騰 ArkUI-X 6.0 和 Flutter 的時(shí)候最大的感受是它們各自面對(duì)的是不同資源稟賦、不同技術(shù)背景、不同產(chǎn)品訴求的團(tuán)隊(duì)。今天多一個(gè)認(rèn)真做事的跨平臺(tái)選擇對(duì)整個(gè)開發(fā)者生態(tài)絕對(duì)是好消息但對(duì)每一個(gè)具體團(tuán)隊(duì)來說還是要拿自己的代碼說話。如果你們手頭正好有評(píng)估需求我建議別急著翻論壇帶節(jié)奏的帖子而是找團(tuán)隊(duì)成員里 Flutter 老手和前端新人各一名拿一個(gè)真實(shí)業(yè)務(wù)模塊做兩周原型把真實(shí)效率、狀態(tài)遷移成本和真機(jī)性能數(shù)據(jù)記錄下來。技術(shù)選型最怕拍腦袋最靠譜的方式永遠(yuǎn)是讓團(tuán)隊(duì)用自己的代碼去跑出自己的答案。最后再分享一個(gè)小技巧做這種對(duì)比評(píng)估時(shí)一定別把“開發(fā)效率”和“運(yùn)行性能”混在一個(gè)維度里算分開記錄分開打分最后再結(jié)合團(tuán)隊(duì)自身情況加權(quán)你會(huì)發(fā)現(xiàn)結(jié)論清晰得多。