背景
在计算机专业的面试中,面试官往往会通过具体的来考察者的实际编程能力、逻辑思维能力和解决能力。是一个典型的业务逻辑BUG排查与分析的面试我们将通过分析来找出BUG并给出解决方案。
—
:
假设你正在开发一个在线图书销售系统,系统中有一个功能是允许用户添加图书到购物车。在添加图书到购物车的业务逻辑中,系统要求用户必须输入图书的ISBN号码,每个用户的购物车中不能添加重复的图书。是一个简化版的添加图书到购物车的代码实现,请找出代码中的BUG并解释原因。
python
class ShoppingCart:
def __init__(self):
self.books = []
def add_book(self, isbn, book_name):
if isbn not in self.books:
self.books.append({'isbn': isbn, 'book_name': book_name})
print(f"Book '{book_name}' added to cart.")
else:
print("Book already in cart.")
# 示例使用
cart = ShoppingCart()
cart.add_book("1234567890", "Python Programming")
cart.add_book("1234567890", "Python Programming") # 这条记录应该不会添加到购物车
—
BUG分析
我们需要运行上述代码来观察其行为。从代码的逻辑来看,`add_book`方法检查`isbn`是否已存在于`self.books`列表中,不存在,则将其添加到列表中。这里存在一个潜在的。
当用户尝试添加一本ISBN为"1234567890"的图书时,第一次调用`add_book`方法,ISBN不在`self.books`列表中,图书被成功添加到购物车。当用户尝试添加同一ISBN的图书时,由于ISBN已经存在于列表中,根据当前逻辑,系统会输出“Book already in cart.”并阻止图书添加。
BUG解释
出在`self.books`列表中存储的图书信息。列表中存储的是包含`isbn`和`book_name`的字典,没有考虑字典的顺序性。在Python中,列表是无序的,这意味着即使两个字典的键值对相同,只要它们的引用不同,它们在列表中的位置不同,它们也会被视为不同的元素。
尽管两个字典的`isbn`和`book_name`值相同,由于它们是不同的对象,`isbn`在`self.books`列表中依然被检查为不存在,导致第二次尝试添加图书时,系统认为ISBN未在购物车中,允许添加。
解决方案
为了修复这个我们需要修改`add_book`方法,使其能够检查图书是否已存在于购物车中,而不是仅仅检查ISBN。这可以通过将图书信息转换为一个不可变的元组来实现,检查这个元组是否已经在`self.books`列表中。
是修改后的代码:
python
class ShoppingCart:
def __init__(self):
self.books = []
def add_book(self, isbn, book_name):
book_info = (isbn, book_name)
if book_info not in self.books:
self.books.append(book_info)
print(f"Book '{book_name}' added to cart.")
else:
print("Book already in cart.")
# 示例使用
cart = ShoppingCart()
cart.add_book("1234567890", "Python Programming")
cart.add_book("1234567890", "Python Programming") # 这条记录应该不会添加到购物车
在这个修改后的版本中,`add_book`方法创建了一个元组`book_info`,它包含了ISBN和书名。由于元组是不可变的,我们可以安全地将其添加到列表中,能够正确地检查是否已存在相同的图书信息。
通过这个面试我们可以看到,即使是一个简单的功能实现,也可能隐藏着复杂的逻辑陷阱。在排查BUG时,重要的是要理解数据结构和算法的工作原理,以及它们如何影响程序的预期行为。良编码实践,如使用不可变数据结构和清晰的逻辑,可以帮助减少这种类型的BUG。
还没有评论呢,快来抢沙发~