İOS Lokallaşdırıla bilən Dosyalarınızı necə təmiz saxlamalısınız - Sürətli Script Edition

Bir neçə ay əvvəl lokallaşdırıla bilən simli fayllarınızı təmiz saxlamağa gəldikdə Xcode-un necə inkişaf etdiriləcəyini araşdırırdım. Problemi təkrarlamaq üçün lokallaşdırıla bilən simli fayllar, xüsusən mühəndislərin tətbiqi müxtəlif dillər üçün effektiv olduqda nisbətsiz və laqeyd olmağa meyllidirlər. Bu sənədləri təmiz və qorumalı saxlamaq çətinləşir. Lokallaşdırıla bilən fayllarla ümumi olan beş əsas problem oxunmazlıq, təkrarlanan düymələr, fərqli simli fayllardakı uyğun olmayan düymələr, kodda istifadə olunan itkin düymələr və kodda istifadə olunmayan əlavə düymələrdir (bunlara ölü düymələr aiddirəm) ).

Əvvəllər təklif etdiyim həll, lokalizasiya edilə bilən simli fayllarınızı kod bazanıza uyğun saxlamağınıza kömək etmək üçün bir başlanğıc ssenarisi yazı tərtibini daxil etməkdi (Təmiz iOS Yerləşdirilə bilən Dosyalar). Ssenari düymələri sıraladı, təkrarlanan və uyğun olmayan düymələri axtardı və lokalizasiya edilə bilən sənədlərinizdə təyin olunmamış və / və ya ölü düymələr tapdı. Çözüm işləkdi və ümumi problemləri yüngülləşdirdi, amma ssenarinin özü ilə o qədər də razı olmadığım bəzi problemlər var idi.

  • Ssenarinin icrası son dərəcə yavaş idi! Xüsusilə layihə böyüdükdə - O (n2) həlli. Çözüm, problemi optimallaşdırmağı düşünmədən həll etmək üçün başlanğıc nöqtəsi olmalıdır.
  • Bashı oxumaq çətindir - bu, bəzi insanlar üçün belə olmaya bilər, ancaq Swift / Obj-C mühəndisi olaraq, baş ssenarisini yenidən oxumaq bir az yenilənmə tələb edir. Bunu nəzərə alaraq, digər iOS mühəndislərinin öz layihələrində istifadə edə biləcəyi skriptdəki dəyişikliklər faydalı olmaqdan daha ağrılı oldu.
  • Birdən çox grep əmrinin zəncirlənməsi, önbellek silmə və dəstlərlə müqayisədə optimallaşdırılmış bir həll deyildi.

Bu səbəbdən həllini bu cəhətləri nəzərə alaraq uyğunlaşdırmağa qərar verdim. Digər iOS mühəndislərinin ssenarini layihə ehtiyaclarına uyğunlaşdırmasını asanlaşdırmaq üçün Swift'i seçdim. Swift ilə, həm də sadələşdirilmiş bir strategiyaya strukturlaşdırılmış bir yanaşma edə bildim.

İrəli tullanmaq və bütün skriptə baxmaq istəsəniz, xülasə budur. Ssenari daxil edilmiş bir nümunə layihəni yoxlamaq istəyirsinizsə, bu yazının sonunda GitHub layihəsini əlavə etdim, əks halda ssenarinin maraqlı hissəsini təhlil edək!

Baş ssenarisinə bənzər şəkildə əvvəlcə lokallaşdırılmış simli fayllar üçün kök qovluğundan create () ilə rekursiv şəkildə axtarırıq. Apple-ın FileManager, obyektləri sadalayaraq faylları asanlıqla tapır. Hesablanan dəyişən localizableFiles-dəki bütün Pods-lokallaşdırılmış faylları görməməzliyə vururuq, çünki bunlar ümumiyyətlə doludur. Ayrıştırma (_ path: String) metodundakı lokalizasiya edilə bilən faylları analiz edərkən və düymələri bir dəstdə saxlayarkən təkrar açarları axtararaq skripti burada optimallaşdırırıq. Metod, tapılan fayl yolları ilə birlikdə bütün açar nüsxələr üçün bir səhv qaytarır.

