Java代码重构:通过领域模型扩展消除方法内重复逻辑

Java代码重构:通过领域模型扩展消除方法内重复逻辑

本文探讨在Java类中消除重复代码的有效策略。针对在不同方法中处理同一实体(如UserEntity)的重复逻辑,文章提出将通用数据转换逻辑封装到实体自身的新方法中。通过将角色ID提取逻辑移至UserEntity的getRoleIds()方法,不仅简化了调用方代码,还提升了代码的可读性、可维护性,并遵循了面向对象的设计原则。

识别与消除代码重复

在软件开发中,代码重复是一个常见的问题,它会降低代码的可读性、可维护性,并增加引入bug的风险。当我们在同一个类中的不同方法中发现相同的代码片段时,这通常是一个明确的重构信号。

考虑以下两个Java方法,它们分别用于映射用户实体到DTO和更新用户资源:

// 方法一:将UserEntity映射到UserDTOprotected UserDTO map(UserEntity entity) {    var result = new UserDTO();    // 存在重复逻辑    var userRoles = entity.getRoles().stream()            .map(RoleEntity::getId)            .map(String::valueOf)            .collect(Collectors.toList());    result.setId(entity.getId().toString());    result.setLastAccessDate(entity.getLastAccessDate());    result.setRoles(userRoles);    if (entity.getEmail() != null) {        var email = new UserDTO.Email(entity.getEmail(), EMAIL_TYPE);        result.setEmails(List.of(email));    }    return result;}// 方法二:更新用户资源public UserResource updateUser(String id, UserResource updatedUser) {    var optionalUser = userRepository.findById(Integer.valueOf(updatedUser.getUserName()));    // 存在重复逻辑    updatedUser.setRoles(optionalUser.get().getRoles()            .stream()            .map(RoleEntity::getId)            .map(String::valueOf)            .collect(Collectors.toList()));    updatedUser.setLastAccessDate(optionalUser.get().getLastAccessDate());    var entity = mapToUserEntity(updatedUser);    userRepository.save(entity);    return updatedUser;}

在这两个方法中,以下代码片段是重复的:

.getRoles().stream().map(RoleEntity::getId).map(String::valueOf).collect(Collectors.toList());

这段代码的目的是从UserEntity(或其关联的RoleEntity列表)中提取所有角色的ID,并将它们转换为字符串列表。这种重复不仅使得代码冗长,而且如果未来需要修改角色ID的提取逻辑,就必须在多个地方进行修改,极易出错。

重构策略:扩展领域模型

为了消除这种重复,我们应遵循“Don’t Repeat Yourself”(DRY)原则。最直接且符合面向对象设计原则的解决方案是,将这段与UserEntity紧密相关的逻辑封装到UserEntity类自身的一个新方法中。这样做的优点在于:

立即学习“Java免费学习笔记(深入)”;

封装性增强:将数据(RoleEntity列表)和处理数据(提取角色ID)的逻辑放在一起,符合对象的单一职责原则。API清晰:UserEntity现在提供了一个更高级别的、语义化的方法来获取角色ID列表,而不是暴露其内部的RoleEntity集合并让外部进行处理。简化调用方:其他方法可以直接调用这个新方法,而无需关心内部实现细节。

实现细节:在UserEntity中添加辅助方法

我们将创建一个名为getRoleIds()的新方法,并将其添加到UserEntity类中。这个方法将负责执行提取角色ID并转换为字符串列表的所有逻辑。

首先,修改UserEntity类,添加getRoleIds()方法:

// UserEntity.javapublic class UserEntity {    private Integer id;    private String email;    private Date lastAccessDate;    private List roles; // 假设RoleEntity包含getId()方法    // ... 其他属性和getter/setter方法 ...    /**     * 获取用户所有角色的ID列表。     * @return 角色ID的字符串列表。     */    public List getRoleIds() {        if (this.roles == null) {            return Collections.emptyList();        }        return this.roles.stream()                .map(RoleEntity::getId)                .map(String::valueOf)                .collect(Collectors.toList());    }}// RoleEntity.java (示例)public class RoleEntity {    private Integer id;    private String name;    // ... getter/setter ...    public Integer getId() {        return id;    }}

