精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

解決冗余代碼的三種方法,讓你的代碼更上一層樓

開發 前端
向 FtpProvider? 接口添加一個新方法,需要我們僅在一個地方進行更改。我們可以輕松地將我們的 FtpProvider? 注入到其他服務中。此解決方案的強項可能是 @FtpOperation? 注釋,它可以在 FtpProvider 上下文實現之外使用,但是將 Ftp 操作的邏輯劃分到單獨的類中并不是一個好方法。

?前言

冗余代碼向來是代碼的一種壞味道,也是我們程序員要極力避免的。今天我通過一個示例和大家分享下解決冗余代碼的3個手段,看看哪個最好。

問題描述

為了描述這個問題,我將使用 FtpClient 作為示例。要從 ftp 服務器獲取一些文件,你需要先建立連接,下一步是登錄,然后執行查看ftp文件列表、刪除ftp文件,最后注銷并斷開連接, 代碼如下:

public class FtpProvider{

private final FTPClient ftpClient;

public FTPFile[] listDirectories(String parentDirectory) {
try {
ftpClient.connect("host", 22);
ftpClient.login("username", "password");
return ftpClient.listDirectories(parentDirectory);
} catch (IOException ex) {
log.error("Something went wrong", ex);
throw new RuntimeException(ex);
} finally {
try {
ftpClient.logout();
ftpClient.disconnect();
} catch (IOException ex) {
log.error("Something went wrong while finally", ex);
}
}
}

public boolean deleteFile(String filePath) {
try {
ftpClient.connect("host", 22);
ftpClient.login("username", "password");
return ftpClient.deleteFile(filePath);
} catch (IOException ex) {
log.error("Something went wrong", ex);
throw new RuntimeException(ex);
} finally {
try {
ftpClient.logout();
ftpClient.disconnect();
} catch (IOException ex) {
log.error("Something went wrong while finally", ex);
}
}
}
}

正如上面代碼所示,listDirectories和downloadFtpFile?中都包含了ftp連接、登錄以及最后的注銷操作,存在大量冗余的代碼,那有什么更好的辦法清理冗余代碼呢?下面推薦3個做法,所有三個提出的解決方案都將實現以下 FtpProvider 接口,我將比較這些實現并選擇更好的一個。

public interface FtpProvider {

FTPFile[] listDirectories(String directory) throws IOException;

boolean deleteFile(String filePath) throws IOException;
}

1. 使用@Aspect 代理

  • 首先創建一個注解, 用來注解需要代理的方法
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface FtpOperation {
}
  • 創建一個類實現 FtpProvider接口, 將注解添加到方法 listDirectories 和 deleteFile 中
@Slf4j
@Service
class FtpProviderImpl implements FtpProvider {

private final FTPClient ftpClient;

@Override
public FTPFile[] listDirectories(String directory) throws IOException {
return ftpClient.listDirectories(directory);
}

@Override
public boolean deleteFile(String filePath) throws IOException {
return ftpClient.deleteFile(filePath);
}
}
  • 實現注解的代理切面邏輯
@Slf4j
@Aspect
@Component
@RequiredArgsConstructor
public class FtpOperationProxy {

private final FTPClient ftpClient;

@Around("@annotation(daniel.zielinski.redundancy.proxyaop.infrastructure.FtpOperation)")
public Object handle(ProceedingJoinPoint joinPoint) throws Throwable {
try {
ftpClient.connect("host", 22);
ftpClient.login("username", "password");
return joinPoint.proceed();
} catch (IOException ex) {
log.error("Something went wrong", ex);
throw new RuntimeException(ex);
} finally {
try {
ftpClient.logout();
ftpClient.disconnect();
} catch (IOException ex) {
log.error("Something went wrong while finally", ex);
}
}
}
}

所有用@FtpOperation? 注解的方法都會在這個地方執行joinPoint.proceed()。

2. 函數式接口

  • 創建一個函數式接口
@FunctionalInterface
interface FtpOperation<T, R> {

R apply(T t) throws IOException;
}
  • 定義ftp執行模板
@RequiredArgsConstructor
@Slf4j
@Service
public class FtpOperationTemplate {

private final FTPClient ftpClient;

public <K> K execute(FtpOperation<FTPClient, K> ftpOperation) {
try {
ftpClient.connect("host", 22);
ftpClient.login("username", "password");
return ftpOperation.apply(ftpClient);
} catch (IOException ex) {
log.error("Something went wrong", ex);
throw new RuntimeException(ex);
} finally {
try {
ftpClient.logout();
ftpClient.disconnect();
} catch (IOException ex) {
log.error("Something went wrong while finally", ex);
}
}
}

}
  • 定義實現類
