假设你正在开发一个在线书店项目,有一个功能是用户可以添加书籍到购物车。在添加书籍到购物车的业务逻辑中,存在一个BUG,导致用户在添加书籍时,有时会出现书籍数量错误或者无法添加的情况。是一个简化的代码片段,展示了这个业务逻辑的部分实现:
python
class ShoppingCart:
def __init__(self):
self.items = []
def add_book(self, book_id, quantity):
for item in self.items:
if item['book_id'] == book_id:
item['quantity'] += quantity
return
self.items.append({'book_id': book_id, 'quantity': quantity})
# 示例使用
cart = ShoppingCart()
cart.add_book(1, 1) # 添加书籍ID为1的书籍,数量为1
cart.add_book(1, 2) # 添加书籍ID为1的书籍,数量应为3
print(cart.items) # 预期输出:[{'book_id': 1, 'quantity': 3}]
在这个代码片段中,存在一个BUG。请这个BUG,并提供一个修复方案。
BUG分析
在上述代码中,BUG的出于`add_book`方法中的循环逻辑。该方法遍历`self.items`列表,寻找与`book_id`匹配的项,并增加其`quantity`。在列表中找到了匹配的项,就会更新其数量,并退出循环。在遍历结束后没有找到匹配的项,它会将新的书籍信息添加到列表中。
在于,在添加书籍ID为1的书籍后,紧添加书籍ID为1的书籍,第一次添加操作会成功,但第二次添加操作会将书籍信息添加为一个新的列表项,而不是增加现有列表项的`quantity`。输出将是:
[{'book_id': 1, 'quantity': 1}, {'book_id': 1, 'quantity': 2}]
这显然不符合业务逻辑,用户期望的是书籍数量累加。
修复方案
为了修复这个BUG,我们需要确保在添加新书籍或更新现有书籍数量时,始终更新列表中的第一个匹配项。是修复后的代码:
python
class ShoppingCart:
def __init__(self):
self.items = []
def add_book(self, book_id, quantity):
item_found = False
for item in self.items:
if item['book_id'] == book_id:
item['quantity'] += quantity
item_found = True
break
if not item_found:
self.items.append({'book_id': book_id, 'quantity': quantity})
# 示例使用
cart = ShoppingCart()
cart.add_book(1, 1) # 添加书籍ID为1的书籍,数量为1
cart.add_book(1, 2) # 添加书籍ID为1的书籍,数量应为3
print(cart.items) # 输出:[{'book_id': 1, 'quantity': 3}]
在这个修复方案中,我们添加了一个布尔变量`item_found`来跟踪是否找到了匹配的项。找到了,我们就更新该项的数量并退出循环。循环结束后`item_found`仍然为`False`,说明没有找到匹配的项,我们就在列表中添加一个新的列表项。
这样,无论用户添加多少次同一本书籍,购物车中的书籍数量都会正确累加。
还没有评论呢,快来抢沙发~