接下来,我们就可以在原始的map和updateUser方法中调用这个新方法,从而消除重复代码:

import java.util.Collections;import java.util.List;import java.util.stream.Collectors;// 方法一:重构后的map方法protected UserDTO map(UserEntity entity) {    var result = new UserDTO();    // 调用UserEntity的新方法,代码更简洁    var userRoles = entity.getRoleIds();     result.setId(entity.getId().toString());    result.setLastAccessDate(entity.getLastAccessDate());    result.setRoles(userRoles);    if (entity.getEmail() != null) {        var email = new UserDTO.Email(entity.getEmail(), EMAIL_TYPE);        result.setEmails(List.of(email));    }    return result;}// 方法二:重构后的updateUser方法public UserResource updateUser(String id, UserResource updatedUser) {    var optionalUser = userRepository.findById(Integer.valueOf(updatedUser.getUserName()));    if (optionalUser.isPresent()) {        // 调用UserEntity的新方法,代码更简洁        updatedUser.setRoles(optionalUser.get().getRoleIds());         updatedUser.setLastAccessDate(optionalUser.get().getLastAccessDate());    }    var entity = mapToUserEntity(updatedUser);    userRepository.save(entity);    return updatedUser;}

通过这种方式,我们成功地将重复逻辑封装到了UserEntity类内部,使得调用方代码更加简洁和易读。

优点与最佳实践

这种重构方法带来了多方面的好处:

提高代码可读性:通过语义化的方法名(如getRoleIds()),代码的意图变得一目了然。增强可维护性:如果角色ID的提取逻辑需要修改,只需在一个地方(UserEntity.getRoleIds())进行修改,大大降低了维护成本和引入新bug的风险。遵循面向对象原则:将与UserEntity数据相关的行为封装在UserEntity内部,符合封装性和单一职责原则。这使得UserEntity成为一个更“智能”的领域对象。减少错误:重复的代码是错误的温床。消除重复可以有效减少因复制粘贴错误或遗漏修改导致的bug。

在考虑这种重构时,需要注意以下几点:

逻辑归属:判断重复逻辑是否与某个特定实体紧密相关。如果是,将其下沉到该实体类中是最佳选择。方法可见性:新创建的方法通常可以设置为public,以便其他需要获取该信息的部分调用。空值处理:在新方法中,应妥善处理可能为空的集合(如roles列表),避免NullPointerException。示例中已包含Collections.emptyList()的处理。

总结

通过将重复的代码逻辑封装到与其关联的领域模型(如UserEntity)中的新方法,我们不仅消除了代码重复,还提升了整体代码质量。这种方法使得代码更具可读性、可维护性,并更好地体现了面向对象的设计原则。在日常开发中,积极识别和重构此类重复代码是编写高质量、健壮软件的关键实践。

以上就是Java代码重构:通过领域模型扩展消除方法内重复逻辑的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/96856.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年11月20日 00:47:40
下一篇 2025年11月20日 01:10:06

