הפוך תכונות אופציונליות לאוספים ריקים עבור קוד נקי יותר, מאובטח יותר ופולימורפי, מבטל את הטעות של מיליארד דולר
TL;DR: להחליף תכונות אופציונליות ניתנות להורדה עם אוספים ריקים כדי לחסל בדיקות null ולנצל פולימורפיזם.
TL;DR: להחליף תכונות אופציונליות ניתנות להורדה עם אוספים ריקים כדי לחסל בדיקות null ולנצל פולימורפיזם.
בעיות שנפתרו
- אפס יוצאים מן הכלל
- לוגיקה מוגזמת ו- IFs
- התנהגות שגויה
- תכונות אופציונליות
- קוד אימות מורכב
- הפרת פולימורפיזם
הקוד הקשור לריח
צעדים
- זיהוי המאפיינים האפשריים שאינם ניתנים לביטול שיכולים להיות אוספים
- החלפת אובייקטים חד-פעמיים עם אוספים ריקים
- הסר את כל הבדיקות null הקשורות לאותן תכונות אופציונליות אלה
- עדכון שיטות כדי לעבוד עם אוספים במקום אובייקטים בודדים
קוד דוגמה
לפני
public class ShoppingCart {
private List<Item> items = new ArrayList<>();
private Coupon coupon = null;
public void addItem(Item item) {
this.items.add(item);
}
public void redeemCoupon(Coupon coupon) {
this.coupon = coupon;
}
public double total() {
double total = 0;
for (Item item : this.items) {
total += item.getPrice();
}
// This a polluted IF and null check
if (this.coupon != null) {
total -= this.coupon.getDiscount();
}
return total;
}
public boolean hasUnsavedChanges() {
// Explicit null check
return !this.items.isEmpty() || this.coupon != null;
}
public boolean hasCoupon() {
return this.coupon != null;
}
}
public class ShoppingCart {
private final List<Item> items = new ArrayList<>();
// This version uses Optionals
// Not all programming languages support this feature
private Optional<Coupon> coupon = Optional.empty();
public void addItem(Item item) {
items.add(item);
}
public void redeemCoupon(Coupon coupon) {
// You need to understand how optionals work
this.coupon = Optional.ofNullable(coupon);
}
public boolean hasUnsavedChanges() {
return !items.isEmpty() || !coupon.isPresent();
}
public boolean hasCoupon() {
return coupon.isPresent();
}
}
אחרי 🙂
public class ShoppingCart {
private List<Item> items = new ArrayList<>();
// 1. Identify nullable optional attributes
// that could be collections
// 2. Replace single nullable objects with empty collections
private List<Coupon> coupons = new ArrayList<>();
public void addItem(Item item) {
this.items.add(item);
}
// Step 4: Work with collection
// instead of single nullable object
public void redeemCoupon(Coupon coupon) {
this.coupons.add(coupon);
}
// Step 4: Simplified logic without null checks
public double total() {
double total = 0;
for (Item item : this.items) {
total += item.getPrice();
}
// 3. Remove all null checks
// related to these optional attributes
for (Coupon coupon : this.coupons) {
total -= coupon.getDiscount();
}
return total;
}
// Consistent behavior with empty collections
public boolean hasUnsavedChanges() {
// 4. Update methods to work with collections
// instead of single objects
return !this.items.isEmpty() || !this.coupons.isEmpty();
}
// 3. Remove all null checks
// related to these optional attributes
// Collection-based check instead of null check
public boolean hasCoupon() {
return !this.coupons.isEmpty();
}
}
סוג
- [x] חצי אוטומטי
בטיחות ️
חידוש זה הוא בדרך כלל מאובטח כאשר אתה שולט בכל נקודות הגישה של תכונות האוסף.
אתה צריך לוודא כי אין קוד חיצוני מצפה ערכים null ולעבוד עם API הפנימי.
החידוש שומר על אותו התנהגות חיצונית תוך הפשטת ההיגיון הפנימי.
עליך לוודא כי כל יצרנים ושיטות המפעל להתחיל אוספים כראוי.
למה הקוד טוב יותר?
הקוד המתוקן מחליף0 נקודות יוצא מן הכלללהפחית את המורכבות המוסרית.
אוספים ריקים ואוספים שאינם ריקים מתנהגים פולימורפית, ומאפשרים לך לטפל בהם באופן שווה.
הקוד הופך להיות צפוי יותר מאז אוספים תמיד קיימים (לפחות ריקים) ומגיבים לאותם פעולות.
יישומים של שיטות הופכים לקצרים יותר ומתמקדים יותר בלוגיקה עסקית במקום לניהול אפס.
הגישה תואמת את העיקרון של להפוך את המדינות הלא חוקיות לא מייצגות במודל התחום שלך, מה שמוביל לקוד חזק יותר וניתן לשמור עליו.
אוספים ריקים ולא אוספים ריקיםpolymorphic.
איך זה משפר את ההשפעה? ️
בעולם האמיתי, מכולות קיימות גם כאשר הן ריקות.
על ידי הצגת אוספים אופציונליים כאוספים ריקים במקום null, אתה יוצר מודל מדויק יותר של המציאות.
אפס אינו קיים בעולם האמיתי, והוא תמיד שובר אתbijection.
זה שומר על התואמות אחד-אחד בין מושגים בעולם האמיתי ואת המודל החישובי שלך, יצירתמפה.
כאשר אתה מחזיר אוסף במקום אפס, אתה גם מפחית אתקואליציה.
מגבלות ️
refactoring זה לא יכול להיות מתאים כאשר null יש משמעות סמנטית שונה מ" ריק".
עליך להבטיח שכל מסלולי הקוד יתחילו אוספים באופן עקבי על מנת להימנע ממצבי null מעורבים ומצבי ריקים.
תגית: Refactor with AI
הצעה: 1.הזהות של מאפיינים אופציונליים שניתן להחזיר שיכולים להיות אוספים 2.החליף אובייקטים יחידים שניתן להחזיר באוספים ריקים 3.הסר את כל מבחני null הקשורים לאותם מאפיינים אופציונליים 4.העדכון של שיטות כדי לעבוד עם אוספים במקום אובייקטים יחידים 5.הבדיקה כי אוספים ריקים ולא ריקים מתנהגים באופן עקבי
הצעה: 1.הזהות של מאפיינים אופציונליים שניתן להחזיר שיכולים להיות אוספים 2.החליף אובייקטים יחידים שניתן להחזיר באוספים ריקים 3.הסר את כל מבחני null הקשורים לאותם מאפיינים אופציונליים 4.העדכון של שיטות כדי לעבוד עם אוספים במקום אובייקטים יחידים 5.הבדיקה כי אוספים ריקים ולא ריקים מתנהגים באופן עקבי
Without Proper Instructions |
With Specific Instructions |
---|---|
יום יום ️
- אפס
רמה 62
- [x] ביניים
תגיות קשורות
זהו
קרדיט
מאמר זה הוא חלק מהסדרה Refactoring.