Đơn vị 2 / 11

Tạo mã di động với trí tuệ nhân tạo: Phát triển Kotlin, Swift và đa nền tảng

Lợi nhuận:

  • Có được mã dễ bảo trì và có thể kiểm tra bằng cách áp đặt một kiến trúc như MVVM và yêu cầu từng lớp thành từng phần nhỏ trước khi trí tuệ nhân tạo tạo mã.
  • Khả năng nhận biết các bẫy dành riêng cho ngôn ngữ như an toàn null và coroutine trong Kotlin, vòng lặp tùy chọn và bộ nhớ trong Swift, đồng thời kiểm tra mã được tạo dựa trên chúng.
  • Khả năng xác minh quyền và cấu hình riêng cho từng nền tảng trong các dự án đa nền tảng (Flutter, React Native)

Trọng tâm của phát triển di động là mã và đó là nơi mà những lợi ích rõ ràng nhất từ ​​AI xuất hiện. Nhưng câu “Hãy để AI viết mã cho tôi” bản thân nó không phải là một chiến lược. Tạo mã tốt; Nó đòi hỏi phải kết hợp đúng ngôn ngữ, đúng kiến ​​trúc, đúng ranh giới và xác nhận đúng. Trong phần này, chúng ta sẽ tìm hiểu cách sử dụng AI một cách hiệu quả và an toàn cho Swift, ngôn ngữ của iOS, Kotlin, ngôn ngữ của Android và các công cụ đa nền tảng chạy trên hai nền tảng với một cơ sở mã duy nhất. Mục tiêu là định vị AI không phải là một “máy tự động mã hóa” mà là một máy gia tốc có kiến ​​trúc do bạn xác định.

Kiến trúc đầu tiên, mã thứ hai

Sai lầm phổ biến nhất là yêu cầu AI trực tiếp viết mã mà không có kế hoạch kiến ​​trúc. Điều này giống như xây một bức tường mà không đặt nền móng. Kiến trúc phổ biến nhất trên thiết bị di động là MVVM (Model-View-ViewModel — một mẫu thiết kế phân tách dữ liệu, màn hình và logic của màn hình). Điều này có nghĩa là chế độ xem chỉ là chế độ xem, logic và trạng thái nằm trong ViewModel và dữ liệu nằm trong lớp Mô hình. Nếu bạn không áp đặt sự phân tách này lên AI ngay từ đầu, nó sẽ tạo ra một cấu trúc không thể kiểm tra và khó bảo trì, nhồi nhét tất cả logic vào mã màn hình.

Quy trình tạo mã lành mạnh từng bước:

  1. Đưa ra bối cảnh. Nền tảng, ngôn ngữ, phiên bản, kiến ​​trúc, thư viện được sử dụng.
  2. Yêu cầu các lớp. Đầu tiên là mô hình dữ liệu, sau đó là lớp mạng/dữ liệu, sau đó là ViewModel, cuối cùng là màn hình.
  3. Yêu cầu những miếng nhỏ. Một màn hình hoặc một chức năng; Nó không phải là một tập tin khổng lồ 500 dòng.
  4. Xác minh từng phần. Xây dựng, thử nghiệm, tích hợp; sau đó chuyển sang bài hát tiếp theo.
  5. Yêu cầu một bộ tái cấu trúc (cải thiện mã). Bước "làm cho phần này dễ đọc và dễ kiểm tra hơn" sau mã đang hoạt động.
Gợi ý: Nói với AI “chia code theo MVVM: phần nào nên View, phần nào nên ViewModel, phần nào nên Model, cho riêng”. Câu đơn này cải thiện đáng kể chất lượng kiến ​​trúc của mã được tạo ra.

Kotlin và Swift: những cân nhắc dành riêng cho từng ngôn ngữ

Kotlin (Android) và Swift (iOS) là những ngôn ngữ hiện đại, an toàn nhưng chúng có những cạm bẫy khác nhau. Trong Kotlin, an toàn null (kiểm tra xem một biến có thể là "null" thông qua hệ thống loại hay không) đôi khi được AI gõ một cách lỏng lẻo; không cần thiết!! toán tử (dấu hiệu buộc phải dừng nếu nó rỗng) có thể làm hỏng ứng dụng. Trong Swift, chu trình quản lý và lưu giữ tùy chọn là rất quan trọng; AI có thể quên thêm [weak self] vào các bao đóng và điều này sẽ tạo ra rò rỉ bộ nhớ.

Vì vậy, khi bạn chọn một ngôn ngữ, hãy trau dồi lời nhắc cho phù hợp: như "Giữ nguyên tính an toàn vô giá trị trong Kotlin, không sử dụng !!" hoặc "Ngăn chặn vòng lặp tham chiếu mạnh khi đóng trong Swift".

