- 使用 Spring Initializr 创建 Spring Boot 应用程序
- 在Spring Boot中配置Cassandra
- 在 Spring Boot 上配置 Tomcat 连接池
- 将Camel消息路由到嵌入WildFly的Artemis上
某个类做了应该由两个类做的事。
建立一个新类,将相关的字段和函数从旧类移到新类。
一个类应该是一个清楚的抽象,处理一些明确的责任。但实际工作中,类会不断扩展。你会在这儿加入一些功能,在那儿加入一些数据。给某个类添加一项新责任时,你会觉得不值得为这项责任分离出一个单独的类。于是,随着责任不断增加,这个类会变得过分复杂。很快,你的类变成一团乱麻。这样的类往往含有大量函数和数据,太大而不易理解。
此时你需要考虑哪些部分可以分离出去,并将它们分离到一个单独的类。如果某些数据和某些函数总是一起出现,某些数据经常同时变化甚至彼此相依,这就表示你应该将它们分离出去。
一个有用的测试,问你自己,若你搬移了某些字段和函数,会发生啥事?其他字段和函数是否因此变得无意义?
另一个往往在开发后期出现的信号是类的子类化方式。若发现:
这就意味你需要分解原来的类。
函数”者)。每次更改后运行测试。
检查两个类的接口,去掉不再需要的函数,必要时为函数重新取一个适合新环境的名字。
决定是否公开新的类。如果确实需要,考虑对新类应用【将引用对象改为值对象】 使其成为一个值对象
Person类:
package com.javaedge.refactor.extract_class;
import lombok.Data;
/**
* @author JavaEdge
* @date 2022/3/30
*/
@Data
public class Person {
private String name;
private String officeAreaCode;
private String officeNumber;
public String getTelephoneNumber() {
return this.officeAreaCode + this.officeNumber;
}
}
可以将与电话号码相关的行为分离到一个独立的类。
首先,定义一个空的 TelephoneNumber 类来表示“电话号码”:
class TelephoneNumber {
}
然后,建立从Person到TelephoneNumber的连接:
class Person {
private TelephoneNumber _officeTe1ephone = new TelephoneNumber()
}
现在,运用MOVE Field 移动一个字段过来:
package com.javaedge.refactor.extract_class;
import lombok.Data;
/**
* @author JavaEdge
* @date 2022/3/30
*/
@Data
public class Person {
private String name;
private String officeNumber;
private TelephoneNumber officeTelephone = new TelephoneNumber();
public String getTelephoneNumber() {
return getOfficeAreaCode() + this.officeNumber;
}
public String getOfficeAreaCode() {
return officeTelephone.getAreaCode();
}
public void setOfficeAreaCode(String areaCode) {
officeTelephone.setAreaCode(areaCode);
}
}
package com.javaedge.refactor.extract_class;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @author JavaEdge
* @date 2022/3/30
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class TelephoneNumber {
private String areaCode;
}
移动其它字段,并用 move method将相关方法移动到TelephoneNumber
package com.javaedge.refactor.extract_class;
import lombok.Data;
/**
* @author JavaEdge
* @date 2022/3/30
*/
@Data
public class Person {
private String name;
private TelephoneNumber officeTelephone = new TelephoneNumber();
public String getTelephoneNumber() {
return officeTelephone.getTelephoneNumber();
}
}
package com.javaedge.refactor.extract_class;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @author JavaEdge
* @date 2022/3/30
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class TelephoneNumber {
private String areaCode;
private String number;
public String getTelephoneNumber() {
return this.areaCode + this.number;
}
}
要不要对用户公开这个新类?我可以将Person中与电话号码相关的函数委托至TelephoneNumber,从而完全隠藏这个新类;也可以直接将它对用户公开。我还可以将它公开给部分用户(位于同一个包中的用户),而不公开给其他用户。
如果我选择公开新类,就需要考虑别名带来的危险。如果我公开了TelephoneNumber,而有个用户修改了对象中的areaCode字段值,我又怎么能知道呢?而且,做出修改的可能不是直接用户,而是用户的用户的用户。面对这个问题,我有下列几种选择。
电话号码”对象一般还具有复用价值,因此我考虑将新提炼的类暴露给更多的客户端。需要访问TelephoneNumber对象时,只须把Person类中那些office开头的访问函数搬移过来并略作修改即可。但这样TelephoneNumber就更像一个值对象了,因此我会先对它使用【将引用对象改为值对象】。
Extract Class是改善并发程序的一种常用技术,因为它使你可以为提炼后的两个类分别加锁。如果你不需要同时锁定两个对象,就不必这样做。
这里也存在危险性。如果需要确保两个对象被同时锁,就面临事务问题,需要使用其他类型的共享锁。这是一个复杂领域,比起一般情况需要更繁重的机制。事务很有实用性,但是编写事务管理程序则超出了大多数程序员的职责范围。
警告在块AccessRights〜Groups〜Navigator中[mini-css-extract-plugin] 之间的顺序冲突: css ../node_modules/css-loader?
解决练习问题“对于数据库中的每个月/年组合,交易表的销售日期列中有多少个不同的日期?”我发现一个有效的查询,它显然结合了年份和月份 SELECT DISTINCT (extract(year from
我有一个名为 Student 的 MySQL 表,它有一个名为 entry_date 的列,类型为 date。我想选择以下形式的 entry_date: November, 2014 即它将显示 en
我已经使用 iMacros 很长时间了,我有一个代码可以提取文本并使用它来创建我需要的特定 URL。 事情是这样的: #I can extract the XPath text with this.
我将一个 session 从 Fiddler 导出到 saz 文件。此 session 仅包含 jpg 文件,我想知道 - 如何快速轻松地从 saz 中提取 jpg 文件? 谢谢! 最佳答案 提取 J
应用 FFT 后,我得到了具有多个频率段的频谱。如何使用倒谱方法从该频谱中获取基频? 我做了很多研究,尝试了很多代码,并在 stackoverflow 上问了三遍(这很有帮助),我非常确定倒谱方法是在
我正在寻找一种解压缩或反编译微软代理的方法。 例如梅林代理 我想提取动画/图像。到目前为止我发现的最好方法是。用粉红色背景录制我的屏幕。并分割视频......但这不是一个很好的做法...... 有小费
我只想从youtube链接中提取MP3格式的音频,但是如果不从命令行使用youtube-dl选项调用--extract-audio,就无法弄清楚该如何做。在YoutubeDL类中是否有一种类似于her
我有一个 Azure 管道,应该构建一个项目并将 jar 复制到 Artifactory。这是应该安装节点的 yml: - task: NodeTool@0 inputs: version
例如,如果您有一个如下所示的关联数组: $array = array('first-value' => 'Hello'); 然后你要提取它: extract($array); 由于变量名称中不能使用连
我有大型 pdf 文件(法语的 100 页)描述了我的事件部门的一套规则。 我正在寻找一种服务,允许我一次查询一个 pdf(或我从中提取的文本)以自动获取信息。 (示例:x 的最大授权长度是多少?)
我是 RDF 初学者,我想从 HTML 中提取 RDF我正在使用 GRDDL,但它不太适合我,我每次都会收到安全异常:(您能向我推荐另一个工具吗? 感谢您的帮助。 最佳答案 我通常使用说唱歌手,你可以
我很好奇,PHP 的函数是如何实现的extract有用吗?我想做一个稍微修改的版本。我希望我的函数在从蛇形符号到驼峰式的数组键中提取时生成变量名,例如: 现在 extract 这样做: $array
如果我使用 PHP 的 extract() 函数从数组中导入变量,同名变量会被覆盖吗?我问的原因是因为我正在尝试初始化所有变量。 感谢您的宝贵时间。 最佳答案 默认情况下它将覆盖。 http://ph
我有大型 pdf 文件(法语的 100 页)描述了我的事件部门的一套规则。 我正在寻找一种服务,允许我一次查询一个 pdf(或我从中提取的文本)以自动获取信息。 (示例:x 的最大授权长度是多少?)
我正在尝试在 Python 中运行大量模拟,因此我尝试使用多处理来实现它。 import numpy as np import matplotlib.pyplot as plt import mult
尝试从主机名-rt45_34_we_35 中提取主机名-rt45。我正在使用/(.)_?./g。这似乎不起作用。我已经查看了正则表达式文档。想用?会使它变得贪婪并在第一个下划线处停止。我错过了什么?
我目前正在从事一个数据挖掘项目。我必须阅读 C# 源代码,并且必须找到连接 SQL 语句的位置。我真正想要的是获取连接字符串变量名称的名称。 示例: stat = "SELECT * FROM CUS
我正在订单表上运行查询,以计算每个用户在 6 个月前一个月内的任何一天发出的请求总数(例如:2013 年 8 月)。 这工作正常:- SELECT userid,firstname,surname,s
我对 PHP 很陌生,并且到处都看到不建议使用提取函数。我正在从 mysql 表中获取数据来填充网站的一部分。因此我不知道该表可以有多少行。 所以我使用 extract 函数,它为每行提供一个数组数组
我是一名优秀的程序员,十分优秀!