@RequiredArgsConstructor
@Slf4j
@Service
class FtpProviderFunctionalInterfaceImpl implements FtpProvider {

private final FtpOperationTemplate ftpOperationTemplate;

public FTPFile[] listDirectories(String parentDirectory) {
return ftpOperationTemplate.execute(ftpClient -> ftpClient.listDirectories(parentDirectory));
}

public boolean deleteFile(String filePath) {
return ftpOperationTemplate.execute(ftpClient -> ftpClient.deleteFile(filePath));
}
}

我們正在 FtpOperationTemplate? 上執行方法 execute? 并且我們正在傳遞 lambda? 表達式。我們將放入 lambda? 中的所有邏輯都將代替 ftpOperation.apply(ftpClient) 函數執行。

3. 模板方法

  • 創建一個抽象的模板類
@RequiredArgsConstructor
@Slf4j
@Service
abstract class FtpOperationTemplate<T, K> {

protected abstract K command(FTPClient ftpClient, T input) throws IOException;

public K execute(FTPClient ftpClient, T input) {
try {
ftpClient.connect("host", 22);
ftpClient.login("username", "password");
return command(ftpClient, input);
} catch (IOException ex) {
log.error("Something went wrong", ex);
throw new RuntimeException(ex);
} finally {
try {
ftpClient.logout();
ftpClient.disconnect();
} catch (IOException ex) {
log.error("Something went wrong while finally", ex);
}
}
}

}
  • 列出ftp目錄listDirectories方法的實現
@Slf4j
@Service
class FtpOperationListDirectories extends FtpOperationTemplate<String, FTPFile[]> {

@Override
protected FTPFile[] command(FTPClient ftpClient, String input) throws IOException {
return ftpClient.listDirectories(input);
}
}
  • 刪除文件deleteFile方法的實現
@Slf4j
@Service
class FtpOperationDeleteFile extends FtpOperationTemplate<String, Boolean> {

@Override
protected Boolean command(FTPClient ftpClient, String input) throws IOException {
return ftpClient.deleteFile(input);
}
}
  • 實現FtpProvider接口
@RequiredArgsConstructor
@Slf4j
@Service
public class FtpProviderTemplateImpl implements FtpProvider {

private final FtpOperationTemplate<String, FTPFile[]> ftpOperationListDirectories;
private final FtpOperationTemplate<String, Boolean> ftpOperationDeleteFile;
private final FTPClient ftpClient;

public FTPFile[] listDirectories(String parentDirectory) {
return ftpOperationListDirectories.execute(ftpClient, parentDirectory);
}

public boolean deleteFile(String filePath) {
return ftpOperationDeleteFile.execute(ftpClient, filePath);
}
}

我們正在 FtpOperationTemplate? 上執行方法 execute? 并在那里傳遞我們的參數。因此執行方法的邏輯對于 FtpOperationTemplate 的每個實現都是不同的。

總結

我們現在來比較下上面種方式:

  • @Aspect切面方式實現

向 FtpProvider? 接口添加一個新方法,需要我們僅在一個地方進行更改。我們可以輕松地將我們的 FtpProvider? 注入到其他服務中。此解決方案的強項可能是 @FtpOperation? 注釋,它可以在 FtpProvider 上下文實現之外使用,但是將 Ftp 操作的邏輯劃分到單獨的類中并不是一個好方法。

  • 函數式接口實現

向接口 FtpProvider? 添加一個新方法,需要我們僅在一個地方進行更改。我們可以輕松地將我們的 FtpProvider 注入到其他服務中。我們將ftp操作的邏輯封裝在一個類中。相對于上面的方式,我們也沒有用到AOP的庫,所以我個人還是比較推薦的。

  • 模板方法實現

向接口 FtpProvider? 添加一個新方法,需要我們在兩個地方進行更改。我們需要添加一個新的類,會導致類爆炸,另外,我們還需要將實現注入到 FtpProvider。

如果是你,你會選擇哪種方式呢?還是有更好的方法?

責任編輯:武曉燕 來源: JAVA旭陽
相關推薦

2021-03-25 15:07:50

編程技術工具

2014-08-18 14:54:54