(Qeyd: Hər bir çap formatı ("səhv:") və ya çap formatı ("xəbərdarlıq:") üçün Xcode bildirilir ki, digər mesajlar yaradılış zamanı digər səhvlər və xəbərdarlıqlar ilə birlikdə alətlər panelində görünsün.)

Bundan sonra, validateMatchKeys metodunda düymələrin bütün lokalizasiya edilə bilən simli fayllarla uyğunlaşdığını yoxlayacağıq. Biz əsas sənədlərə uyğun olmayan əlavə düymələri süzmək üçün symmetricDifference istifadə edəcəyik. Bu metod bir səhv buraxır və lokalizasiya edilə bilən fayllarda eyni düymələr yoxdursa, skripti ləğv edir. Bu, növbəti işləmə, cleanWrite () əvvəl lokalizasiya edilə bilən sənədləri təmizləmək üçün bir şans verir. Lokallaşdırıla bilən fayl sıralanmış düymələrlə yenidən yazılır və əlavə boşluqlar və sətir fasilələri silinir.

Növbəti addım kod bazasını axtarmaq, bu fayllarda istifadə olunan düymələri saxlamaq və onları əsas açarlarımızla müqayisə etməkdir. Bəzi regex ilə açarları müvəffəqiyyətlə tapa bilərik və bunları və faylın yolunu LocalizationCodeFile strukturunda saxlaya bilərik. Eyni zamanda bütün faylları açar olmadan kompakt şəkildə təyin edərək skriptimizi optimallaşdırırıq. Quruluşumuza sahib olduqdan sonra LocalizationCodeFile kolleksiyamızı təkrarlamaq və əsas düymələrimizdən hər düyməni çıxarmaq üçün validateMissingKeys () düyməsini basırıq. Bu nəticədən əlavə açar sözlər əsas açarlarımızın alt dəstləri deyildir - buna görə itkin açarlarımızı alırıq. Eksik düymələr tapılarsa bir səhv ortaya çıxacaq.

Son strategiyamız, lokalizasiya edilə bilən sənədlərimizdə müəyyən edilmiş, lakin kod bazamızda istifadə olunmayan ölü açarları axtarmaqdır. FlatMap vasitəsilə LocalizationCodeFile kolleksiyamızdan toplanan bütün açarlardan əsas düymələrimizi çıxarıb ölü düymələrimizi əldə edə bilərik. Burada tapılan hər hansı bir açar xəbərdarlıq olaraq göstəriləcək, çünki bu addım istifadəçinin narahatlığı deyil, təklif olunan texniki borc təmizlənməsidır.

600-dən çox icraedici və 800-dən çox açarı olan bir müəssisə kodu bazası üçün baş skriptinin işlədilməsi orta hesabla 81 saniyə çəkdi. Bu sürətli skriptin eyni kod bazasına qarşı çalışması orta hesabla 3 saniyə çəkdi.

Təmiz və oxunaqlı bir kod bazası saxlamaq hər mühəndisin məqsədi olmalıdır. Göndərmə quruluşunuza daxil olan bu Swift skript ilə, lokalizasiya edilə bilən sənədlərinizi təmizləmək və saxlamaq bu məqsədə doğru kömək etməli və avtomatik hiss etməlidir. Xcode post build derlemelerine (https://buildingvts.com/clean-ios-localizable-files-8b910413b985) skriptin necə daxil ediləcəyini əvvəlki bloguma nəzər salın.

Bütün skript və nümunə layihəsi ilə bir GitHub layihəsini də buraya daxil etdim: https://github.com/ginowu7/CleanSwiftLocalizableExample. Hər hansı bir şərh və ya təklifi yazmaqdan çəkinməyin və məni Twitter @ ginowu07-də ​​izləyə bilərsiniz! Kodlamada əylənin!