Что такое хороший шаблон проектирования для отслеживания проблем в классе? - PullRequest
2 голосов
/ 01 июня 2019

У меня есть класс, у которого есть собственный метод equals ().Когда я сравниваю два объекта с использованием этого метода равенства, меня интересует не только то, равны они или нет, но и то, что они не равны, что в них отличалось.Наконец, я хочу иметь возможность извлечь различия, возникающие из-за неравной ситуации.

В настоящее время я использую ведение журнала, чтобы показать, где мои объекты неравны.Это работает, но у меня есть новое требование - иметь возможность извлекать фактические результаты проверки на равенство для отображения позже.Я подозреваю, что для обработки ситуаций такого типа существует объектно-ориентированный шаблон проектирования.

public class MyClass {
  int x;
  public boolean equals(Object obj) {
    // make sure obj is instance of MyClass
    MyClass that = (MyClass)obj;

    if(this.x != that.x) {
      // issue that I would like to store and reference later, after I call equals
      System.out.println("this.x = " + this.x);
      System.out.println("that.x = " + that.x);
      return false;
    } else {
      // assume equality
      return true
    }
  }
}

Существуют ли хорошие предложения шаблона проектирования, где выполняется какая-то работа, но вторичный объект собирает информацию о том, какхорошо, что была проделана работа, которую позже можно извлечь и отобразить?

Ответы [ 2 ]

5 голосов
/ 01 июня 2019

Ваша проблема в том, что вы пытаетесь использовать API boolean equals(Object) для чего-то, для чего он не предназначен. Я не думаю, что есть какой-то шаблон дизайна, который позволил бы вам сделать это.

Вместо этого вы должны делать что-то вроде этого:

public class Difference {
    private Object thisObject;
    private Object otherObject;
    String difference;
    ...
}

public interface Differenceable {
    /** Report the differences between 'this' and 'other'. ... **/
    public List<Difference> differences(Object other);
}

Затем реализуйте это для всех классов, где вы хотите "различную" функциональность. Например:

public class MyClass implements Differenceable {
    int x;
    ...

    public List<Difference> differences(Object obj) {
        List<Difference> diffs = new ArrayList<>();
        if (!(obj instanceof MyClass)) {
             diffs.add(new Difference<>(this, obj, "types differ");
        } else {
             MyClass other = (MyClass) obj;
             if (this.x != other.x) {
                 diffs.add(new Difference<>(this, obj, "field 'x' differs");
             }
             // If fields of 'this' are themselves differenceable, you could
             // recurse and then merge the result lists into 'diffs'.
        }
        return diffs;
    }
}
0 голосов
/ 01 июня 2019

Мне неизвестен конкретный шаблон дизайна для этого.Одна из проблем, связанных с этим требованием, заключается в том, что для выяснения всех различий между двумя неравными объектами вам потребуется продолжить дополнительные сравнения после первого ложного результата (что обычно не требуется).

Если бы я делал это, я мог бы рассмотретьвыполняя обычный тест на равенство и, если не равный, запускает поток, чтобы определить причину и записывает результаты, а не включает такую ​​логику в сам метод equals.Это может быть сделано специальным методом вне метода equals.

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