2016-10-16 6 views
1

私は、単一責任原則(SRP)に違反しないように再因子付けしたいコードをいくつか持っています。単一の責任原則リファクタリング

は、私は以下のクラスは複数の理由で変更される可能性があることを理解する:

  • アップロード方法を変更することができ
  • メタデータスキーマを変更することができ、分析のための

    • ビジネス・ルールはしかし

    を変更することができ、私は、別のクラスにどのように再因子付けできるかを考え出すのに苦労しています。

    Engine.java

    package com.example; 
    
    import java.util.List; 
    
    public interface Engine { 
        public List<Recording> analyze(List<String> files); 
        public List<Recording> getMetadata(List<Recording> recordings); 
        public List<Recording> upload(List<Recording> recordings); 
    } 
    

    CallEngine.java

    package com.example; 
    
    import java.util.ArrayList; 
    import java.util.List; 
    import org.slf4j.Logger; 
    import org.slf4j.LoggerFactory; 
    
    public class CallEngine implements Engine { 
    
        final static Logger log = LoggerFactory.getLogger(Main.class); 
    
        public List<Recording> analyze(List<String> files) { 
        log.info("Analyzing recording files per business rules..."); 
    
        List<Recording> recordings = new ArrayList<Recording>(); 
        return recordings; 
        } 
    
        public List<Recording> getMetadata(List<Recording> r) { 
        log.info("Retrieving metadata for calls..."); 
        List<Recording> recordings = new ArrayList<Recording>(); 
        return recordings; 
        } 
    
        public List<Recording> upload(List<Recording> r) { 
        log.info("Uploading calls..."); 
        List<Recording> recordings = new ArrayList<Recording>(); 
        return recordings; 
        } 
    } 
    
  • 答えて

    1

    SRPは、主インターフェースの後ろにコードを抽象化し、実装が後ろにあることを起こる方とは無関係の機能の責任を委任することによって達成されます実行時のインタフェース

    この場合、自分のインタフェースの背後に責任を抽象化する必要があります。

    例えば

    ...

    public interface Analyzer { 
        public List<Recording> analyze(List<String> files); 
    } 
    public interface Retriever { 
        public List<Recording> getMetadata(List<Recording> recordings); 
    } 
    public interface Uploader { 
        public List<Recording> upload(List<Recording> r); 
    } 
    

    そしてEngine実装の注入可能な依存関係としてそれらを持っています。

    public class CallEngine implements Engine { 
        private Analyzer analyzer; 
        private Retriever retriever; 
        private Uploader uploader; 
    
        public CallEngine(Analyzer analyzer, Retriever retriever, Uploader uploader) { 
         this.analyzer = analyzer; 
         this.retriever = retriever; 
         this.uploader = uploader;   
        } 
    
        public List<Recording> analyze(List<String> files) { 
         return analyzer.analyze(files); 
        } 
    
        public List<Recording> getMetadata(List<Recording> r) { 
         return retriever.getMetadata(r); 
        } 
    
        public List<Recording> upload(List<Recording> r) { 
         return uploader.upload(r); 
        } 
    } 
    

    彼らの実行時間の実装では、それははるかに適応変化させることができる依存クラス実装の全体的な責任に影響を与えることなく変更することができます。

    1
    public interface Analyzer { 
        public void analyze(); 
    } 
    public interface Retriever { 
        public void retrieveMetadata(); 
    } 
    public interface Uploader { 
        public void upload(); 
    } 
    
    public class EngineAnalyzer implements Analyzer { 
    
        final static Logger log = LoggerFactory.getLogger(Main.class); 
    
        public List<Recording> recordings; 
    
        EngineAnaylzer(List<String> Files) { 
    
        } 
    
        public void analyze() { 
        log.info("Analyzing recording files per business rules..."); 
        } 
    
    } 
    
    関連する問題