Արդյոք, ինչպիսիք են այն, ինչպիսիք են այն, ինչպիսիք են այն, ինչպիսիք են այն, ինչպիսիք են այն, ինչպիսիք են այն, ինչպիսիք են այն.
ՀիմնականTL;DR: Կառուցեք կամ փոխեք getters- ի հետ գործառույթների խոշոր մեթոդներ, որոնք կատարում են գործառույթներ, այլեւ բացահայտել ներքին պայմանները:
Հիմնական
TL;DR: Կառուցեք կամ փոխեք getters- ի հետ գործառույթների խոշոր մեթոդներ, որոնք կատարում են գործառույթներ, այլեւ բացահայտել ներքին պայմանները:
Հիմնական խնդիրներ
- Հիմնական
- Anemic գործիքներ Հիմնական
- Բարձր համատեղ Հիմնական
- Հեռնել encapsulation Հիմնական
- Հիմնական mutage Հիմնական
- Demeter- ի կարգի վերլուծություններ Հիմնական
- Տեղադրողություն Հիմնական
- Արդյունաբերական արտահայտություններ Հիմնական
- Հիմնական Obsession Հիմնական
Հիմնական հոդված՝ Հիմնական հոդված՝ Հիմնական հոդված՝ Հիմնական հոդված
https://hackernoon.com/how-to-find-the-stinky-parts-of-your-code-part-xiv
https://hackernoon.com/how-to-find-the-stinky-parts-of-your-code-part-i-xqz3evd
https://hackernoon.com/how-to-find-the-stinky-parts-of-your-code-part-xiii
https://hackernoon.com/how-to-find-the-stinky-parts-of-your-code-part-xiv
https://hackernoon.com/how-to-find-the-stinky-parts-of-your-code-part-xxix
https://hackernoon.com/how-to-find-the-stinky-parts-of-your-code-part-xiv
https://hackernoon.com/how-to-find-the-stinky-parts-of-your-code-part-xiii
https://hackernoon.com/how-to-find-the-stinky-parts-of-your-code-part-i-xqz3evd
https://hackernoon.com/how-to-find-the-stinky-parts-of-your-code-part-xxv
Հիմնական քայլեր
- Հիմնական
- Տեղադրեք getters, որոնք բացահայտել են internal object state Հիմնական
- Տեղադրեք բոլոր սխալները CodeBase- ում Հիմնական
- Մուտք գործել գործառույթը, որը օգտագործում է getter- ը ինքներդ օդանավի մեջ Հիմնական
- Գործիքներ կատարելու intention-revealing մեթոդների ստեղծում (լուծել get prefix) Հիմնական
- Օգտագործեք ձեր կոդը նոր մեթոդների օգտագործման համար Հիմնական
Հիմնական կոդը
Երբ
public class Invoice {
private List<LineItem> items;
private Customer customer;
private LocalDate dueDate;
public Invoice(Customer customer, LocalDate dueDate) {
this.customer = customer;
this.dueDate = dueDate;
this.items = new ArrayList<>();
}
public void addItem(LineItem item) {
// This is the right way
// to manipulate the internal consistency
// adding assertions and access control if necessary
items.add(item);
}
public List<LineItem> getItems() {
// You are exposing your internal implementation
// In some languages, you also open a backdoor to
// manipulate your own collection unless you return
// a copy
return items;
}
public Customer getCustomer() {
// You expose your accidental implementation
return customer;
}
public LocalDate getDueDate() {
// You expose your accidental implementation
return dueDate;
}
}
Invoice invoice = new Invoice(customer, dueDate);
// Calculate the total violating encapsulation principle
double total = 0;
for (LineItem item : invoice.getItems()) {
total += item.getPrice() * item.getQuantity();
}
// Check if the invoice is overdue
boolean isOverdue = LocalDate.now().isAfter(invoice.getDueDate());
// Print the customer information
System.out.println("Customer: " + invoice.getCustomer().getName());
Հաջորդ
public class Invoice {
private List<LineItem> items;
private Customer customer;
private LocalDate dueDate;
public Invoice(Customer customer, LocalDate dueDate) {
this.customer = customer;
this.dueDate = dueDate;
this.items = new ArrayList<>();
}
public void addItem(LineItem item) {
items.add(item);
}
// Step 3: Move behavior that uses the getter into the object
public double calculateTotal() {
// Step 4: Create intention-revealing methods
double total = 0;
for (LineItem item : items) {
total += item.price() * item.quantity();
}
return total;
}
public boolean isOverdue(date) {
// Step 4: Create intention-revealing methods
// Notice you inject the time control source
// Removing the getter and breaking the coupling
return date.isAfter(dueDate);
}
public String customerInformation() {
// Step 4: Create intention-revealing methods
// You no longer print with side effects
// And coupling to a global console
return "Customer: " + customer.name();
}
// For collections, return an unmodifiable view if needed
// Only expose internal collaborators if the name
// is an actual behavior
public List<LineItem> items() {
return Collections.unmodifiableList(items);
}
// Only if required by frameworks
// or telling the customer is an actual responsibility
// The caller should not assume the Invoice is actually
// holding it
public String customerName() {
return customer.name();
}
// You might not need to return the dueDate
// Challenge yourself if you essentially need to expose it
// public LocalDate dueDate() {
// return dueDate;
// }
}
// Client code (Step 5: Update client code)
Invoice invoice = new Invoice(customer, dueDate);
double total = invoice.calculateTotal();
boolean isOverdue = invoice.isOverdue(date);
System.out.println(invoice.customerInformation());
Տեսակ
- Հիմնական
- [x] Հիմնական ավտոմատ Հիմնական
Անվտանգություն ️
Այս վերահսկողությունը սովորաբար անվտանգ է, բայց պահանջում է ճշգրիտ կատարումը:
Դուք պետք է ապահովել, որ Getter- ի բոլոր օգտագործումներները Identified են եւ փոխվել են նոր բուժման մեթոդների հետ:
Լավագույն վտանգը կատարվում է այն ժամանակ, երբ Getters- ը վերցնում է փոխարելի բաղադրիչները կամ բաղադրիչները, քանի որ հաճախորդի կոդը կարող է փոխել այդ բաղադրիչները:
Դուք պետք է ստուգեք, որ վարքագիծը չի փոխվել ամբողջական փորձերի միջոցով, առաջ եւ հետո refactoring.
Երբ դուք ունեք բիզնեսը, դուք կարող եք վերցնել ոչ մի փոխարինող բաղադրիչ կամ տեսանյութեր, որպեսզի պահպանել անվտանգությունը փոխանցման ժամանակ: Երբ բաղադրիչները պահանջում են բաղադրիչների հասնել, դուք կարող եք պահպանել պարզ բաղադրիչներ, առանց "գնել" բաղադրիչը, ինչպես նաեւ ձեր բաղադրիչների բաղադրիչները:
Որպես սովորաբար, դուք պետք է ավելացնել գործառույթային ծախսերը (լուսանկարներ) ձեր կոդը, երբ դուք կատարում եք refactoring.
Ինչու է ավելի լավ սխալը
The refactored code is better because it adheres to theՏեսեք, չգիտեքՀիմնական հոդվածը, որ ձեր բարդները հզոր են, քան պարզապես anemic տվյալների մատակարարներ.
Այս լուծում տեղադրում է օդանավի տվյալների հետ կապված ռեժիմը օդանավի ինքներդում: Այն կտրում է վերլուծման մանրամասները, որը թույլ է տալիս փոխել ինտեգրային արտադրությունը, առանց ազդեցության հաճախորդի կոդը:
Այս մեթոդը նվազեցնում էԿոնտակտՔանի որ հաճախորդները չեն պետք է գիտեն, թե ինչ է բաղադրիչի ներքին կառուցվածքը:
Այն նաեւ փնտրում է Demeter- ի կարգի վերահսկողությունը, այնպես որ փնտրում է Getter- ի ցանցերը:
Քանի որԲարձրությունը չի փոխվել, լուծումը թույլ է տալիս ավելի լավ ստուգման եւ բիզնես կարգի վերահսկողության տեղում.
Ինչպե՞ս կարող է բուժել երեխա: ️
Բարձրացնել կոճակը բարելավում էԲրիտանիաՀիմնականը, ինչպիսիք են սխալը եւ իրականությունը, այնպես, որ բարդները աշխատում են ավելի շատ, ինչպիսիք են իրենց իրական աշխարհում:
Աշխարհում, օդանավները չեն բացահայտել իրենց ներքին տարածքը, որ այլն կարող են մոդել - նրանք կատարում են գործառույթներ, որոնք հիմնված են պահանջների վրա:
Նշում է, որ դուք չեք հարցնում բանկային հաշիվը իր ցածրության համար, ապա կտրում եք, թե ինչպես կարող է բեռնել: Այնպես որ, դուք հարցում եք հաշիվը: «Ինչպե՞ս կարող եմ բեռնել $100- ը: Այս հաշիվը օգտագործում է իր ինտեգրային պայմանները եւ կօգնի ձեզ պատասխանել:
Դուք կարող եք ստեղծել ավելի ճշգրիտ արտադրություն տրանսպորտային դիզայնների հետ մոդելել ձեր բոնուսները կատարելու գործառույթների, այլեւ բացահայտելով տվյալները.
Այսպիսով, ձեր համակարգչային մոդելի եւ իրական աշխարհի միջեւ մի-նե-նե-նե-նե-նե-նե-նե-նե-նե-նե-նե-նե-նե-նե-նե-նե-նե-նե-նե-նե-նե-նե-նե-նե-նե-նե-նե-նե-նե-նե-նե-նե-նե-նե-նե-նե-նե-նե-նե-նե-նե-նե-նե-նե-նե-նե-նե-նե-նե-նե-նե-նե-նե-նե-նե-նե-նե-նե-նե-ն
Այս դիզայնը հետեւում էՔարտիՏեղադրելով այն, որ բաղադրիչները հավատում են իրական աշխարհի բաղադրիչներ եւ բաղադրիչներ:
Արդյոք ️
Քարտի եւ գրասենյակների հաճախ պահանջում են Getter մեթոդներ serialization / deserialization.
Հիմնական կոդը բազանները կարող են լայնորեն օգտագործվել getter- ի օգտագործման համար, որը դժվար է վերլուծել մեկ անգամ:
Արդյունքների փորձարկումը կարող է լինել ավելի դժվար, քանի որ ինտեգրային պայմանները չեն հասանելի: Հիշեք, դուք երբեք չեք պետք փորձել անձնական մեթոդներ:
Հիմնական հոդված՝ AI-ի հետ
ՀիմնականՏեղադրեք getters, որոնք բացահայտել են ինտերնետային ախտորսային կայքը: 2 Տեղադրեք բոլոր getter օգտագործումները codebase- ում: 3 Տեղադրեք գործառույթը, որը օգտագործում է getter- ը ինտերնետային ախտորսում: 4 Տեղադրեք intention-revealing մեթոդներ, որոնք կատարում են գործառույթներ: 5 Տեղադրեք ձեր կոդը, որպեսզի օգտագործեք նոր մեթոդներ:
Հիմնական
Տեղադրեք getters, որոնք բացահայտել են ինտերնետային ախտորսային կայքը: 2 Տեղադրեք բոլոր getter օգտագործումները codebase- ում: 3 Տեղադրեք գործառույթը, որը օգտագործում է getter- ը ինտերնետային ախտորսում: 4 Տեղադրեք intention-revealing մեթոդներ, որոնք կատարում են գործառույթներ: 5 Տեղադրեք ձեր կոդը, որպեսզի օգտագործեք նոր մեթոդներ:
Չնայած ճշգրիտ մատակարարություն
Բարձր ճշմարտություններով
Բարձր ճշմարտություններով
Գործիքներ
Քլեյդ
Պահպանություն
Երկու
DeepSeek-ի մասին
Մետինե AI
Մետինե AI
Կանայք
️ ️
- Հիմնական
- encapsulated Հիմնական
- Հիմնական
- [x] Հիմնական Հիմնական
Related Արդյունքներ
Ահա
Ապրանքներ
ՆկարագրությունKris-ի մասինԴաPixabay-ի մասին
Այս հոդվածը մեկն է The Refactoring Series- ում: