0
0
Lập trình
Sơn Tùng Lê
Sơn Tùng Lê103931498422911686980

Kế hoạch phát triển Flutter: Xây dựng nền tảng vững chắc

Đăng vào 1 tháng trước

• 7 phút đọc

Giới thiệu

Trong nhiều năm làm việc với các nhóm phát triển phần mềm, tôi đã thấy rằng những dự án thành công thường có nền tảng vững chắc, trong khi những dự án khác thường gặp khó khăn khi nền tảng không đủ mạnh. Nền tảng trong phát triển ứng dụng thường phụ thuộc vào cách bạn cấu trúc mã nguồn và các tiêu chuẩn lập trình.

Một kế hoạch không chỉ đơn thuần là mẫu dự án. Nó là một tập hợp các tiêu chuẩn lập trình và mẫu được áp dụng nhất quán trong suốt dự án của bạn. Mục tiêu rất đơn giản: giảm thiểu các quyết định lặp đi lặp lại, thực thi các thực tiễn tốt nhất và cho phép các lập trình viên tập trung vào logic kinh doanh thay vì mã mẫu.

Trong thực tế, việc thiết lập và thực thi những kế hoạch này cần thời gian. Các công cụ như HuTouch đã đóng gói chúng, mở rộng thêm cuộc tranh luận giữa Tự động hóa và Gợi ý hoặc giải quyết các nhiệm vụ lặp lại trước để xây dựng WORK2.0, nhưng trước khi đến đó, hãy cùng tìm hiểu lý do tại sao mỗi danh mục lại quan trọng.


Tổng quan nhanh về Kế hoạch

Danh mục Tại sao nó quan trọng Mẫu ví dụ
Kiến trúc Nền tảng cho việc mở rộng và bảo trì Kiến trúc sạch, MVC
Quản lý trạng thái Kiểm soát cách dữ liệu chảy và phản ứng Provider, Riverpod, BLoC, GetX
Cấu trúc dự án Tổ chức mã nguồn để dễ hiểu và dễ dàng tiếp cận Theo tính năng, theo lớp
Giao diện và phong cách Đảm bảo thiết kế nhất quán và tái sử dụng Bố cục đáp ứng, token thiết kế, widget
Địa phương hóa Mở rộng ứng dụng của bạn đến người dùng toàn cầu Flutter Intl, tệp ARB
Xử lý lỗi và ghi log Ngăn ngừa sự cố im lặng, hỗ trợ gỡ lỗi Lớp Failure, thiết lập Logger
API và lớp dữ liệu Tách biệt rõ ràng việc truy cập dữ liệu bên ngoài REST (http, Dio), GraphQL
Tiêm phụ thuộc Giảm độ liên kết, cải thiện khả năng kiểm thử GetIt, Riverpod DI
Kiểm thử Bảo vệ chống lại các lỗi hồi quy, xây dựng sự tự tin Kiểm thử đơn vị, kiểm thử widget
Điều hướng và định tuyến Hình thành trải nghiệm người dùng và khả năng đọc mã Navigator 2.0, GoRouter, AutoRoute
Cấu hình xây dựng và triển khai Bảo vệ môi trường và quy trình phát hành Flavors, biến môi trường, kịch bản CI/CD

1. Kiến trúc

Định nghĩa: Kiến trúc là cấu trúc tổng thể của dự án, cách các lớp tương tác và trách nhiệm được phân chia.

Tầm quan trọng: Một kiến trúc tốt giảm độ phức tạp, cải thiện khả năng bảo trì, và cho phép các nhóm mở rộng ứng dụng mà không làm hỏng mã hiện có.

Ví dụ

Kiến trúc sạch (Domain, Data, Presentation layers)

dart Copy
abstract class AuthRepository {
  Future<User> login(String email, String password);
}

class AuthRepositoryImpl implements AuthRepository {
  final HttpClient client;
  AuthRepositoryImpl(this.client);

  @override
  Future<User> login(String email, String password) async {
    final response = await client.post('/login', body: {...});
    return User.fromJson(response.data);
  }
}

MVC (Model, View, Controller)

dart Copy
class User {
  final String name;
  User(this.name);
}

