首页 >web前端 >js教程 >重构 - Reify 电子邮件地址

重构 - Reify 电子邮件地址

Barbara Streisand
Barbara Streisand原创
2024-12-25 16:50:15853浏览

说一次且仅一次

TL;DR:避免重复的电子邮件验证。

解决的问题

  • 在多个地方重复电子邮件验证逻辑。
  • 验证规则不一致的风险。
  • 难以维护验证规则。
  • 双射违规
  • 原始的痴迷
  • 过早优化

相关代码异味

Refactoring  - Reify Email Addresses

代码味道 46 - 重复代码

马克西·孔蒂耶里 ・2020 年 12 月 8 日

#哎呀 #codenewbie #教程 #webdev
Refactoring  - Reify Email Addresses

代码气味 122 - 原始痴迷

马克西·康泰里 ・ 22 年 3 月 17 日

#哎呀 #webdev #教程 #初学者
Refactoring  - Reify Email Addresses

代码气味 66 - 霰弹枪手术

马克西·孔蒂耶里 ・ 21 年 4 月 5 日

#codenewbie #教程 #哎呀 #webdev
Refactoring  - Reify Email Addresses

代码气味 177 - 丢失小物体

马克西·孔蒂耶里 ・22 年 11 月 5 日

#webdev #javascript #初学者 #编程
Refactoring  - Reify Email Addresses

代码气味 20 - 过早优化

马克西·孔蒂耶里 ・ 2020 年 11 月 8 日

#哎呀 #发展 #编码 #codesmell

步骤

  1. 确定电子邮件验证逻辑重复的位置。
  2. 创建一个Email Address类来封装验证规则。
  3. 重构代码以使用电子邮件地址类而不是原始字符串。

示例代码

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;
    }
}

类型

[X] 半自动

安全

如果您将所有出现的原始电子邮件字符串替换为“EmailAddress”类并确保所有测试都通过,则此重构是安全的。

为什么代码更好?

您可以使电子邮件验证在整个应用程序中保持一致。

由于验证规则集中在一个地方,代码变得更容易维护。

您还可以降低因逻辑不一致而导致错误的风险。

在现实世界中,电子邮件地址是存在的小对象,而不是字符串。

重构后的代码更接近现实世界的MAPPER

请注意,双射名称是必不可少的。创建“电子邮件地址”而不是“电子邮件”会有所帮助,因为电子邮件应该映射到实际消息。

不要让不成熟的优化器告诉您这会降低性能。

他们从不使用真实世界的数据进行实际基准测试。

用人工智能重构

Without Proper Instructions With Specific Instructions
ChatGPT ChatGPT
Claude Claude
Perplexity Perplexity
Copilot Copilot
Gemini Gemini

标签

  • 封装

相关重构

Refactoring  - Reify Email Addresses

重构 007 - 提取类

马克西·孔蒂耶里 ・ 22 年 7 月 4 日

#webdev #初学者 #javascript #教程
Refactoring  - Reify Email Addresses

重构 012 - Reify 关联数组

马克西·孔蒂耶里 ・ 2023 年 11 月 19 日

#webdev #编程 #初学者 #php
Refactoring  - Reify Email Addresses

重构002 - 提取方法

马克西·孔蒂耶里 ・ 十一月 25 '21

#重构 #哎呀 #webdev #codenewbie

制作人员

图片由 Gerd Altmann 在 Pixabay上


本文是重构系列的一部分。

Refactoring  - Reify Email Addresses

如何通过简单的重构来改进代码

马克西·孔蒂耶里 ・ 2022 年 10 月 24 日

#webdev #初学者 #编程 #教程

以上是重构 - Reify 电子邮件地址的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn