系统化掌握Dart编程之流程控制

494 阅读6分钟

image.png

前言

流程控制——构建灵活智能高效应用程序的基石

流程控制决定了程序的执行路径,使得代码可以根据不同的条件和输入做出响应,从而实现复杂而多变的逻辑需求。掌握流程控制结构不仅是编写功能丰富的应用的基础,也是提高代码可读性维护性优化代码性能核心技能

如果说运算符是代码逻辑的半壁江山,那流程控制 就是另外一半。流程控制包括:

1、条件控制根据不同的条件选择性执行特定的代码块

2、循环控制可以执行某个代码块若干次直到符合终止条件而结束

千曲而后晓声,观千剑而后识器。虐它千百遍方能通晓其真意

一、条件语句

1.1、if-else语句

最常用的条件语句,允许根据布尔表达式的值来决定是否执行某段代码。

  • 基本语法及示例
void ifElse(){
  //1、基本语法
  /*
    if (布尔表达式) {
      // 如果条件为 true,则执行该代码块
    } else {
      // 如果条件为 false,则执行该代码块
    }
  */
  //2、代码示例
  //金石活动计划最低等级
  double goldLevel = 4;
  double myLevel = 3;
  if(myLevel >= goldLevel){
    print("可以参加金石计划活动");
  } else {
    print("不可以参加金石计划活动");
  }
}

输出:不可以参加金石计划活动

1.2、多分支if-else if-else

当有多个条件需要判断时,可以使用 else if 实现多分支逻辑。

  • 基本语法及示例
void ifElseIf(){
  //1、基本语法
  /*
    if (布尔表达式) {
      // 执行代码块1
    } else if (布尔表达式){
     // 执行代码块2
    } else {
      // 执行默认代码块
    }
  */
  //2、代码示例
  //金石活动计划最低等级
  double goldLevel = 4;
  //创作者活动计划最低等级
  double createLevel = 3;
  double myLevel = 3;
  if(myLevel >= goldLevel){
    print("可以参加金石计划活动");
  } else if (myLevel >= createLevel){
    print("可以参加创作者计划活动");
  } else {
    print("不可以参加上述两种活动");
  }
}

输出:可以参加创作者计划活动

1.3、简洁的 if 语句

有时只需要在条件为 true 时执行某些操作,而不需要 else 分支。

  • 基本语法及示例
void ifTest(){
  //1、基本语法
  /*
    if (布尔表达式) {
      // 如果条件为 true,则执行该代码块
    }
  */
  //2、代码示例
  //掘金最高等级
  double maxLevel = 8;
  double myLevel = 8;
  if(myLevel >= maxLevel){
    print("可以参加掘金所有的活动");
  }
}

输出:可以参加掘金所有的活动

1.4、switch语句

用于匹配一个表达式的值,并根据匹配的结果执行相应的代码块。它适用于有限数量的离散值。

  • 基本语法
switch (expression) {
  case value1:
    // 执行代码块 1
    break;
  case value2:
    // 执行代码块 2
    break;
  default:
    // 默认执行代码块
}
  • 注意事项
    • 必须使用break:每个 case 后面通常需要跟一个 break 语句,以防止“贯穿”(fall-through)到下一个 case
    • 支持类型:支持整数字符串枚举等可比较类型。
    • 不可为空:表达式不能为null,否则会导致编译错误。
  • 示例代码
void testSwitch() {
  String command = "CLOSE";

  switch (command) {
    case "OPEN":
      print("Opening the door.");
      break;
    case "CLOSE":
      print("Closing the door.");
      break;
    default:
      print("Unknown command.");
  }
}

输出:Closing the door.

