لینک کوتاه مطلب : https://hsgar.com/?p=5462

بارگذاری مجدد داغ در سوئیفت

سال 2040 است، و جدیدترین پردازنده‌های MacBook M30X ما می‌توانند پروژه‌های بزرگ سوئیفت را به‌طور لحظه‌ای قابل درک، جمع‌آوری کنند، بسیار شگفت‌انگیز به نظر می‌رسد، درست است؟

به جز، کامپایل کردن پایگاه کد تنها بخشی از چرخه تکرار ما است. موارد دیگر عبارتند از: – راه اندازی مجدد آن (یا استقرار آن در دستگاه) – پیمایش به مکان قبلی که در برنامه بودید – تولید مجدد داده های مورد نیاز.

اگر مجبور شوید یک بار این کار را انجام دهید خیلی بد به نظر نمی رسد. اما اگر شما مثل من باشید و در یک روز معمولی، بین این دو کار انجام دهید، چه؟ 200 – 500 تکرار در پایگاه کد؟ اضافه می کند.

راه بهتری وجود دارد که توسط سایر پلتفرم ها پذیرفته شده و در اکوسیستم Swift/iOS قابل دستیابی است. من بیش از یک دهه از آن استفاده کرده ام.

آیا می خواهید از امروز تا 10 ساعت کار در هفته صرفه جویی کنید؟

بارگذاری مجدد داغ

بارگذاری مجدد داغ در مورد خلاص شدن از کامپایل کردن کل برنامه و اجتناب از چرخه های استقرار/راه اندازی مجدد تا حد امکان است در حالی که به شما امکان می دهد کد برنامه در حال اجرا خود را ویرایش کنید و تغییرات را فوراً منعکس کنید.

با کاهش زمان انتظار برای برنامه‌ها برای بازسازی، راه‌اندازی مجدد، پیمایش مجدد به مکان قبلی که در خود برنامه بودید، و تولید مجدد داده‌های مورد نیاز، باعث می‌شود گردش کار شما کارآمدتر شود.

این بهبود فرآیند می تواند به معنای واقعی کلمه ساعت ها در زمان توسعه شما صرفه جویی کند، هر روز. من بیش از یک ماه کارم را دنبال کردم و برای من بین 1-2 ساعت بود هر روز.

صادقانه بگویم، اگر صرفه جویی در 10 ساعت از زمان توسعه در هفته شما را متقاعد نمی کند که این کار را امتحان کنید، فکر نمی کنم هیچ کاری انجام شود.

پلتفرم های دیگر چه می کنند؟

اگر فقط از پلتفرم‌های اپل استفاده می‌کردید، می‌توانید شگفت‌زده شوید که بدانید چند دهه پیش چند پلتفرم بارگذاری مجدد را پذیرفته‌اند. چه Node بنویسید یا هر فریم ورک JS دیگری، تنظیماتی برای استفاده از بارگذاری مجدد داغ وجود دارد. Go همچنین بارگذاری مجدد داغ را ارائه می دهد (این وبلاگ از این ویژگی استفاده می کند).

مثال دیگر معماری Flutter گوگل است که از ابتدا برای کار با بارگذاری مجدد داغ طراحی شده است. اگر با مهندسانی که روی Flutter کار می‌کنند صحبت می‌کنید، می‌توانید برنامه‌هایشان را به صورت زنده کدنویسی کنید، یکی از چیزهایی است که آنها در مورد تجربه توسعه‌دهنده Flutter دوست دارند. وقتی یک بازی Spelling Bee را برای نیویورک تایمز نوشتم، آن را می‌ستودم.

مایکروسافت اخیرا ویژوال استودیو 2022 را راه اندازی کرد و بارگذاری مجدد داغ را برای هر دو ارائه می دهد .NET و استاندارد C++ برنامه های کاربردی. مایکروسافت در دهه گذشته در رابطه با ابزار و تجربه توسعه دهنده آن را از بین برده است، بنابراین جای تعجب نیست.

در مورد اکوسیستم اپل چطور؟

در سال 2014، زمانی که راه‌اندازی شد، بسیاری از مردم از Swift Playgrounds در حیرت بودند زیرا به ما اجازه می‌دادند به سرعت کد خود را تکرار کنیم و نتایج کدمان را ببینیم، با این تفاوت که خیلی خوب کار نمی‌کردند زیرا خراب شد، آویزان شد و غیره. پشتیبانی از کل محیط آی پد

مدت کوتاهی پس از انتشار آنها، من یک پروژه منبع باز به نام Objective-C Playgrounds را راه اندازی کردم که بسیار سریعتر و قابل اطمینان تر از زمین های بازی رسمی کار می کرد. ایده من این بود که یک معماری/روند کاری طراحی کنم که اهرمی داشته باشد DyCI ابزار تزریق کد که من چند سالی است که از آن استفاده می کنم، ساخته شده است پل.

