You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Dart类方法优化与新增需求问询(Book/BookCatalog类)

Dart BookCatalog类优化与实现方案

基础补充:完善Book类

由于Book类的属性为私有(下划线开头),需要添加Getter方法供外部访问,同时重写toString方便打印信息:

class Book {
  late String _title;
  late int _isbn;
  late double _price;
  bool _isAvailable;

  // 构造函数
  Book(this._title, this._isbn, this._price, this._isAvailable);

  // Getter方法,暴露私有属性的只读访问
  String get title => _title;
  int get isbn => _isbn;
  double get price => _price;
  bool get isAvailable => _isAvailable;

  // 重写toString,自定义书籍打印格式
  @override
  String toString() {
    return "书名: $_title, ISBN: $_isbn, 价格: ${_price.toStringAsFixed(2)}, 可用: ${_isAvailable ? '是' : '否'}";
  }
}

BookCatalog类方法优化与实现

1. 优化addBook方法(禁止ISBN重复)

优化后代码:

void addBook(Book book) {
  // 检查列表中是否存在相同ISBN的书籍
  bool isDuplicateIsbn = _books.any((b) => b.isbn == book.isbn);
  if (isDuplicateIsbn) {
    print("添加失败:ISBN ${book.isbn} 的书籍已存在");
    return;
  }
  _books.add(book);
  print("书籍《${book.title}》添加成功");
}

语法解释:

  • 使用List.any()方法遍历列表,只要有一个元素满足ISBN相同的条件就返回true
  • 明确参数类型为Book,避免动态类型带来的潜在问题
  • 添加操作反馈,方便调试与用户感知

2. 优化printBookCatalog方法(仅打印可用书籍)

优化后代码:

void printBookCatalog() {
  print("===== 可用书籍列表 =====");
  // 过滤出_isAvailable为true的书籍
  List<Book> availableBooks = _books.where((b) => b.isAvailable).toList();
  if (availableBooks.isEmpty) {
    print("暂无可用书籍");
    return;
  }
  availableBooks.forEach((book) => print(book));
}

语法解释:

  • 使用List.where()方法过滤元素,返回符合条件的迭代器后转为List
  • 处理空列表场景,避免无意义的遍历
  • 用forEach()简化遍历打印逻辑

3. 修复getBook方法(按ISBN获取书籍)

修复后代码:

Book? getBookByIsbn(int isbn) {
  // 查找匹配ISBN的书籍,找不到则返回null
  return _books.firstWhere(
    (b) => b.isbn == isbn,
    orElse: () => null,
  );
}

语法解释:

  • 重命名方法为getBookByIsbn,语义更清晰
  • 使用List.firstWhere()查找首个匹配元素,通过orElse指定找不到时的返回值(null)
  • 返回类型设为Book?(可空类型),符合Dart空安全规范,避免找不到书籍时抛出异常

4. 修复calculateAvgPrice方法(正确计算平均价格)

修复后代码:

double calculateAvgPrice() {
  if (_books.isEmpty) {
    print("无法计算:书籍列表为空");
    return 0.0;
  }
  double totalPrice = 0.0;
  for (var book in _books) {
    totalPrice += book.price;
  }
  return totalPrice / _books.length;
}

语法解释:

  • 修正返回类型为double(原代码错误返回Book)
  • 移除无用参数,初始化总价变量totalPrice
  • 先判断列表是否为空,避免除以0的运行时错误
  • 通过Book的Getter方法price获取私有属性值

5. 完善deleteBook方法(可靠实现删除功能)

提供两种删除方式,满足不同场景需求:

// 方式1:按书籍实例删除(需确保实例在列表中)
void deleteBook(Book book) {
  if (_books.contains(book)) {
    _books.remove(book);
    print("书籍《${book.title}》删除成功");
  } else {
    print("删除失败:未找到该书籍实例");
  }
}

// 方式2:按ISBN删除(更实用)
void deleteBookByIsbn(int isbn) {
  Book? targetBook = getBookByIsbn(isbn);
  if (targetBook != null) {
    _books.remove(targetBook);
    print("ISBN ${isbn} 的书籍删除成功");
  } else {
    print("删除失败:未找到ISBN为${isbn}的书籍");
  }
}

语法解释:

  • 原代码的remove(book)仅对列表中存在的实例有效,添加contains()检查避免无效操作
  • 新增按ISBN删除的方法,更符合实际使用场景(用户通常知道ISBN而非持有对象实例)
  • 复用之前实现的getBookByIsbn方法,减少重复代码

Dart核心语法学习重点

  • 类与对象:掌握私有成员、Getter/Setter、构造函数、toString重写的使用
  • 集合操作:熟练运用List的where/any/firstWhere/remove等常用方法
  • 空安全:理解可空类型(?)、非空断言(!)、null-aware操作符的规范使用
  • 函数与方法:明确参数类型、返回值类型,避免动态类型带来的问题

内容的提问来源于stack exchange,提问作者Alexy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 02:05:22