|拼豆制圖43:壓縮字符矩陣上線前如何攔住錯位圖紙)
把 70×70 圖紙壓成字符行很節(jié)省體積.表示空格0-9和A-F表示最多 16 種顏色。但這種格式的危險也很直接——少一個字符、混入一個全角符號運行時仍可能繼續(xù)解析直到編號圖出現錯位、統計數不一致或某一行突然變短。這篇文章給《拼豆制圖》的PatternAssetCharts增加一層數據入口校驗。目標不是等 ArkUI 渲染異常后再排查而是在資源進入 Harmony os 應用時就給出圖紙 ID、行號、列號和錯誤原因。一、壓縮格式必須先寫成契約當前資源模型很簡潔exportinterfaceAssetChart{colors:string[];previewRows:string[];chartRows:string[];}僅靠接口無法表達以下約束chartRows不得為空每一行寬度必須相同字符只能來自.、0-9、A-Ftoken 對應的顏色索引不能超過colors.length - 1顏色必須是六位十六進制值預覽寬高要與約定一致。這些規(guī)則應該由一個入口統一執(zhí)行而不是散落在渲染代碼中。二、為校驗結果保留位置上下文直接拋出“資源錯誤”對 50 張圖紙幾乎沒有幫助。定義結構化問題exportinterfaceAssetIssue{patternId:string;field:string;row:number;col:number;message:string;}exportinterfaceAssetValidationResult{valid:boolean;issues:AssetIssue[];}行列從 0 還是 1 開始要統一。對開發(fā)日志建議展示 1 基坐標和編輯器行號更接近。三、第一關空數組與矩陣寬度privatestaticvalidateRows(patternId:string,field:string,rows:string[],issues:AssetIssue[]):void{if(rows.length0){issues.push({patternId,field,row:0,col:0,message:矩陣為空});return;}constexpectedWidthrows[0].length;if(expectedWidth0){issues.push({patternId,field,row:1,col:0,message:首行為空});}for(letrow0;rowrows.length;row){if(rows[row].length!expectedWidth){issues.push({patternId,field,row:row1,col:rows[row].length,message:行寬應為${expectedWidth}實際為${rows[row].length}});}}}當前rowWidth()只讀取第一行后續(xù)短行不會自動補齊。提前拒絕不規(guī)則矩陣可以防止width × height與格子數量失配。四、第二關token 字符集privatestaticvalidateTokens(patternId:string,field:string,rows:string[],colorCount:number,issues:AssetIssue[]):void{for(letrow0;rowrows.length;row){for(letcol0;colrows[row].length;col){consttokenrows[row].charAt(col);if(token.){continue;}constindex0123456789ABCDEF.indexOf(token);if(index0){issues.push({patternId,field,row:row1,col:col1,message:非法字符${token}});}elseif(indexcolorCount){issues.push({patternId,field,row:row1,col:col1,message:顏色索引${index}超出調色板});}}}}實現時不要把未知字符靜默當成空格。靜默降級會讓錯誤圖紙看起來“只是少了幾顆豆”反而更難定位。五、錯誤位置統一轉換成人類坐標數組下標從 0 開始而資源編輯人員習慣從第 1 行、第 1 列定位。可以把坐標轉換集中到一個入口避免某條規(guī)則報 0 基坐標、另一條規(guī)則報 1 基坐標privatestaticaddIssue(issues:AssetIssue[],patternId:string,field:string,rowIndex:number,columnIndex:number,message:string):void{issues.push({patternId:patternId,field:field,row:rowIndex1,col:columnIndex1,message:message});}這樣日志中的第 12 行第 8 列可以直接對應文本編輯器中的位置不需要修復人員每次手動加一。自動化測試則繼續(xù)向addIssue()傳入數組下標內部語義保持清楚。六、第三關顏色格式與重復色號privatestaticvalidateColors(patternId:string,colors:string[],issues:AssetIssue[]):void{constseennewSetstring();for(leti0;icolors.length;i){constvaluecolors[i].toUpperCase();if(!/^#[0-9A-F]{6}$/.test(value)){issues.push({patternId,field:colors,row:i1,col:0,message:顏色格式錯誤${colors[i]}});continue;}if(seen.has(value)){issues.push({patternId,field:colors,row:i1,col:0,message:重復顏色${value}});}seen.add(value);}}重復顏色不一定導致崩潰但會讓兩個色號視覺相同用戶備料時很容易誤判因此值得作為資源問題暴露出來。七、統一校驗入口staticvalidate(patternId:string,asset:AssetChart):AssetValidationResult{constissues:AssetIssue[][];AssetChartValidator.validateColors(patternId,asset.colors,issues);AssetChartValidator.validateRows(patternId,previewRows,asset.previewRows,issues);AssetChartValidator.validateRows(patternId,chartRows,asset.chartRows,issues);AssetChartValidator.validateTokens(patternId,previewRows,asset.previewRows,asset.colors.length,issues);AssetChartValidator.validateTokens(patternId,chartRows,asset.chartRows,asset.colors.length,issues);return{valid:issues.length0,issues};}Repository 只能接收valid的資源。開發(fā)構建可以直接拋錯線上構建可以隱藏損壞條目并記錄 ID但不應繼續(xù)把壞矩陣交給詳情頁。八、批量資源校驗50 張資源適合一次性遍歷constidsPatternAssetCharts.ids();constallIssues:AssetIssue[][];for(leti0;iids.length;i){constassetPatternAssetCharts.get(ids[i]);if(asset!null){allIssues.push(...AssetChartValidator.validate(ids[i],asset).issues);}}expect(allIssues).assertEqual([]);若數據由腳本生成還應讓生成腳本和 ArkTS 測試使用同一套 token 契約避免兩端規(guī)則逐漸偏離。九、常見問題與修復問題表現修復未知字符當空格圖案缺豆但不報錯非.的未知字符必須失敗只校驗首行寬度中間行錯位遍歷每一行比較寬度token 合法但無對應顏色某色塊變白對比索引與調色板長度顏色字符串解析出NaN導出顏色異常入口校驗六位十六進制問題信息要優(yōu)先服務于資源修復人員。與其只寫“圖紙非法”不如給出圖紙 ID、矩陣字段、行列位置、實際字符和允許范圍。信息越接近源數據越不需要在頁面、倉庫和資源文件之間反復定位。十、驗證清單空矩陣會返回明確問題。任意短行都能定位到具體行號。全角數字、空格和小寫外字符不會被吞掉。超出調色板的 token 會被拒絕。每個問題包含圖紙 ID 與字段名。批量資源測試在新增圖紙時自動執(zhí)行。提交新資源前應同時跑單張邊界用例和 50 張批量用例。單張用例負責證明每條規(guī)則能夠報出預期位置批量用例負責證明現有資源整體閉合兩者結合才不會出現規(guī)則本身寫錯卻被全量數據“恰好通過”的情況。十一、總結字符矩陣壓縮了資源體積也把很多錯誤推遲到了運行時。為寬度、字符集、調色板和顏色格式建立統一入口校驗Harmony os 應用才能把“某張圖看起來不對”變成一條可定位、可復現、可阻斷的問題記錄。標簽Harmony os、ArkTS、數據校驗、字符矩陣、資源工程