هشت سال از زمانی که زمین های بازی سوئیفت هنوز اینجا هستند می گذرد و بهتر شده اند، اما آیا قابل اعتماد هستند؟ آیا مردم از آنها برای هدایت توسعه خود استفاده می کنند؟

در تجربه من: نه واقعا. زمین های بازی خیلی قابل اعتماد نیستند یا در پروژه های بزرگتر قابل استفاده نیستند.

SwiftUI آمد، و این یک تکه فناوری فوق العاده است (هر چند هنوز حشره دار، ایده Swift Previews را معرفی کرد که بسیار شبیه به Playgrounds هستند، آیا آنها خوب هستند؟

داستان مشابه، وقتی کار می‌کند عالی است، اما در پروژه‌های بزرگ‌تر به‌طور غیرقابل اعتماد کار می‌کند و بیشتر از زمانی که کار می‌کند، شکست می‌خورد. آنها به شما امکان اشکال زدایی کد را در صورت داشتن هر گونه خطا به درستی ارائه نمی دهند، و به همین دلیل، پذیرش محدود شده است.

آیا باید منتظر اپل باشیم؟

اگر مدتی است که من را دنبال کرده اید، پاسخ را می دانید، قطعا نه. از این گذشته، من با ساختن چیزهایی که راه‌حل‌های وانیلی اپل آن را حل نمی‌کنند، حرفه‌ای کردم: از پسوندهای زبانی مانند منبع، بهبود Xcode مانند Sourcery Pro از طریق LifetimeTracker و بسیاری دیگر ابزارهای منبع باز

ما می‌توانیم از همان رویکردی که در ابتدا در زمین‌های بازی 2014 خود استفاده کردم، استفاده کنیم. من از آن استفاده کرده ام بیش از یک دهه و من از آن با موفقیت زیادی در ده ها پروژه سوئیفت استفاده کرده ام!

سال ها پیش، از استفاده منصرف شدم DyCI به InjectionForXcode، که با استفاده از LLVM inter-op به جای هر چرخشی بهتر عمل می کند. این یک ابزار کاملا رایگان و منبع باز است که در نوار منوی خود اجرا می کنید و توسط مهندس توانا ایجاد شده است. جان هولدسورث. تو باید کتاب اسرار سریع او را ببینید.

من آن را تشخیص دادم زمین های بازی رویکرد ممکن است بیش از حد سنگین باشد، بنابراین امروز، من منبع باز هستم. یک میکروکتابخانه بسیار متمرکز به نام تزریق کنید که، هنگامی که با InjectionForXcode، توسعه اپل شما را بسیار کارآمدتر و لذت بخش تر می کند!

اما فقط به حرف من اعتماد نکنید. به بازخورد الکساندرا و نیت نگاه کنید، که قبلاً حتی قبل از اینکه من این گردش کار را معرفی کنم، مهارت بالایی داشتند. شرکت مرورگر راه اندازی، که آن را حتی چشمگیرتر می کند.

تزریق کنید

این کتابخانه کوچک کاملاً جهانی است و چه با آن کار کنید UIKit, AppKit, یا SwiftUI, شما قادر خواهید بود از آن استفاده کنید.

نیازی به اضافه کردن کامپایل مشروط یا حذف ندارید Inject کد از برنامه های شما برای تولید این کد به کد داخلی بدون عملیات تبدیل می شود که با فرآیند کامپایل در بیلدهای بدون اشکال حذف می شود. شما می توانید آن را یک بار در هر نمایش یکپارچه کنید و سال ها از آن استفاده کنید.

رجوع شود به مخزن GitHub برای دستورالعمل های پیکربندی پروژه شما حالا بیایید به گزینه های گردش کاری که دارید نگاه کنیم.

گردش کار

SwiftUI

وجود دارد فقط دو خط برای فعال کردن هر SwiftUI برای برنامه‌نویسی زنده لازم است، و در لحظه‌ای که این کار را انجام می‌دهید، گردش کار سریع‌تری نسبت به پیش‌نمایش‌های Swift دارید در حالی که می‌توانید از داده‌های تولید واقعی استفاده کنید.

در اینجا یک نمونه از من است Sourcery Pro برنامه با تمام داده‌ها و منطق واقعی من بارگذاری شده است، و به من این امکان را می‌دهد که به سرعت کل طراحی برنامه را بدون هیچ راه‌اندازی مجدد، بارگیری مجدد یا هر چیزی شبیه به آن به سرعت انجام دهم.

فقط نگاه کنید که این گردش کار توسعه چقدر سریع است :mind-blown: و به من بگویید که ترجیح می دهید هر بار که کد را لمس می کنم منتظر بازسازی و استقرار مجدد Xcode باشید.

این دو خط نیازی به حذف ندارند زیرا در نسخه‌های Release غیر عملیاتی هستند. بنابراین پس از اضافه شدن، می توان آنها را برای همیشه در مخزن شما نگه داشت.

UIKit / AppKit

ما به راهی برای پاکسازی وضعیت بین مراحل تزریق کد برای چارچوب‌های استاندارد UI ضروری نیاز داریم.

من مفهوم را ایجاد می کنم میزبان ها که در آن زمینه به خوبی کار می کنند. 2 تا وجود دارد:

- Inject.ViewHost
- Inject.ViewControllerHost

چگونه این را ادغام کنیم؟ کلاسی را که می‌خواهیم روی آن تکرار کنیم در سطح والد می‌پیچیم، بنابراین نوع مورد نظر برای تزریق را تغییر نمی‌دهیم، بلکه سایت تماس والد را تغییر می‌دهیم.

به عنوان مثال، اگر شما یک SplitViewController که ایجاد می کند PaneA و PaneB,و می خواهید روی کد طرح/منطق تکرار کنید PaneA, شما سایت تماس را تغییر می دهید SplitViewController:

paneA = Inject.ViewHost(
  PaneAView(whatever: arguments, you: want)
)

این تمام تغییراتی است که باید ایجاد کنید. اکنون تزریق به شما امکان می دهد هر چیزی را تغییر دهید PaneAView به جز API اولیه آن. تغییرات بلافاصله در برنامه شما منعکس خواهد شد.


مثال مشخص تر؟

  • دانلود کردم برنامه Covid19
  • اضافه -Xlinker -interposable به Other Linker Flags
  • یک خط عوض شد Covid19TabController.swift:L63 خط

از جانب:

let vc = TwitterViewController(title: Tab.twitter.name, usernames: Twitter.content)

به:

let vc = Inject.ViewControllerHost(TwitterViewController(title: Tab.twitter.name, usernames: Twitter.content))

و اکنون، می‌توانم طرح کنترلر را بدون راه‌اندازی مجدد برنامه تکرار کنم:

این زیرش چطور کار میکنه؟

هاست ها از بسته شدن خودکار استفاده می کنند، بنابراین هر بار که کد را تزریق می کنید، نمونه جدیدی از نوع شما با همان آرگومان های اولیه ایجاد می کنیم که به شما امکان می دهد هر کد، چیدمان حافظه و هر چیز دیگری را تکرار کنید. تنها چیزی که نمی توانید تغییر دهید API اولیه ساز شما است.

تغییرات میزبان را نمی توان به طور کامل درون خطی کرد، بنابراین این کلاس ها در نسخه های Release حذف می شوند. ساده ترین راه این است که یک تعهد جداگانه ایجاد کنید که این یک خط را تعویض کند و سپس آن را در پایان گردش کار خود حذف کنید.

در مورد تزریق منطق چطور؟

معماری‌های استاندارد مانند MVVM/MVC یک تزریق منطقی رایگان دریافت می‌کنند، کلاس‌های خود را دوباره کامپایل می‌کنند و زمانی که متدها دوباره اجرا شوند، از کد جدید استفاده می‌کنید.

اگه مثل من دوست داری PointFree Composable Architecture، احتمالاً می خواهید کد کاهش دهنده را تزریق کنید. Vanilla TCA این اجازه را نمی دهد زیرا کد کاهنده یک تابع رایگان است که جایگزین کردن آن با تزریق ساده نیست، اما [our fork at The Browser Company] آن را پشتیبانی می کند.

وقتی در ابتدا مشاوره با TBC را شروع کردم، اولین چیزی که می خواستم یکپارچه سازی بود Inject و XcodeInjection به گردش کار ما مدیریت شرکت بسیار حمایت کرد.

تونستم بگیرم جان هولدسورث برای مشورت با ما برای کمک به بهبود کمی ابزار و پشتیبانی تزریق داخلی برای معماری TCA. جان ذهن ما را متعجب کرد که او با چه سرعتی توانست این ایده را اجرا کند و پشتیبانی پایداری برای تزریق کاهنده ارائه دهد. بسیار قابل اعتماد کار می کند.

اگر به چنگال ما از TCA (که ما آن را به روز نگه می داریم)، ​​می توانید از آن استفاده کنید Inject در هر دو لایه UI و TCA.

چقدر قابل اعتماد است؟

هیچ چیز کامل نیست، اما الان بیش از یک دهه است که از آن استفاده می کنم. این بسیار قابل اعتمادتر از فناوری اپل (زمین بازی / پیش نمایش) است.

اگر برای یادگیری آن وقت بگذارید، هزاران ساعت برای شما و تیمتان صرفه جویی می شود!



لینک منبع

ارسال یک پاسخ

آدرس ایمیل شما منتشر نخواهد شد.