Thận trọng: Mã không đồng bộ do AI tạo ra cần được chú ý đặc biệt. Việc chọn sai phạm vi trong coroutine Kotlin hoặc chặn luồng chính trong async/await trong Swift sẽ làm ứng dụng bị treo. AI thường xuyên mắc những lỗi này; Đừng tin tưởng nó mà không kiểm tra nó.

Phát triển đa nền tảng: Flutter và React Native

Đối với những người muốn sử dụng cả iOS và Android với một cơ sở mã duy nhất, Flutter (bộ công cụ dựa trên ngôn ngữ Dart của Google) và React Native (giải pháp dựa trên JavaScript của Meta) nổi bật. AI cũng rất mạnh mẽ trong những môi trường này, nhưng đôi khi bỏ qua những khác biệt về nền tảng (quyền, quy tắc lưu trữ, hành vi dành riêng cho thiết bị). Ví dụ: trong Flutter, quyền của máy ảnh được xác định trong các tệp khác nhau trên iOS và Android; AI chỉ có thể viết một. Trong mã đa nền tảng, điều cần thiết là phải nói "cấp các quyền và cấu hình cần thiết cho cả hai nền tảng riêng biệt".

Tóm tắt bầu cử:

Cách tiếp cận

khi nào

chú ý với AI

Bản địa (Kotlin/Swift)

Hiệu suất cao nhất, tích hợp sâu trong thiết bị

Mỗi nền tảng có mã riêng; xác minh hai lần

rung chuyển

Một nhóm, giao diện người dùng nhanh, nhất quán

Kiểm tra thủ công quyền/cài đặt dành riêng cho nền tảng

Phản ứng gốc

Nhóm Web/JS có sẵn

Kiểm tra các phần cầu (cầu bản địa) một cách cẩn thận

ba trường hợp nhỏ

Trường hợp 1 - Bẫy Coroutine. Một nhóm Android có chức năng lấy danh sách sản phẩm từ AI. Mã đang thực hiện yêu cầu mạng trong luồng chính; Sự cố không xuất hiện trên thiết bị thử nghiệm nhưng trên mạng yếu, ứng dụng bị treo trong 4 giây và đưa ra cảnh báo ANR (Application Not Replying). Đã sửa lỗi khi AI được yêu cầu "thực hiện công việc mạng trong bộ điều phối IO". Bài học: tính đồng thời luôn được kiểm soát.

Trường hợp 2 - Rò rỉ bộ nhớ. Một nhà phát triển iOS nhận thấy rằng sau khi mở và đóng màn hình do AI tạo ra 20 lần, bộ nhớ của ứng dụng đã tăng từ 40 MB lên 180 MB. Lý do là không thể xóa ViewController khỏi bộ nhớ do thiếu [weak self] khi đóng. Biểu đồ bộ nhớ của Xcode đã tiết lộ cái bẫy. Bài học: hồ sơ bộ nhớ là bắt buộc trong quá trình phát triển bản địa.

Trường hợp 3 - Sự khác biệt về nền tảng. Nhóm Flutter đã nhận được mã truy cập thư viện từ AI, mã này hoạt động trên Android nhưng bị lỗi trên iOS. Lý do là mô tả quyền thư viện ảnh (NSPhotoLibraryUsageDescription) chưa được thêm vào tệp Info.plist; AI chỉ viết phía Android. Đó là bản sửa lỗi trong 15 phút, nhưng nó sẽ bị cửa hàng từ chối nếu không bị phát hiện.

Dấu nhắc yếu / Dấu nhắc mạnh

Lời nhắc yếu: "Viết mã Kotlin để lấy sản phẩm từ API".

Lời nhắc mạnh mẽ: "Tạo mã cho Android/Kotlin để lấy danh sách sản phẩm từ API REST.- Lớp mạng có trang bị thêm, chức năng tạm dừng- Công việc mạng trong Dispatchers.IO; chặn luồng chính- MVVM: Kho lưu trữ -> ViewModel -> trạng thái giao diện người dùng với StateFlow- Trạng thái lỗi: không có mạng, trạng thái lớp kín riêng biệt cho 4xx, 5xx- Bảo vệ null, !! Sử dụng !! Xuất các lớp dưới dạng tệp riêng biệt, mỗi câu giải thích 1 câu."

Lời nhắc mạnh mẽ sẽ ngăn mã được tạo rơi vào bẫy của các trường hợp trước.

Mẫu có thể sao chép