1.5、条件表达式(?:

一种简洁的条件判断方式,适用于简单的条件赋值

int age = 20;
String message = (age >= 18) ? "Adult" : "Minor";
print(message); // 输出: Adult

二、循环语句

编程语言之间的循环控制都是相同的功能,此处不做过多的赘述,详细内容可查看这篇文章 深入理解C语言之for循环

三、跳转语句

3.1、break语句

用于立即退出当前的循环

void testBreak() {
  for (int i = 0; i < 10; i++) {
    if (i == 5) {
      break; // 退出循环
    }
    print(i); 
  }
}

输出: 0, 1, 2, 3, 4

3.2、continue语句

用于跳过当前循环体的剩余部分,并直接进入下一次迭代

void main() {
  for (int i = 0; i < 10; i++) {
    if (i % 2 == 0) {
      continue; // 跳过偶数
    }
    print(i); 
  }
}

输出: 1, 3, 5, 7, 9

四、标签(Labels)

用于标记循环switch 语句,以便在嵌套结构中精确控制跳转

  • 使用breakcontinue结合标签:
void main() {
  outerLoop:
  for (int i = 0; i < 3; i++) {
    for (int j = 0; j < 3; j++) {
      if (i == 1 && j == 1) {
        break outerLoop; // 退出外层循环
      }
      print('i: $i, j: $j');
    }
  }
}

输出:
i: 0, j: 0
i: 0, j: 1
i: 0, j: 2
i: 1, j: 0

五、条件控制最佳实践

5.1、避免嵌套过深

过多的嵌套会使代码难以阅读和维护。尽量保持条件语句的层次扁平化

// 不推荐
if (condition1) {
  if (condition2) {
    // ...
  }
}

// 推荐
if (condition1 && condition2) {
  // ...
}

5.2、使用守卫语句

提前返回或继续循环可以帮助减少不必要的嵌套

void processUser(User user) {
  if (user == null) return; // 守卫语句

  // 继续处理用户逻辑
}

5.3、使用集合方法简化逻辑

Dart提供了许多集合方法,如 whereanyevery,可以简化复杂的条件判断。

List<int> numbers = [1, 2, 3, 4, 5];
bool hasEven = numbers.any((num) => num % 2 == 0);
print(hasEven); // 输出: true

5.4、尽量使用switch代替长链的if-else

当有多个离散值需要匹配时,switch 语句通常比长链的 if-else 更清晰和高效。

// 不推荐
if (command == "OPEN") {
  // ...
} else if (command == "CLOSE") {
  // ...
} else {
  // ...
}

// 推荐
switch (command) {
  case "OPEN":
    // ...
    break;
  case "CLOSE":
    // ...
    break;
  default:
    // ...
}

六、循环控制最佳实践

6.1、避免无限循环

确保循环条件最终会变为 false,以避免无限循环导致程序卡死崩溃

6.2、使用集合方法简化逻辑

Dart 提供了许多集合方法,如 forEachmapwhere,可以简化复杂的迭代逻辑。

List<int> numbers = [1, 2, 3, 4, 5];
numbers.forEach((number) {
  print(number); // 输出: 1, 2, 3, 4, 5
});

6.3、尽量使用增强型 for-in 循环

对于遍历集合,尽量使用增强型 for-in 循环,使代码更加简洁易读

List<int> numbers = [1, 2, 3, 4, 5];
for (var number in numbers) {
  print(number); // 输出: 1, 2, 3, 4, 5
}

6.4、合理使用标签

标签可以在复杂的嵌套结构中提供更精确的控制,但在简单情况下应尽量避免使用,以免增加不必要的复杂性。

七、总结

为什么流程控制如此重要?

  • 灵活性:通过条件语句,程序可以根据不同的情况执行不同的代码块,使应用更加灵活。
  • 自动化:循环语句允许代码自动重复执行,简化了处理大量数据或任务的过程。
  • 精确控制:跳转语句如 breakcontinue 提供了对执行流程的精细控制,确保程序按照预期运行。
  • 提高可维护性:良好的流程控制结构让代码更易于理解和维护,减少了错误的发生。
  • 优化性能:通过合理的流程控制,可以避免不必要的计算,优化程序性能。

通过掌握 if-elseswitch 语句进行条件判断,利用 forwhiledo-while 实现循环迭代,以及运用 breakcontinuereturn 进行精确的跳转控制,开发者可以构建灵活、高效且易于维护的应用程序。此外,标签(Labels)和增强型 for-in 循环等高级特性进一步提升了代码的简洁性可读性。理解并熟练应用这些流程控制机制,是编写高质量代码的关键。

码字不易,记得 关注 + 点赞 + 收藏 + 评论