2

現在リファクタリングしようとしているレガシーコードがあります。

    public class FileManger
    {
        private IFileReader _fileReader;
        private IFileWriter _fileWriter;

        public enum Mode { Read = 1, Write = 2 };

        public void Open( Mode mode)
        {
            if (mode == Mode.Read)
            {
                _fileReader = new FileReader();
            }
            else if (mode == Mode.Write)
            {
                _fileWriter = new FileWriter();
            }
        }
    }

このコードをファクトリメソッドに置き換えて、返されたコードを共通のフィールドに割り当てることができる必要があります。

だから..私はそれを次のように見せようとしています:

public class FileManger
{
    private IFileHandler _fileHandler;

    public enum Mode { Read = 1, Write = 2 };

    public void Open(string fileName, Mode mode)
    {
        _fileHandler = Factory.CreateFileHandler(mode);
    }
 }

私が抱えている問題は、2つの元のインターフェイスIFileReaderとIFileWriterです。これらは互いに非常に近い形状ですが、2つの完全に異なるメソッドstring ReadLine()があります。およびvoidWriteLine(string line); 私は一般的なアブストラクションを見つけることができませんでした。

基本的に、私のリファクタリングの目標は、IFileReaderインターフェイスとIFileWriterインターフェイスを同じように見せ、2つではなく共通のインターフェイスを使用することです。

現在、これらのインターフェイスは次のようになっています。

 public interface IFileReader : IDisposable
    {
        void OpenFileStream(string fileName);
        void Close();

        string ReadLine();
    }

public interface IFileWriter : IDisposable
    {

        void OpenFileStream(string fileName);
        void Close();

        void WriteLine(string line);
    }

誰かが私がこれを達成するためにどのように回避できるかについていくつかの提案を私に与えることができますか?

わかりにくい場合は、さらに詳しい説明が必要な場合はお知らせください。

4

1 に答える 1

1

このようなさまざまな操作に共通のインターフェイスを使用する理由はよくわかりませんが、それには十分な理由があると仮定すると、lineファイルモードに応じて、読み取りまたは書き込みを行う次のようなことができると思います。

public interface IFileAccessor : IDisposable
{
    void OpenFileStream(string fileName);
    void Close();
    void TransferLine(ref string line);
}
于 2012-06-25T12:05:54.877 に答える