Skip to content

最佳实践建议

代码风格

命名约定

dart
// 类:大驼峰命名法
class UserProfile {}

// 变量、函数:小驼峰命名法
String userName = 'Alice';
void calculateTotal() {}

// 常量:小驼峰命名法
const maxRetries = 3;
const apiEndpoint = 'https://api.example.com';

// 私有成员:下划线前缀
class BankAccount {
  double _balance;
}

// 库:小写加下划线
import 'package:my_app/user_service.dart';

使用类型注解

dart
// 好
String getName() => 'Alice';
List<int> getNumbers() => [1, 2, 3];

// 避免
getName() => 'Alice';  // 类型不清楚

优先使用 final 而不是 var

dart
// 好
final name = 'Alice';
final numbers = [1, 2, 3];

// 不太推荐
var name = 'Alice';

空安全

dart
// 始终安全地处理空值
String? getName() => null;

void main() {
  // 好
  String name = getName() ?? '访客';
  
  // 好
  String? maybeName = getName();
  if (maybeName != null) {
    print(maybeName.toUpperCase());
  }
  
  // 避免
  // String name = getName()!;  // 有风险!
}

函数

保持函数简短

dart
// 好 - 单一职责
bool isValidEmail(String email) {
  return email.contains('@') && email.contains('.');
}

bool isAdult(int age) {
  return age >= 18;
}

// 避免 - 做太多事情
void processUser(Map user) {
  // 100 行代码...
}

使用命名参数

dart
// 好
void createUser({
  required String name,
  required String email,
  int age = 0,
}) {}

// 不太清晰
void createUser(String name, String email, int age) {}

集合

使用集合字面量

dart
// 好
var list = <int>[];
var map = <String, int>{};
var set = <String>{};

// 避免
var list = List<int>();
var map = Map<String, int>();

使用集合 If/For

dart
// 好
var numbers = [
  1,
  2,
  if (includeThree) 3,
  for (var i in extras) i,
];

// 避免
var numbers = [1, 2];
if (includeThree) numbers.add(3);
for (var i in extras) numbers.add(i);

使用初始化形式参数

dart
// 好
class Point {
  final double x, y;
  Point(this.x, this.y);
}

// 避免
class Point {
  final double x, y;
  Point(double x, double y) {
    this.x = x;
    this.y = y;
  }
}

优先使用组合而不是继承

dart
// 好
class Car {
  final Engine engine;
  Car(this.engine);
}

// 不太灵活
class Car extends Engine {}

异步编程

始终使用 async/await

dart
// 好
Future<String> fetchData() async {
  var response = await http.get(url);
  return response.body;
}

// 避免
Future<String> fetchData() {
  return http.get(url).then((response) {
    return response.body;
  });
}

处理错误

dart
Future<void> loadData() async {
  try {
    var data = await fetchData();
    processData(data);
  } catch (e) {
    print('错误:$e');
  }
}

性能

使用 const 构造函数

dart
// 好 - 只创建一次
const icon = Icon(Icons.home);

// 效率较低 - 每次都创建
final icon = Icon(Icons.home);

文档

为公共 API 编写文档

dart
/// 计算圆的面积。
///
/// [radius] 必须为正数。
/// 返回 double 类型的面积。
double calculateCircleArea(double radius) {
  assert(radius > 0, '半径必须为正数');
  return 3.14159 * radius * radius;
}

测试

编写测试

dart
import 'package:test/test.dart';

void main() {
  test('加法有效', () {
    expect(2 + 2, equals(4));
  });
  
  test('字符串包含子字符串', () {
    expect('你好,世界', contains('世界'));
  });
}

总结

  1. 遵循命名约定
  2. 使用类型注解以提高清晰度
  3. 拥抱空安全
  4. 保持函数小巧且专注
  5. 使用命名参数以提高清晰度
  6. 优先使用 constfinal
  7. 正确处理错误
  8. 为公共 API 编写文档
  9. 编写测试
  10. 使用 linter(analysis_options.yaml)

下一步