Mẫu sản xuất theo lớp: "Phát triển [tính năng] cho [nền tảng/ngôn ngữ]. Sản xuất theo thứ tự:1) Mô hình dữ liệu (lớp dữ liệu/cấu trúc)2) Lớp mạng hoặc nguồn dữ liệu3) Kho lưu trữ4) ViewModel (quản lý trạng thái)5) Màn hình (UI)Xuất từng lớp riêng biệt, thêm ghi chú tích hợp giữa chúng."

Mẫu bảo mật dành riêng cho ngôn ngữ (Kotlin):"Xem lại mã Kotlin này:- Xóa cách sử dụng !! và loại nền tảng- Xác minh phạm vi Coroutine và lựa chọn bộ điều phối- Có lệnh gọi nào chặn luồng chính không?[code]"

Mẫu bảo mật dành riêng cho ngôn ngữ (Swift): "Xem lại mã Swift này:- Rủi ro về chu kỳ giữ lại khi đóng (bản thân yếu/không có chủ sở hữu)- Sử dụng tùy chọn buộc mở (!)- Công việc nặng cần được chuyển ra khỏi chuỗi chính [mã]"

Mẫu kiểm soát đa nền tảng: "Liệt kê tất cả các quyền, cấu hình và mã dành riêng cho nền tảng cần thiết cho tính năng [Flutter/React Native] này trên cả iOS và Android. Cung cấp các mục nhập Info.plist và AndroidManifest.xml riêng biệt."

Những lỗi thường gặp

  • Yêu cầu mã mà không áp đặt kiến trúc. Kết quả: cấu trúc không thể kiểm chứng được, nhồi nhét mọi thứ lên màn hình.
  • Tin tưởng mà không cần kiểm tra mã đồng thời. Khối luồng chính và phạm vi không chính xác là nguyên nhân phổ biến nhất gây ra sự cố.
  • Xem xét quản lý bộ nhớ. Đặc biệt là rò rỉ trong quá trình đóng iOS; Nó không đáng chú ý nếu không có một hồ sơ.
  • Bỏ qua sự khác biệt về nền tảng. Trong các công cụ đa nền tảng, quyền và cấu hình được viết riêng trên hai nền tảng.
  • Không xác minh phiên bản thư viện. AI có thể đề xuất API Retrofit/Alamofire lỗi thời; Kiểm tra với tài liệu chính thức.
  • Sản xuất một tập tin khổng lồ duy nhất. Không thể duy trì và xác minh; yêu cầu các lớp.

Tóm lại

Việc tạo mã bằng AI rất mạnh mẽ khi bạn chỉ định kiến ​​trúc. Đầu tiên áp đặt một cấu trúc như MVVM, sau đó yêu cầu từng lớp và từng phần nhỏ, biên dịch và kiểm tra từng phần. An toàn rỗng và coroutine trong Kotlin, vòng lặp tùy chọn và bộ nhớ trong Swift cần được chú ý đặc biệt. Trong các công cụ đa nền tảng, quyền và cấu hình được viết riêng cho từng nền tảng. Lời nhắc mạnh mẽ cho biết trước các quy tắc bảo mật về ngôn ngữ, phiên bản, kiến ​​trúc và ngôn ngữ cụ thể; Điều này ngăn ngừa các lỗi rò rỉ và sự cố phổ biến nhất trong sản xuất.

Nhiệm vụ ứng dụng

Đối với màn hình danh sách (ví dụ: “danh sách liên hệ”), hãy yêu cầu mã từ AI bằng cách sử dụng “Mẫu sản xuất bồi đắp” trong nền tảng bạn chọn (Kotlin hoặc Swift). Thêm mã được tạo vào một dự án, biên dịch nó và thực hiện hai bước kiểm tra sau: (1) mạng/quy trình dài có chạy trên luồng chính không, (2) tính an toàn rỗng/tùy chọn có đúng không? Yêu cầu AI khắc phục sự cố bạn tìm thấy bằng mẫu bảo mật dành riêng cho ngôn ngữ.

danh sách kiểm tra

  • [ ] Tôi đã chỉ định kiến trúc (MVVM, v.v.) trước khi yêu cầu mã
  • [ ] Tôi muốn nó từng lớp một, từng miếng nhỏ
  • [ ] Tôi đã kiểm tra rằng mã đồng thời không chặn luồng chính
  • [ ] Tôi đã chọn quản lý bộ nhớ và an toàn không/tùy chọn
  • [ ] Tôi đã xác minh quyền/cài đặt của hai nền tảng riêng biệt trong một dự án đa nền tảng
  • [ ] Tôi đã xác minh phiên bản thư viện và chữ ký API từ tài liệu chính thức