Какой шаблон дизайна, или анти-шаблон? - PullRequest
4 голосов
/ 22 октября 2010

Я опишу, что я пытаюсь сделать, и, надеюсь, кто-нибудь скажет мне, что это за шаблон проектирования, или укажет лучшую альтернативу.

У меня есть метод, который делает кучу сложных вещейэто включает в себя приближение. Можно вычислить результат без аппроксимации, но это требует больше работы.

Я хочу получить несколько сравнений, связанных с внутренней работой реализации.Моя идея - передать объект, который будет выполнять эту дополнительную работу, и сохранить информацию о сравнениях.

Я думаю, что хочу перейти от:

class Classifier(object):
    ...
    def classify(self, data):
        # Do some approximate stuff with the data and other
        # instance members.

к

class TruthComparer(object):
    def compute_and_store_stats(self, data, accessory_data):
        # Do the exact computation, compare to the approximation,
        # and store it.

    def get_comparison_stats(self):
        # Return detailed and aggregate information about the
        # differences between the truth and the approximation.

class Classifier(object):
    ...
    def classify(self, data, truth_comparer=None):
        # Do some approximate stuff with the data and other
        # instance members.
        # Optionally, do exact stuff with the data and other
        # instance members, storing info about differences
        # between the exact computation and the approximation
        # in the truth_comparer
        if truth_comparer is not None:
            truth_comparer.compute_and_store_stats(data,
                                                   [self._index, self._model],
                                                   intermediate_approximation)

Причина, по которой я не хочу выполнять эти сравнения внутри метода classify, заключается в том, что я не думаю, что он подходит для работы этого метода или объекта для таких сравнений.

Итак, что это за шаблон дизайна, если таковой имеется?Можете ли вы предложить альтернативу?

Ответы [ 2 ]

2 голосов
/ 23 октября 2010

Вы можете использовать Pattern Decorator . Вы определяете интерфейс Classifier и используете TruthComparerDecorator, который наследуется от Classifier. Декоратор TruthComparer принимает Classifier в качестве входных данных, вычисляет аппроксимацию с этим экземпляром классификатора и затем запускает метод compute_and_store_stats. Используя этот шаблон, вам, классификатору, не нужно ничего знать о TruthComparer. В конце концов, TruthComparer - это Classifier, но он делает еще кое-что. В Java это может выглядеть так:

public interface Classifier {
    void classify(Data data);
}

public abstract class TruthComparer implements Classifier {
    private Classifier classifier;
    public TruthComparerDecorator(Classifier classifier) {
        this.classifier = classifier;
    }
    public void classify(Data data) {
        classifier.classify(data);
        computeAndStoreStats(data);
    }
    public abstract void computeAndStoreStats(Data data);
}
0 голосов
/ 23 октября 2010

Моя проблема с вашим предложенным изменением заключается в том, что классификатор не правильно запрашивает часть вычисления и сохранения статистики. Классификатор не должен беспокоиться об этом. В идеале, он даже не должен знать, что TruthComparer существует.

Я бы посоветовал вам действительно использовать два метода для Classifier: classify / classify_exact. Classify возвращает приблизительный результат; classify_exact возвращает точный результат. Вместо того, чтобы передавать TruthComparer в качестве параметра, передайте TruthComparer две классификации и дайте ему сделать свое дело.

Таким образом, вы уменьшаете количество объектов, с которыми должен работать ваш классификатор (более низкая связь), и я думаю, что делает происходящее яснее.

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