Best Practices beim Programmieren und Effektives Code Review
Präsentation ansehenDer Goldstandard. Zehn Kategorien zur Bewertung jedes Pull Requests, den Sie prüfen.
x, tmp, data, calc, process; tief verschachtelte Logik; große unklare Funktionen> 0; keine Testfälle für ungültige Eingaben; keine Tests für geänderte LogikNone ohne Erklärung; verschluckte Exceptions; versteckte FehlermodiProfessionelle Formulierungen für häufige Review-Szenarien. Verwenden Sie diese als Ausgangspunkt.
Ein absichtlich fehlerhafter PR zum Üben. Können Sie die Probleme finden?
def calc(items, user, d=False):
t = 0
for i in items:
if i["type"] == "book":
t += i["price"] * 0.9
else:
t += i["price"]
if d:
t = t - t * 0.1
if user is not None:
if "is_premium" in user:
if user["is_premium"] == True:
t = t - t * 0.05
return t
def process_cart(items, user):
total = calc(items, user, True)
print("cart processed")
return totalfrom src.cart import calc
def test_calc():
items = [{"type": "book", "price": 100}]
user = {"is_premium": True}
assert calc(items, user, True) > 0# Cart Project
cart logiccalc ist zu allgemein - sollte calculate_cart_total seind ist unklar - sollte discount_enabled seint und i sind nicht aussagekräftig0.9, 0.1, 0.05 sollten benannte Konstanten seinif-Blöcke für Premium-Prüfung - verwenden Sie .get()process_cart hat einen Seiteneffekt (print) gemischt mit Geschäftslogikd=False, der positionell als True übergeben wird, ist verwirrend> 0 überprüft nicht die Korrektheitprocess_cart nichtBOOK_DISCOUNT_RATE = 0.10
GENERAL_DISCOUNT_RATE = 0.10
PREMIUM_DISCOUNT_RATE = 0.05
def calculate_item_price(item):
item_type = item["type"]
price = item["price"]
if item_type == "book":
return price * (1 - BOOK_DISCOUNT_RATE)
return price
def apply_general_discount(total_price, discount_enabled):
if not discount_enabled:
return total_price
return total_price * (1 - GENERAL_DISCOUNT_RATE)
def apply_premium_discount(total_price, user):
if not user or not user.get("is_premium", False):
return total_price
return total_price * (1 - PREMIUM_DISCOUNT_RATE)
def calculate_cart_total(items, user, discount_enabled=False):
total_price = 0
for item in items:
total_price += calculate_item_price(item)
total_price = apply_general_discount(total_price, discount_enabled)
total_price = apply_premium_discount(total_price, user)
return total_price
def process_cart(items, user):
total_price = calculate_cart_total(items, user, discount_enabled=True)
return total_pricePR-Review-Aufgabe: Reviewen Sie wie ein professioneller Ingenieur
Ihre Abgabe muss enthalten:
File: src/orders.py Line/Area: calc function Comment: The function name is too generic. Could we rename it to calculate_order_total for clarity? File: tests/test_orders.py Line/Area: test_calc Comment: This test only checks that the result is greater than zero. Could we assert the exact expected value instead?
Prüfen Sie die folgenden Dateien:
def calc(items, vip=False):
total = 0
for i in items:
if i["type"] == "book":
total += i["price"] * 0.9
elif i["type"] == "electronics":
total += i["price"]
else:
total += i["price"]
if vip == True:
total = total - total * 0.05
return total
def checkout(items, user):
total = calc(items, user["vip"])
print("checking out order...")
print("total is", total)
return {"ok": True, "total": total}def f(x):
if x == None:
return False
return Truefrom src.orders import calc
def test_calc():
items = [{"type": "book", "price": 100}]
assert calc(items, False) > 0# Orders
Run it with python.Großartige Ingenieure bringen Code nicht nur zum Laufen. Sie machen Code verständlich, testbar, überprüfbar und vertrauenswürdig.