Сделать абстрактный класс или использовать процессор? - PullRequest
1 голос
/ 09 июня 2010

Я разрабатываю класс для сравнения двух каталогов и запускаю действие, когда каталог / файл в исходном каталоге не существует в каталоге назначения.

Вот прототип класса:

public abstract class IdenticalDirectories
{

    private DirectoryInfo _sourceDirectory;
    private DirectoryInfo _destinationDirectory;

    protected abstract void DirectoryExists(DirectoryInfo sourceDirectory, DirectoryInfo destinationDirectory);
    protected abstract void DirectoryDoesNotExist(DirectoryInfo sourceDirectory, DirectoryInfo destinationDirectory);
    protected abstract void FileExists(DirectoryInfo sourceDirectory, DirectoryInfo destinationDirectory);
    protected abstract void FileDoesNotExist(DirectoryInfo sourceDirectory, DirectoryInfo destinationDirectory);

    public IdenticalDirectories(DirectoryInfo sourceDirectory, DirectoryInfo destinationDirectory)
    {
        ...
    }

    public void Run()
    {

        foreach (DirectoryInfo sourceSubDirectory in _sourceDirectory.GetDirectories()) 
        {
            DirectoryInfo destinationSubDirectory = this.GetDestinationDirectoryInfo(subDirectory);

            if (destinationSubDirectory.Exists()) {
                this.DirectoryExists(sourceSubDirectory, destinationSubDirectory);
            } else {
                this.DirectoryDoesNotExist(sourceSubDirectory, destinationSubDirectory);
            }

            foreach (FileInfo sourceFile in sourceSubDirectory.GetFiles()) {
                FileInfo destinationFile = this.GetDestinationFileInfo(sourceFile);

                if (destinationFile.Exists()) {
                    this.FileExists(sourceFile, destinationFile);
                } else {
                    this.FileDoesNotExist(sourceFile, destinationFile);
                }
            }
        }
    }
}

Вышеприведенный прототип является абстрактным классом.Мне интересно, было бы лучше сделать класс неабстрактным, а приемник метода Run - процессором?например.

public void Run(IIdenticalDirectoriesProcessor processor)
{

    foreach (DirectoryInfo sourceSubDirectory in _sourceDirectory.GetDirectories()) {
        DirectoryInfo destinationSubDirectory = this.GetDestinationDirectoryInfo(subDirectory);

        if (destinationSubDirectory.Exists()) {
            processor.DirectoryExists(sourceSubDirectory, destinationSubDirectory);
        } else {
            processor.DirectoryDoesNotExist(sourceSubDirectory, destinationSubDirectory);
        }


        foreach (FileInfo sourceFile in sourceSubDirectory.GetFiles()) {
            FileInfo destinationFile = this.GetDestinationFileInfo(sourceFile);

            if (destinationFile.Exists()) {
                processor.FileExists(sourceFile, destinationFile);
            } else {
                processor.FileDoesNotExist(sourceFile, destinationFile);
            }

        }

    }

}

Что вы видите за и против каждой реализации?

Ответы [ 2 ]

2 голосов
/ 10 июня 2010

В .NET делегат является предпочтительным способом реализации обратного вызова. В других языках, где делегаты не поддерживаются (т.е. большинство версий Java), тогда интерфейсы являются общими, иногда с классом, обеспечивающим реализацию интерфейса по умолчанию.

В языках, которые поддерживают только одиночное наследование, использование абстрактного класса имеет определенный недостаток: он использует один слот наследования потребителя. Это не проблема с интерфейсами.

2 голосов
/ 10 июня 2010

Передача в IIdenticalDirectoriesProcessor может обеспечить динамическую гибкость во время выполнения и упростить тестирование класса IdenticalDirectories, и не будет связывать реализацию IIdenticalDirectoriesProcessor с классом IdenticalDirectories, как решение абстрактного / производного класса, которое вы первоначально предложили.

Когда у меня есть только 1 или 2 абстрактных метода для переопределения в эти дни, я часто просто принимаю делегаты Func или Action вместо создания интерфейса. Это дает вам высшую степень расцепления. Однако, если их больше 1 или 2, это становится неуклюжим, поэтому вы захотите выбрать более традиционную реализацию.

Только мои мнения, ум.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...