if-else 項目の背景が多すぎます
現在のビジネス ニーズが最初からわかっている場合、ほとんどの人は、コードに if-else 判定をあまり追加しません。悪いコードとは、基本的に、コードが最初に書かれたときに需要があまりないことです。継続的な改訂と追加により、開発時間も比較的短く、コードはできるだけ早く書かれることが多いです。もちろん、さまざまなデザイン パターンを使用するよりも、if-else をもう 1 つ作成する方が確実に高速です。これが、プロジェクト コードが徐々に肥大化して保守が困難になる主な理由です。自由な時間があれば、前のコードに対して操作を実行できます。
まず、この最適化前のコードを見てください。
@Override
public MMediaInfo copyToLibType(UserQiniuDTO userQiniuDTO, Long mediaId, Integer libType) {
MMediaInfo mMediaInfo = new MMediaInfo();
LibTypeEnum libTypeEnum = LibTypeEnum.valueof(libType);
if (libTypeEnum.getFileType().equals(FileType.VIDEO)) {
mMediaInfo = mvideoInfoService.copyToLibType(userQiniuDTO, mediaId, libType);
}
if (libTypeEnum.getFileType().equals(FileType.AUDIO)) {
mMediaInfo = mAudioInfoService.copyToLibType(userQiniuDTO, mediaId, libType);
}
if (libTypeEnum.getFileType().equals(FileType.PICTURE)) {
mMediaInfo = mImgInfoService.copyToLibType(userQiniuDTO, mediaId, libType);
}
if (libTypeEnum.getFileType().equals(FileType.FILE)) {
mMediaInfo= mFileInfoService.copyToLibType(userQiniuDTO, mediaId, libType);
}
return mMediaInfo;
}
いくつかのコードが必要になります。主な理由は、プロジェクトの初期段階ではビデオ/オーディオ要件とオーディオ操作インターフェイスのみがあり、ロジックが分離されており、画像/ファイル要件は後から追加されるためです。ビデオ/オーディオ/ファイル/画像が必要です同じインターフェイスでマージして処理できるため、コード内の多くの操作で多くの if-else 判断が行われます。最適化されたコードを見てください
。
@Override
public MMediaInfo copyToLibType(UserQiniuDTO userQiniuDTO, Long mediaId, Integer libType) {
LibTypeEnum libTypeEnum = LibTypeEnum.valueof(libType);
IFileService iFileService = FileFactory.getFileService(libTypeEnum.getFileType());
return iFileService.copyToLibType(userQiniuDTO, mediaId, libType);
}
この壊れたコードは非常にきれいに見えます。実装の基本的な考え方は、ストラテジ モード + ファクトリ モードを使用することです。コードは、コピー ロジックを実現するために、さまざまなファイル タイプを通じて対応する実装クラスを返します。
基本的なビデオ手順
- IFileService インターフェイスを作成する
public interface IFileService {
Integer getFileType();
MMediaInfo copyToLibType(UserQiniuDTO userQiniuDTO, Long mediaId, Integer libType);
}
- ビデオ/オーディオ/ピクチャ/ファイル クラス ビデオ IFileService インターフェイス
public class MVideoInfoServiceImpl extends ServiceImpl<MvideoInfoMapper, MvideoInfo> implements MvideoInfoService, IFileService {
@Override
public Integer getFileType() {
return FileType.VIDEO;
}
@Override
public MMediaInfo copyToLibType(UserQiniuDTO userQiniuDTO, Long id, Integer libType) {
//复制视频逻辑
return mMediaInfo;
}
- FileFactory ファクトリ クラスを作成する
@Component
public class FileFactory implements ApplicationContextAware {
private static Map<Integer, IFileService> fileServiceMap;
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
Map<String, IFileService> map = applicationContext.getBeansOfType(IFileService.class);
fileServiceMap = new HashMap<>();
map.forEach((key, value) -> fileServiceMap.put(value.getFileType(), value));
}
public static <T extends IFileService> T getFileService(Integer fileType) {
return (T)fileServiceMap.get(fileType);
}
}
要約する
copyToLibType は最適化の単なる方法であり、IFileService には移動/削除など、多くの if-else を強制終了する可能性のあるコードが多数あります。