Sabihin ito ng isang beses at isang beses lamang
TL;DR: Iwasan ang mga dobleng pagpapatunay ng email.
Mga Problema na Natugunan
- Paulit-ulit na lohika sa pagpapatunay ng email sa maraming lugar.
- Panganib ng hindi tugmang mga panuntunan sa pagpapatunay.
- Paglabag sa bijection
- Primitive Obsession
- Premature Optimization
Mga Kaugnay na Code Amoy
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
Mga hakbang
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.
Halimbawang Code
dati
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; } }
Pagkatapos
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; } }
Uri
- [x] Semi-Awtomatiko
Kaligtasan
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.
Bakit Mas Mahusay ang Code?
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.
Refactor Gamit ang AI
Nang walang Wastong Tagubilin | Sa Mga Tukoy na Tagubilin |
---|---|
Mga tag
- Encapsulation
Mga Kaugnay na Refactorings
Mga kredito
Larawan ni Gerd Altmann sa Pixabay
Ang artikulong ito ay bahagi ng Refactoring Series.
Paano Pahusayin ang Iyong Code Gamit ang Mga Madaling Refactoring