class AuthController with ChangeNotifier {
  String? userName;

  void login(String name) {
    userName = name;
    notifyListeners();
  }
}

Consumer<AuthController>(
  builder: (_, controller, __) => Text('Xin chào ${controller.userName}'),
)

2. Quản lý trạng thái

Định nghĩa: Cách ứng dụng của bạn quản lý và phản ứng với các thay đổi trong dữ liệu.

Tầm quan trọng: Việc chọn quản lý trạng thái phù hợp ảnh hưởng đến hiệu suất, khả năng đọc và khả năng mở rộng.

Ví dụ

Provider

dart Copy
class Counter with ChangeNotifier {
  int value = 0;
  void increment() {
    value++;
    notifyListeners();
  }
}

Riverpod

dart Copy
final counterProvider = StateProvider<int>((ref) => 0);

Consumer(
  builder: (_, ref, __) {
    final count = ref.watch(counterProvider);
    return Text('$count');
  },
);

3. Cấu trúc dự án

Định nghĩa: Cách mã được tổ chức theo thư mục và tệp.

Tầm quan trọng: Cấu trúc xác định tốc độ mà các lập trình viên mới có thể bắt đầu và tính dễ dàng trong việc tìm kiếm logic sau này.

Ví dụ

Theo tính năng

text Copy
lib/
  features/
    auth/
      data/
      domain/
      presentation/

Theo lớp

text Copy
lib/
  data/
  domain/
  presentation/

4. Giao diện và phong cách

Định nghĩa: Các quy tắc về tính đáp ứng, chủ đề, kiểu chữ và các widget tái sử dụng.

Tầm quan trọng: Việc thiết kế nhất quán tạo ra một cái nhìn chuyên nghiệp và giảm thiểu sự lặp lại.

Ví dụ

Bố cục đáp ứng

dart Copy
LayoutBuilder(
  builder: (context, constraints) {
    return constraints.maxWidth > 600 
      ? WideLayout() 
      : NarrowLayout();
  },
);

Thành phần tái sử dụng

dart Copy
class SectionHeader extends StatelessWidget {
  final String title;
  const SectionHeader(this.title);

  @override
  Widget build(BuildContext context) {
    return Text(title, style: Theme.of(context).textTheme.headline6);
  }
}

5. Địa phương hóa và Quốc tế hóa

Định nghĩa: Hỗ trợ nhiều ngôn ngữ và khu vực.

Tầm quan trọng: Cần thiết cho các ứng dụng nhắm đến thị trường toàn cầu.

Ví dụ

Intl trong mã

dart Copy
Text(AppLocalizations.of(context)!.helloWorld);

Tệp ARB

json Copy
{
  "helloWorld": "Xin chào Thế giới",
  "@helloWorld": {
    "description": "Văn bản cho Xin chào Thế giới"
  }
}

6. Xử lý lỗi và ghi log

Định nghĩa: Các chiến lược để ghi lại và báo cáo lỗi thời gian chạy.

Tầm quan trọng: Ngăn ngừa các lỗi im lặng và cung cấp cái nhìn cho việc gỡ lỗi.

Ví dụ

dart Copy
try {
  await repository.login(email, pass);
} catch (e, stack) {
  logger.severe('Đăng nhập thất bại', e, stack);
}
dart Copy
class Failure {
  final String message;
  Failure(this.message);
}

7. API và lớp dữ liệu

Định nghĩa: Cách ứng dụng của bạn giao tiếp với máy chủ hoặc cơ sở dữ liệu.

Tầm quan trọng: Tách biệt rõ ràng đảm bảo khả năng kiểm thử và độ tin cậy.

Ví dụ

Http (Dart tích hợp sẵn)

dart Copy
final response = await http.get(Uri.parse('https://api.example.com'));

Dio

dart Copy
final dio = Dio();
final response = await dio.get('/users');

8. Tiêm phụ thuộc

Định nghĩa: Cung cấp cho các đối tượng các phụ thuộc của chúng thay vì tạo chúng bên trong.

Tầm quan trọng: Cho phép kiểm thử và giảm độ liên kết.

Ví dụ

