Java 两法合一
我最近进行了一次代码审查,有人坚决建议我将两个方法合并为一个。这两个方法都是相同的,除了在每个方法中调用一个方法外,还有一个方法不需要参数 方法#1Java 两法合一,java,refactoring,Java,Refactoring,我最近进行了一次代码审查,有人坚决建议我将两个方法合并为一个。这两个方法都是相同的,除了在每个方法中调用一个方法外,还有一个方法不需要参数 方法#1 private void updateCache(List<CategoryObject> objectList) { ServiceApi serviceApi = getService(); if (serviceApi != null) { try { serviceApi.
private void updateCache(List<CategoryObject> objectList) {
ServiceApi serviceApi = getService();
if (serviceApi != null) {
try {
serviceApi.updateResources(objectList);
} catch (BusinessException e) {
log.error(e);
}
}
}
这些甚至可以有效地结合起来吗?您可以只使用一种方法,并通过输入参数进行区分:
private void updateCache(List<CategoryObject> objectList) {
ServiceApi serviceApi = getService();
if (serviceApi != null) {
try {
if(objectList != null){
serviceApi.updateResources(objectList);
}
else{
serviceApi.registerCategory(CATEGORY_NAME);
}
} catch (BusinessException e) {
log.error(e);
}
}
}
private void updateCache(列表对象列表){
ServiceApi ServiceApi=getService();
如果(serviceApi!=null){
试一试{
if(objectList!=null){
serviceApi.updateResources(objectList);
}
否则{
serviceApi.registerCategory(类别名称);
}
}捕获(业务异常e){
日志错误(e);
}
}
}
也许还应该重构方法名:handleCache()
然后可以通过两种方式调用该方法:
handleCache(objectList)
-->与方法1类似
handleCache(null)
-->与方法2类似您可以只使用一个方法并通过输入参数进行区分:
private void updateCache(List<CategoryObject> objectList) {
ServiceApi serviceApi = getService();
if (serviceApi != null) {
try {
if(objectList != null){
serviceApi.updateResources(objectList);
}
else{
serviceApi.registerCategory(CATEGORY_NAME);
}
} catch (BusinessException e) {
log.error(e);
}
}
}
private void updateCache(列表对象列表){
ServiceApi ServiceApi=getService();
如果(serviceApi!=null){
试一试{
if(objectList!=null){
serviceApi.updateResources(objectList);
}
否则{
serviceApi.registerCategory(类别名称);
}
}捕获(业务异常e){
日志错误(e);
}
}
}
也许还应该重构方法名:handleCache()
然后可以通过两种方式调用该方法:
handleCache(objectList)
-->与方法1类似
handleCache(null)
-->与方法2类似您可以将内部功能拉出到接口中:
private interface Op {
void perform(ServiceApi serviceApi);
}
static void cache(Op op) {
ServiceApi serviceApi = getService();
if (serviceApi != null) {
try {
op.perform(serviceApi);
} catch (BusinessException e) {
log.error(e);
}
}
}
private void updateCache(List<CategoryObject> objectList) {
cache(new Op() {
@Override
public void perform(ServiceApi serviceApi) {
serviceApi.updateResources(objectList);
}
});
}
private void registerCache() {
cache(new Op() {
@Override
public void perform(ServiceApi serviceApi) {
serviceApi.registerCategory(CATEGORY_NAME);
}
});
}
专用接口Op{
作废执行(ServiceApi ServiceApi);
}
静态空缓存(Op){
ServiceApi ServiceApi=getService();
如果(serviceApi!=null){
试一试{
op.perform(serviceApi);
}捕获(业务异常e){
日志错误(e);
}
}
}
私有void updateCache(列表对象列表){
缓存(新操作(){
@凌驾
公共作废执行(ServiceApi ServiceApi){
serviceApi.updateResources(objectList);
}
});
}
私有无效注册表缓存(){
缓存(新操作(){
@凌驾
公共作废执行(ServiceApi ServiceApi){
serviceApi.registerCategory(类别名称);
}
});
}
在Java8中,这两种方法变得非常简单和优雅
private void updateCache(List<CategoryObject> objectList) {
cache(serviceApi -> serviceApi.updateResources(objectList));
}
private void registerCache() {
cache(serviceApi -> serviceApi.registerCategory(CATEGORY_NAME));
}
private void updateCache(列表对象列表){
缓存(serviceApi->serviceApi.updateResources(objectList));
}
私有无效注册表缓存(){
缓存(serviceApi->serviceApi.registerCategory(类别名称));
}
您可以将内部功能拉出到界面中:
private interface Op {
void perform(ServiceApi serviceApi);
}
static void cache(Op op) {
ServiceApi serviceApi = getService();
if (serviceApi != null) {
try {
op.perform(serviceApi);
} catch (BusinessException e) {
log.error(e);
}
}
}
private void updateCache(List<CategoryObject> objectList) {
cache(new Op() {
@Override
public void perform(ServiceApi serviceApi) {
serviceApi.updateResources(objectList);
}
});
}
private void registerCache() {
cache(new Op() {
@Override
public void perform(ServiceApi serviceApi) {
serviceApi.registerCategory(CATEGORY_NAME);
}
});
}
专用接口Op{
作废执行(ServiceApi ServiceApi);
}
静态空缓存(Op){
ServiceApi ServiceApi=getService();
如果(serviceApi!=null){
试一试{
op.perform(serviceApi);
}捕获(业务异常e){
日志错误(e);
}
}
}
私有void updateCache(列表对象列表){
缓存(新操作(){
@凌驾
公共作废执行(ServiceApi ServiceApi){
serviceApi.updateResources(objectList);
}
});
}
私有无效注册表缓存(){
缓存(新操作(){
@凌驾
公共作废执行(ServiceApi ServiceApi){
serviceApi.registerCategory(类别名称);
}
});
}
在Java8中,这两种方法变得非常简单和优雅
private void updateCache(List<CategoryObject> objectList) {
cache(serviceApi -> serviceApi.updateResources(objectList));
}
private void registerCache() {
cache(serviceApi -> serviceApi.registerCategory(CATEGORY_NAME));
}
private void updateCache(列表对象列表){
缓存(serviceApi->serviceApi.updateResources(objectList));
}
私有无效注册表缓存(){
缓存(serviceApi->serviceApi.registerCategory(类别名称));
}
如果要重构这两个方法,我会将它们区分开来。它们的意图是不同的,因此为了可读性,方法名称应该反映这一点。但是我要改变这两种方法的共同点:错误处理。如果服务不存在或抛出BusinessException,则调用方不会收到任何通知。我会让serviceApi==null,BusinessException会从方法中抛出一些东西,这样您的调用者就会得到通知。坚决建议:)如果我要重构这两个方法,我会让它们保持不同。它们的意图是不同的,因此为了可读性,方法名称应该反映这一点。但是我要改变这两种方法的共同点:错误处理。如果服务不存在或抛出BusinessException,则调用方不会收到任何通知。我会让serviceApi==null大小写和BusinessException从方法中抛出一些东西,以便您的调用方得到通知。坚定地建议:)谢谢!这很有帮助。我忽略了这一点,但是serviceApi
是一个OSGi服务,每次使用都需要查找它。在Java 8示例中,serviceApi
是一个类字段吗?@fojalar-serviceApi
是刚刚获得的全新字段,并在op.perform(serviceApi)时传递给op
代码>发生。它应该以与原始代码完全相同的方式运行。首先看一下Java-7版本以确认。谢谢!这很有帮助。我忽略了这一点,但是serviceApi
是一个OSGi服务,每次使用都需要查找它。在Java 8示例中,serviceApi
是一个类字段吗?@fojalar-serviceApi
是刚刚获得的全新字段,并在op.perform(serviceApi)时传递给op
代码>发生。它应该以与原始代码完全相同的方式运行。首先查看Java-7版本以确认。