Git

2017-07-27 08:38:51

JavaLinux

2012-05-28 14:18:33

Web

2011-03-31 09:51:45

Windows XP

2023-09-24 23:07:24

流量抑制風暴控制

2011-03-31 09:57:54

Windows XP

2023-04-26 13:55:00

Python開發技能

2021-01-21 11:24:16

智能安全首席信息安全官CISO

2019-08-26 14:53:32

數據中心運維管理宕機

2023-12-19 18:08:47

MySQL方法優化查詢

2019-08-26 10:10:57

數據中心運維宕機

2015-03-30 09:48:33

程序員更上一層樓

2023-11-01 13:34:37

Python

2017-07-31 17:54:04

IT技術周刊

2009-10-23 14:46:43

2024-06-20 13:22:13

C++11C++模板

2023-07-04 08:33:46

Python對象編程

2013-06-06 06:52:28

Ubuntu 13.0

2023-07-21 08:01:13

CSSInherit?
點贊
收藏

51CTO技術棧公眾號

欧美卡一卡二卡三| 人妻内射一区二区在线视频 | 日韩精品无码一区二区三区久久久 | 91嫩草精品| 福利微拍一区二区| 色综合影院在线观看| 性生交生活影碟片| 可以免费看不卡的av网站| 久久精品久久精品亚洲人| 波多野结衣加勒比| 成人深夜福利| 午夜精品视频一区| 亚洲最大免费| 天堂av手机版| 亚洲精品自在在线观看| 日本黑人久久| 国产老妇伦国产熟女老妇视频| 亚洲天堂男人| 中文字幕最新精品| 亚洲av无码一区二区三区网址| 日韩精品第二页| 欧美日韩中文字幕| 国产日韩欧美大片| 第一福利在线| 99久久久免费精品国产一区二区| 国产精品久久久久秋霞鲁丝 | 亚洲一区二区高清| 国产伦精品一区二区| 成人免费区一区二区三区| 久久精品亚洲人成影院| 亚洲视频国产视频| 欧美xxxxx精品| 电影一区二区三区久久免费观看| 一本色道久久综合亚洲精品按摩| 日本国产中文字幕| 91美女视频在线| 久久蜜臀精品av| 精品久久久久久中文字幕动漫| 国产绿帽刺激高潮对白| 老妇女50岁三级| japanese色系久久精品| 欧美无砖专区一中文字| av动漫在线观看| а√天堂中文资源在线bt| 椎名由奈av一区二区三区| 日韩av一区二区三区在线观看| 视频一区 中文字幕| 国产精品1区2区| 91精品视频观看| 中文有码在线播放| 日韩国产在线观看一区| 国产成人一区二区三区| 久久99精品波多结衣一区| 亚洲无线视频| 午夜精品理论片| 国产精品suv一区二区| 欧美a级在线| 免费99精品国产自在在线| 在线观看黄网址| 天天av综合| 欧美成人一区在线| 欧美三级在线免费观看| 91不卡在线观看| 另类少妇人与禽zozz0性伦| 国产视频精品免费| 99久久99视频只有精品| 久久久久999| 久久久久亚洲av无码专区体验| 午夜久久99| 久久久免费观看| 国产成人精品a视频一区| 亚洲激精日韩激精欧美精品| 91国产一区在线| 6080午夜伦理| 七七婷婷婷婷精品国产| 国产在线观看不卡| a级片在线视频| 成人永久免费视频| 蜜桃麻豆91| 成人激情电影在线看| 国产精品萝li| 亚洲小视频在线播放| 男男gaygays亚洲| 岛国精品视频在线播放| 成年人网站大全| 一区在线不卡| 亚洲丁香婷深爱综合| 成年人网站免费看| 成人激情开心网| 精品中文字幕在线观看| 日韩一区二区视频在线| 免费看日韩精品| av一区观看| 国产免费视频在线| 亚洲精品日韩综合观看成人91| 日韩网站在线免费观看| 欧美与亚洲与日本直播| 欧美电影免费提供在线观看| 免费看黄色aaaaaa 片| 欧美电影《睫毛膏》| 久久欧美在线电影| 日本一区二区三区久久| 国产成人小视频| 日本一区二区免费看| 4438x成人网全国最大| 日韩欧美国产中文字幕| 国产精品自在自线| 亚洲激情播播| 成人97在线观看视频| 黄色一级视频免费看| 国产成人在线视频免费播放| 日本一区视频在线| 牛牛精品在线| 884aa四虎影成人精品一区| 泷泽萝拉在线播放| 欧美二区不卡| 国产情人节一区| 三级av在线| 亚洲一二三四在线观看| 无限资源日本好片| 神马日本精品| 久久久久久久久亚洲| 一本到在线视频| 久久免费午夜影院| av日韩一区二区三区| 亚洲免费一区| 亚洲色图35p| 国产精品100| 成人动漫一区二区| 视色,视色影院,视色影库,视色网| 久久久一本精品| 日韩电影第一页| 国产中文字幕免费| 国产在线看一区| 一区二区三区av在线| free欧美| 国产一区二区三区中文| 日韩精品在线免费视频| www.视频一区| 青娱乐自拍偷拍| 国产精品网址| 97精品在线观看| 色呦呦免费观看| 极品av在线| 亚洲永久精品国产| 国产在线视频三区| 一本精品一区二区三区| 成人有码在线播放| 老司机福利在线视频| 欧美视频一区二区三区四区 | 91一区二区视频| 国产精品成人一区二区艾草 | 日韩中文字幕亚洲精品欧美| 国产精品久久久久久av公交车| 色偷偷88888欧美精品久久久| 日批视频免费观看| 国产精品久久久久四虎| 999在线观看| 欧美激情理论| 亚洲a∨日韩av高清在线观看| 国产高清一区二区三区视频 | 三级在线观看网站| 午夜免费久久看| 三级男人添奶爽爽爽视频| 亚洲女人av| 亚洲高清视频一区| 亚洲爽爆av| 欧美激情欧美激情在线五月| 日本wwwxxxx| 色哟哟精品一区| 女人十八毛片嫩草av| 麻豆视频一区二区| 99re8这里只有精品| 国产精品99久久免费观看| 91高清免费视频| 伊人免费在线| 精品国产乱码久久久久久闺蜜| 青青草成人av| 中文一区在线播放| 日批视频在线看| 亚洲深爱激情| 亚洲高清视频一区二区| 久久伊人精品| 热久久免费视频精品| 麻豆视频在线免费观看| 亚洲精品一区在线观看| 中文字幕在线天堂| 亚洲免费资源在线播放| 国产精品伦子伦| 久久国产福利国产秒拍| 高清欧美精品xxxxx| 成人毛片免费看| 国产精品乱码视频| 国产经典一区| 久久久久久久一区二区| 国产精品二线| 亚洲精品一区在线观看| 中文字幕av片| 天天色 色综合| 国产传媒免费在线观看| 91网页版在线| 亚洲天堂小视频| 久久一二三四| 国产免费一区二区视频| 日韩一区二区在线免费| 久久免费视频1| 激情五月综合婷婷| 国产激情999| 七七成人影院| 久久精品青青大伊人av| 亚洲 欧美 激情 另类| 欧美一级黄色大片| 男人天堂视频在线| 午夜一区二区三区在线观看| 强制高潮抽搐sm调教高h| 91日韩精品一区| 91亚洲一线产区二线产区| 久久99精品久久久久久久久久久久| 日日摸日日碰夜夜爽无码| 欧美黄色大片在线观看| 成人av网在线| 91黄色在线看| 91精品国产91久久久久久黑人| 久久99九九| 超碰97久久国产精品牛牛| 国产日韩在线观看av| 成人亚洲欧美| 2019中文字幕全在线观看| 日韩三级电影视频| 久久精品电影网| 成年在线观看免费人视频| 亚洲精品视频中文字幕| 天天操天天操天天操| 日韩欧美中文字幕公布| 国产在线观看第一页| 色婷婷亚洲精品| 日韩视频在线观看一区| 精品成人乱色一区二区| 日韩欧美激情视频| 亚洲午夜久久久久| 免费在线观看av网址| 一区二区在线观看免费视频播放| 免费成人深夜夜行网站| 国产精品麻豆一区二区| 日本高清黄色片| 国产精品三级视频| 欧美老女人性生活视频| 国产欧美日产一区| 男人的天堂官网| 国产精品人妖ts系列视频| 超碰97av在线| 国产精品久久久久久久久久免费看 | 日本免费不卡一区二区| 一本色道精品久久一区二区三区 | 日韩精品久久久| 国产影视一区| 亚洲一二三区在线| 国产精品精品国产一区二区| 91免费视频黄| 午夜精品久久99蜜桃的功能介绍| wwwwww欧美| 欧美精品三区| av动漫在线看| 日本中文一区二区三区| 欧美在线aaa| 国产一区 二区 三区一级| 黑人无套内谢中国美女| 成人av电影在线播放| 中文字幕国产综合| 日本一二三不卡| 777777国产7777777| 一区二区三区在线播| 日韩成人高清视频| 一本久久综合亚洲鲁鲁五月天 | 99久久er| 92国产精品久久久久首页| 日韩视频一二区| 久久久久久精| 欧美丰满日韩| 99热久久这里只有精品| 久久久久久黄| 97超碰免费在线观看| 91丨porny丨首页| 大胸美女被爆操| 一区二区三区四区中文字幕| 日韩精品在线观看免费| 欧美精品三级在线观看| 懂色av一区二区三区四区| 亚洲精品小视频在线观看| 色老头视频在线观看| 久久久久久噜噜噜久久久精品| 精品亚洲美女网站| 91影院未满十八岁禁止入内| 国产成人精品999在线观看| 欧美 国产 精品| 久久中文在线| 少妇极品熟妇人妻无码| 国产亚洲一区字幕| 欧美日韩免费做爰视频| 在线一区二区三区四区五区| www.国产黄色| 伊人青青综合网站| wwww在线观看免费视频| 国产精品自拍视频| 牛牛精品成人免费视频| 国产精品av免费| 久久精选视频| 欧美xxxx×黑人性爽| ...中文天堂在线一区| 天天干天天干天天干天天| 日韩一区二区在线观看视频播放| 国产69久久| 96精品视频在线| 91精品导航| 精品国产三级a∨在线| 日韩精品电影一区亚洲| 菠萝菠萝蜜网站| 亚洲综合成人网| 91激情在线观看| 亚洲香蕉伊综合在人在线视看| gogo高清午夜人体在线| 91色精品视频在线| 日韩欧美中字| 亚洲精品一二三四五区| 99久精品国产| 国产视频91在线| 亚洲成人久久久久| 大桥未久一区二区| 欧美日韩日本国产亚洲在线| www.com黄色片| 久久久国产精品午夜一区ai换脸| 久久精品国产亚洲av高清色欲| 欧美精品三级日韩久久| 国产高清免费av在线| 日本高清久久天堂| 日韩av午夜| 欧美 丝袜 自拍 制服 另类| 成人一区二区三区中文字幕| 免费毛片在线播放免费| 91麻豆精品国产自产在线观看一区| 自拍视频在线免费观看| 国产精品久久久久77777| 蜜桃成人av| 又色又爽又高潮免费视频国产| 久久网这里都是精品| 久久青青草视频| 亚洲乱码av中文一区二区| 国产无遮挡裸体视频在线观看| 动漫一区二区在线| 影音先锋一区| 亚洲观看黄色网| 精品久久久久久电影| 午夜在线视频观看| 欧美尤物巨大精品爽| 亚洲人成伊人成综合图片| 欧美三级一级片| 久久综合狠狠综合| 国产女主播喷水视频在线观看| 亚洲香蕉成视频在线观看| www成人在线视频| 日本黄色a视频| 国产成人精品免费看| 国产极品美女高潮无套嗷嗷叫酒店| 亚洲大胆人体视频| 极品美鲍一区| 亚洲国产综合自拍| 老司机免费视频一区二区| 性色av无码久久一区二区三区| 精品捆绑美女sm三区| av高清不卡| 亚洲欧美成人一区| 国产在线视视频有精品| 精品深夜av无码一区二区老年| 日韩av一区二区在线| 桃花岛tv亚洲品质| 亚洲一区精彩视频| 国产成人综合在线| 亚洲天堂av片| 色婷婷av一区二区三区在线观看 | 青青青伊人色综合久久| 久久一级免费视频| 日韩一区二区电影| 手机在线观看av| 亚洲一二区在线| 波多野洁衣一区| 中文字幕在线观看免费| 欧美风情在线观看| 精品美女久久久| 在线观看岛国av| 精品久久久久久国产91| 69视频在线观看| 国产一区国产精品| 另类综合日韩欧美亚洲| 国产在线视频二区| 亚洲性日韩精品一区二区| 日韩三级av高清片| 天天操天天爱天天爽| 亚洲福利视频三区| 99精品老司机免费视频| 国产在线一区二区三区四区|