GetIt

dart Copy
final getIt = GetIt.instance;
getIt.registerLazySingleton<AuthRepository>(() => AuthRepositoryImpl());

Riverpod

dart Copy
final authRepoProvider = Provider<AuthRepository>((ref) => AuthRepositoryImpl());

9. Kiểm thử

Định nghĩa: Các kiểm tra tự động cho logic, giao diện người dùng và tích hợp.

Tầm quan trọng: Bảo vệ chống lại các lỗi hồi quy và cải thiện sự tự tin.

Ví dụ

Kiểm thử đơn vị

dart Copy
test('cộng hai số', () {
  expect(1 + 2, 3);
});

Kiểm thử widget

dart Copy
testWidgets('Counter tăng lên', (tester) async {
  await tester.pumpWidget(MyApp());
  await tester.tap(find.byIcon(Icons.add));
  await tester.pump();
  expect(find.text('1'), findsOneWidget);
});

10. Điều hướng và định tuyến

Định nghĩa: Chiến lược để di chuyển giữa các màn hình.

Tầm quan trọng: Ảnh hưởng đến năng suất của lập trình viên và trải nghiệm người dùng.

Ví dụ

Navigator 2.0

dart Copy
Navigator.of(context).push(MaterialPageRoute(builder: (_) => DetailsPage()));

GoRouter

dart Copy
final router = GoRouter(
  routes: [GoRoute(path: '/home', builder: (_, __) => HomePage())],
);

11. Cấu hình xây dựng và triển khai

Định nghĩa: Các cấu hình cho flavors, môi trường và pipeline CI/CD.

Tầm quan trọng: Ngăn ngừa sai sót giữa các môi trường staging, QA và production.

Ví dụ

Flavors

bash Copy
flutter build apk --flavor staging -t lib/main_staging.dart

Cấu hình môi trường

dart Copy
const apiBaseUrl = String.fromEnvironment('API_URL');

Kết luận

Kế hoạch không chỉ là những sở thích. Chúng là những mẫu đã được chứng minh giúp giảm nợ kỹ thuật, rút ngắn thời gian đào tạo và tạo ra những ứng dụng nhất quán, đáng tin cậy. Đối với các freelancer và công ty, chúng có thể là sự khác biệt giữa một quá trình giao hàng suôn sẻ và những công việc tái thực hiện đau đầu.

HuTouch đã đưa những kế hoạch đã được chứng minh này và làm cho chúng có sẵn để các lập trình viên Flutter có thể tạo ra mã sẵn sàng cho sản xuất ngay từ ngày đầu tiên. Nhưng điều đó không dừng lại ở đó. HuTouch là do cộng đồng điều hành. Bạn không chỉ có thể sử dụng các kế hoạch đã được thiết lập mà còn xuất bản kế hoạch của riêng bạn, chia sẻ cách bạn cấu trúc ứng dụng. Nói cách khác, tiêu chuẩn lập trình của bạn, lựa chọn kiến trúc của bạn, phong cách của bạn có thể trở thành một phần của hệ sinh thái. Đây là cách đóng góp DNA lập trình của bạn cho cộng đồng, đồng thời hưởng lợi từ độ tin cậy của những gì người khác đã hoàn thiện.

Điều này làm cho các kế hoạch trở nên mạnh mẽ: một nền tảng được xây dựng trên kinh nghiệm, và một tương lai được định hình bởi những lập trình viên như bạn.

Bạn nghĩ sao?

  • Danh mục kế hoạch nào bạn thường dựa vào nhất trong các dự án của mình?
  • Bạn thích sự linh hoạt hay những mẫu nghiêm ngặt để giữ cho các đội ngũ nhất quán?
  • Bạn có muốn chia sẻ kế hoạch lập trình của riêng mình nếu có cơ hội không?

Tham gia thảo luận bên dưới. Hãy cùng học hỏi từ DNA lập trình của nhau.

Gợi ý câu hỏi phỏng vấn
Không có dữ liệu

Không có dữ liệu

Bài viết được đề xuất
Bài viết cùng tác giả

Bình luận

Chưa có bình luận nào

Chưa có bình luận nào