Արդյոք, ինչպիսիք են այն, ինչպիսիք են այն, ինչպիսիք են այն, ինչպիսիք են այն, ինչպիսիք են այն, ինչպիսիք են այն, ինչպիսիք են այն.
Հիմնական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 Տեղադրեք ձեր կոդը, որպեսզի օգտագործեք նոր մեթոդներ:
ՀիմնականՉնայած ճշգրիտ ուղեցույցներ հատուկ ուղեցույցների ChatGPT ChatGPT Claude Claude Perplexity Perplexity Copilot Copilot Gemini DeepSeek Meta AI Meta AI Grok Grok Qwen QwenՉնայած ճշգրիտ մատակարարություն
ՀիմնականԲարձր ճշմարտություններով
Բարձր ճշմարտություններով
Խաղատուն ChatGPTԳործիքներՀիմնականԳործիքներ
ՔլեյդՔլեյդՔլեյդՔլեյդ
Տեղադրություն PerplexityՊահպանությունՊահպանությունՊահպանություն
Copilot-ի հետազոտությունՊոլիտՊոլիտՀիմնական հոդված՝ GeminiԵրկուԵրկուԵրկու
DeepSeek- ը DeepSeek- ըDeepSeek-ի մասինDeepSeek-ի մասին
DeepSeek-ի մասինՀիմնականՄետինե AIՀիմնականՄետինե AIՀիմնականՀիմնականՄետինե AI
Մետինե AI
Մետինե AIԲրիտանիա GrokԳրիկԳրիկՏեսակներԿանայքԿանայք
Կանայք️ ️
- Հիմնական
- encapsulated Հիմնական
- Հիմնական
- [x] Հիմնական Հիմնական
Related Արդյունքներ
Ահա
Ապրանքներ
ՆկարագրությունKris-ի մասինԴաPixabay-ի մասին
Այս հոդվածը մեկն է The Refactoring Series- ում: