Sabihin ito ng isang beses at isang beses lamang
TL;DR: Iwasan ang mga dobleng pagpapatunay ng email.
https://hackernoon.com/how-to-find-the-stinky-parts-of-your-code-part-x-i7r34uj
https://hackernoon.com/how-to-find-the-stinky-parts-of-your-code-part-xxv
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-xxxvi
Code Smell 20 - Premature Optimization
Tukuyin kung saan nadoble ang logic ng pagpapatunay ng email.
Gumawa ng klase ng Email Address
para i-encapsulate ang mga panuntunan sa pagpapatunay.
Refactor code upang gamitin ang klase ng Email Address
sa halip na mga hilaw na string.
public class Person { private String emailAddress; // Primitive Obsession public void setEmailAddress(String emailAddress) { // Duplicated code if (!emailAddress.matches( "^[\\w.%+-]+@[\\w.-]+\\.[a-zA-Z]{2,}$")) { throw new IllegalArgumentException( "Invalid email address format"); } this.emailAddress = emailAddress; } } public class JobApplication { private String applicantEmailAddress; public void setApplicantEmailAddress(String emailAddress) { // Duplicated code if (!emailAddress.matches( "^[\\w.%+-]+@[\\w.-]+\\.[a-zA-Z]{2,}$")) { throw new IllegalArgumentException( "Invalid email address format"); } this.applicantEmailAddress = emailAddress; } }
public class EmailAddress { // 2. Create an `EmailAddress` class to encapsulate validation rules. private final String value; public EmailAddress(String value) { // The rules are in a single place // And all objects are created valid if (!value.matches("^[\\w.%+-]+@[\\w.-]+\\.[a-zA-Z]{2,}$")) { throw new IllegalArgumentException( "Invalid email address format"); } this.value = value; } } public class Person { private final EmailAddress emailAddress; public Person(EmailAddress emailAddress) { // 1. Identify where email validation logic is duplicated. // 3. Refactor code to use the `Email Address` // class instead of raw strings. // No validation is required this.emailAddress = emailAddress; } } public class JobApplication { private EmailAddress applicantEmailAddress; public JobApplication(EmailAddress applicantEmailAddress) { this.applicantEmailAddress = applicantEmailAddress; } }
Ligtas ang refactoring na ito kung papalitan mo ang lahat ng paglitaw ng mga hilaw na string ng email ng klase ng 'EmailAddress' at masisigurong papasa ang lahat ng pagsubok.
Ginagawa mong pare-pareho ang pagpapatunay ng email sa iyong aplikasyon.
Dahil ang mga panuntunan sa pagpapatunay ay sentralisado sa isang lugar, nagiging mas madaling mapanatili ang code.
Binabawasan mo rin ang panganib ng mga bug na dulot ng hindi pantay na lohika.
Sa totoong mundo, Email Addresses
ay maliliit na bagay na umiiral at hindi mga string.
Ang refactored code ay mas malapit sa real-world MAPPER .
Pansinin na ang mga pangalan ng bijection ay mahalaga. Makakatulong na lumikha ng isang EmailAddress
, hindi isang Email
, dahil ang Email ay dapat na mapa sa aktwal na mensahe.
Huwag hayaang sabihin sa iyo ng Premature Optimizators ang solusyon na ito ay may parusa sa pagganap.
Hindi sila kailanman gumagawa ng mga aktwal na benchmark sa real-world na data.
Nang walang Wastong Tagubilin | Sa Mga Tukoy na Tagubilin |
---|---|
Larawan ni Gerd Altmann sa Pixabay
Ang artikulong ito ay bahagi ng Refactoring Series.
Paano Pahusayin ang Iyong Code Gamit ang Mga Madaling Refactoring