ストラテジ パターン + ファクトリ パターンを使用して、コード内の過剰な if-else を削除します。

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);
    }

この壊れたコードは非常にきれいに見えます。実装の基本的な考え方は、ストラテジ モード + ファクトリ モードを使用することです。コードは、コピー ロジックを実現するために、さまざまなファイル タイプを通じて対応する実装クラスを返します。

基本的なビデオ手順

  1. IFileService インターフェイスを作成する
public interface IFileService {
    
    
    Integer getFileType();
    MMediaInfo copyToLibType(UserQiniuDTO userQiniuDTO, Long mediaId, Integer libType);
}

  1. ビデオ/オーディオ/ピクチャ/ファイル クラス ビデオ 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;
    }
  1. 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 を強制終了する可能性のあるコードが多数あります。

おすすめ

転載: blog.csdn.net/whzhaochao/article/details/116933383