相关推荐

  • 十大数字货币交易平台最新榜单 虚拟币十大交易所app榜单2025年

    2025年币圈公认的交易所排名中,Binance、OKX、Huobi稳居前三。1. Binance是全球最大加密货币交易所,支持600+交易对,提供现货、合约、杠杆等多种服务,具备低费率、BNB生态链及机构级API;2. OKX以衍生品交易领先,永续合约市场份额达35%,具备完善Web3生态与零知识…

    2025年12月8日 好文分享
    000
  • 币安交易所官方入口地址 币安binance官网链接进入

    币安(binance)交易所作为全球领先的加密货币交易平台,以其丰富的交易品种、强大的技术支持和不断创新的服务而闻名。对于新手和资深交易者而言,安全、便捷地访问币安官方入口至关重要。本文将为您提供最新的币安官方入口地址,并深入了解币安平台的各项优势。 币安交易所官方入口地址 目前,币安官方入口地址为…

    2025年12月8日
    000
  • GOUT是什么币种?值得投资吗?GOUT价格预测2025-2030年

    gout(gout)是较新的微型市值代币之一,因其投机性 交易模式和市场受模因驱动的关注而备受质疑。尽管该代币目前交易价格极低,但交易员的长期投机需求可能会带来适度的回报。根据当前趋势和技术展望,gout 预计 2025 年的平均价值为 0.00006923 美元。根据比特币的走势和市场的整体周期,…

    2025年12月8日
    000
  • Spark Protocol是什么?SPK币2025年价格预测

    目录 Spark Protocol是什么?Spark项目背景:团队成员:融资情况:Spark生态发展:技术架构与MakerDAO 基因:稳健与创新的融合SPK 代币价格预测:短期上线热度与长期价值展望短期动态(2025 年6 – 7 月)中长期增长轨迹(2026 – 2050…

    2025年12月8日 好文分享
    000
  • 十大数字货币交易所推荐 数字货币交易所

    选择数字货币交易所应根据个人需求权衡不同平台的优势。1. 火币适合多种用户,交易量大、币种多,支持法币出入金,但需注意地区监管问题;2. 币安是全球龙头,功能全面,币种丰富,适合挖掘潜力币,并提供BNB生态链和手续费折扣;3. Coinbase合规性强,界面简洁,适合新手入门,但币种较少、手续费略高…

    2025年12月8日
    000
  • 币圈公认的三大交易所推荐 2025年公认的三大交易所分别是

    2025年币圈公认的三大交易所是币安、欧易和火币。币安是全球交易量领先的平台,支持多种交易类型及自建区块链网络,适合从新手到专业交易者;其优点包括币种丰富、多语言界面支持及法币出入金便利,建议新用户从小额交易开始并使用手机App监控。 2025年,币圈公认的三大交易所依然是币安(Binance)、欧…

    2025年12月8日
    000
  • 数字货币app哪些靠谱 虚拟数字货币APP全球前十汇总

    随着区块链技术的日益成熟和数字经济的蓬勃发展,虚拟数字货币已经逐渐渗透到我们生活的方方面面。无论是投资理财,还是日常支付,一个安全、便捷、功能强大的虚拟数字货币APP都至关重要。为了帮助大家更好地选择,我们精心整理了全球前十的虚拟数字货币APP,并对其进行了深入分析,希望能为您的数字货币之旅提供有价…

    2025年12月8日 好文分享
    000
  • 数字货币交易app有哪些 数字货币交易app推荐

    选择数字货币交易App应从安全性、手续费、支持币种和用户体验四个方面考虑,推荐平台包括币安(Binance)、Coinbase、火币(Huobi)、OKEx、Uphold和Kraken。1. 币安功能全面、币种丰富、手续费低,适合各类用户,但部分地区受限;2. Coinbase 安全系数高、操作简单…

    2025年12月8日
    000
  • 什么是Solaxy?$SOLX代币、路线图及投资潜力分析

    目录 简介什么是 SolaxySolaxy 的历史、起源和关键人物Solaxy 如何运作?链下交易处理卷叠架构在 Solana 上的链上结算模块化基础设施Solaxy 的主要特点基于卷叠的 Layer 2 架构链下交易捆绑低交易费用高吞吐量和速度面向开发者的模块化基础设施与 Solana 权益证明模…

    2025年12月8日 好文分享
    000
  • 币圈三大交易所是哪些(权威版)

    币圈三大交易所分别是币安、欧易OKX和火币。币安成立于2017年,交易量最大,提供多种交易方式及广泛的数字资产,并拥有自有公链BNB Chain;建议新用户通过“法币入金”入手,使用移动端操作。欧易OKX以技术实力著称,尤其在衍生品交易领域表现突出,具备高数据透明度和支持Web3生态;适合中高级用户…

    2025年12月8日
    000
  • 2025年好用的数字货币十大交易所推荐 十大虚拟币交易所最新排名汇总

    2025年十大数字货币交易所排名依次为Binance、OKX、Huobi、Coinbase、Kraken、Bybit、KuCoin、Gate.io、Bitget和MEXC。Binance以全球最大交易所、低手续费和丰富产品位居榜首;OKX以衍生品交易和Web3生态见长;Huobi凭借老牌实力和全球化…

    2025年12月8日 好文分享
    000
  • F(SynFutures)代币是什么?$F代币功能,经济学以及未来发展介绍

    目录 SynFutures(F)是什么?SynFutures 的架构与技术支持的资产与市场$F 代币是什么?$F 代币经济学$F 代币的核心功能治理交易手续费折扣质押奖励生态系统发展SynFutures 的合作与整合SynFutures 的平台整合与合作SynFutures 路线图与未来发展总结‍ …

    2025年12月8日
    000
  • 什么是稳定币?在哪些交易所可以购买

    稳定币(Stablecoin)是一种特殊类型的加密货币,其设计目标是将价格稳定在某一特定资产(通常是法定货币,如美元)上。不同于比特币、以太坊这类价格波动较大的加密货币,稳定币通过多种机制保障其价格的相对稳定,常见的稳定币锚定美元,1个稳定币通常等值1美元。 一键直达|2025权威稳定币交易所平台 …

    2025年12月8日 好文分享
    000
  • 好用的加密货币交易平台有哪些

    选择可靠的加密货币交易平台对交易安全和成本控制至关重要。2025年度十大交易所包括:1. OKX,以技术实力和多样交易方式领先;2. Binance,以庞大交易量和生态系统著称;3. Huobi,注重合规并拓展全球业务;4. Coinbase,适合新手的友好平台;5. Kraken,以安全性及透明度…

    2025年12月8日 好文分享
    000
  • OKX、币安、火币:三家稳定币交易所介绍

    OKX、币安、火币:三大稳定币交易所深度解析(2025 年版) 在数字货币市场快速演进的当下,稳定币已从辅助交易的“中介资产”演变为支撑整个 Web3 金融生态的“主心骨”。无论是跨境支付、DeFi 借贷,还是链上理财、资产避险,稳定币都扮演着重要角色。而承担稳定币交易枢纽职责的,正是几家全球领先的…

    2025年12月8日 好文分享
    000
  • 2025稳定币风险点与监管缺口分析 稳定币交易所排行

    稳定币(Stablecoin)作为加密金融体系中的“价值锚”,其核心设计理念是追求币值稳定,通常锚定美元、欧元、人民 币等法币。看似“稳如泰山”的稳定币,在实际运行中却隐藏着多种系统性与监管风险: 一键直达|2025权威稳定币交易所平台 Binance币安 Huobi火币 欧易OKX 1. 储备透明…

    2025年12月8日 好文分享
    000
  • 2025最新稳定币排名 值得购买的稳定币推荐

    在经历了 2022 年 Terra 崩盘、2023 年 FTX 黑天鹅、2024 年全球加密监管初步落地之后,稳定币市场在 2025 年迎来了相对稳健和合规的发展阶段。随着全球合规框架日益成熟,以及投资者对于资产安全性的要求不断提高,稳定币正在从“配角”走向“核心资产”。 那么在当前复杂的市场结构下…

    2025年12月8日
    000
  • 2025 主流稳定币清单大全:USDT、USDC、Dai、USDE、PYUSD 等

    2025 主流稳定币清单:USDT、USDC、DAI、USDE、PYUSD 等全解析 稳定币是连接现实世界与区块链生态的桥梁,是目前交易、借贷、结算、defi 中使用频率最高的币种。进入 2025 年,稳定币种类已从最早的 usdt、usdc,扩展到 pyusd、usde、crvusd、fdusd …

    2025年12月8日
    000
  • 2025币安(Binance)交易所app国内下载教程

    b安交易所下载教程:1、点击页面直达链接https://www.marketwebb.co/zh-CN/join?ref=507720986&type=wenzi;2、打开下载好的安装包,选择无视风险继续安装;3、注册币安交易所,最好使用gmail邮箱;4、完成实名信息验证KYC;5、启用双…

    2025年12月8日 好文分享
    000
  • TRNR获5亿美元支持收购FET!抢攻AI加密货币

    健身镜(运动时可照的智能镜面)制造商Interactive Strength(Nasdaq:TRNR)正将重量级资金地押向加密。 今日该公司宣布,已透过首轮5500万美元投资启动加密资产策略,最终规模上看5亿美元,全数用于买进Fetch.ai(FET)代币。 若计划完成,TRNR可能成为美国上市企业…

    2025年12月8日
    000

发表回复

登录后才能评论
关注微信