重构复杂简单变量之用对象替换数据值

对象替换数据值用于将简单的数据值替换为具有行为和逻辑的对象。这种优化的目的在于提高代码的可读性、灵活性和可维护性,尤其是在数据开始承载更多含义或行为的时候。

一、什么时候使用

当我们在代码中使用简单的数据值(如字符串、整数)表示一个有更复杂含义的概念时,使用对象来封装数据会更加合适。例如:

  • 某个值可能需要附加逻辑进行验证或格式化。
  • 相同的值在多个地方使用,但行为不一致,容易产生错误。
  • 简单数据值开始变得复杂,包含额外的计算、转换或状态。

二、优化步骤

  1. 识别简单的数据值 :首先找到那些不再单纯作为数据存在的值。比如我们有个表示货币金额的 decimaldouble 类型,但它其实包含了货币的业务逻辑(比如货币类型、汇率等)。
  2. 创建类封装数据 :将该数据值封装成一个类,属性用于保存原始值,并在这个类中添加需要的行为。例如我们可以创建一个 Money 类来代替简单的金额值。
  3. 移植相关行为:如果该数据值的使用中已经有了一些行为逻辑,比如验证、格式化等,将这些行为方法移植到新类中。
  4. 替换数据值:在需要使用这个值的地方,将其替换为新创建的对象。

三、示例

假设我们有以下代码,直接使用字符串来表示客户的电话号码:

csharp 复制代码
public class Customer
{
    public string PhoneNumber { get; set; }
}

优化后的代码,可以创建一个 PhoneNumber 类,封装电话号码的相关行为:

csharp 复制代码
public class PhoneNumber
{
    public string Number { get; private set; }

    public PhoneNumber(string number)
    {
        if (!IsValidPhoneNumber(number))
        {
            throw new ArgumentException("Invalid phone number format.");
        }
        Number = number;
    }

    private bool IsValidPhoneNumber(string number)
    {
        // 这里添加电话号码验证逻辑
        return Regex.IsMatch(number, @"^\d{10}$");
    }

    public override string ToString()
    {
        return Number;
    }
}

然后在 Customer 类中使用新的 PhoneNumber 对象:

csharp 复制代码
public class Customer
{
    public PhoneNumber PhoneNumber { get; set; }

    public Customer(PhoneNumber phoneNumber)
    {
        PhoneNumber = phoneNumber;
    }
}

四、优化的好处

  1. 清晰性和可读性:用对象表示的数据更加清晰,能表达其实际含义,也避免了使用不合适的值。
  2. 行为封装:将与数据相关的行为封装在对象中,避免重复代码和错误。
  3. 更易维护:当需要修改数据的表现形式或处理方式时,只需修改对象类中的方法,而不需要改动多处业务逻辑。
  4. 扩展性:将数据转为对象后,未来如果需要扩展更多的行为或属性(如电话号码的地区代码、格式化等),可以更方便地添加。
相关推荐
霖霖总总13 分钟前
[小技巧42]InnoDB 索引与 MVCC 的协同工作原理
运维·数据库·mysql
bbq粉刷匠2 小时前
MySQL 聚合函数&分组&联合查询
数据库·mysql
霖霖总总2 小时前
[小技巧43]MySQL MVCC 深度解析:快照读 vs 当前读
数据库·mysql
阿杰 AJie5 小时前
MySQL 聚合函数
android·数据库·mysql
JavaGuide6 小时前
IntelliJ IDEA 2026.1 EAP 发布!拥抱 Java 26,Spring Boot 4 深度支持!
java·后端·mysql·springboot·idea·大厂面试·javaguide
达梦产品与服务6 小时前
SQLark 实战 | 如何快速导入数据至达梦、Oracle、MySQL、PG 数据库
mysql·oracle·达梦数据库·数据导入·pg数据库
liux35286 小时前
MySQL集群架构:MySQL InnoDB Cluster (MIC)详解(十一)
数据库·mysql·架构
小北方城市网6 小时前
MySQL 索引优化实战:从慢查询到高性能
数据库·spring boot·后端·mysql·rabbitmq·mybatis·java-rabbitmq
l1t6 小时前
DeepSeek对AliSQL 集成 DuckDB 的总结
数据库·sql·mysql·duckdb
SeaTunnel7 小时前
Apache SeaTunnel MySQL CDC 支持按时间启动吗?
大数据·数据库·mysql·开源·apache·seatunnel