Передача аргументов между классами - использовать открытые свойства или передать класс свойств в качестве аргумента? - PullRequest
1 голос
/ 07 апреля 2010

Итак, давайте предположим, что у меня есть класс с именем ABC, который будет иметь список объектов Point.

Мне нужно сделать с ними некоторую логику рисования.Каждый из этих объектов Point будет иметь метод Draw (), который будет вызываться классом ABC.

Код метода Draw () будет нуждаться в информации из класса ABC.

Я вижу только два способа заставить их иметь эту информацию:

  1. Наличие класса Abcсделайте общедоступными некоторые свойства, которые позволят draw () принимать свои решения.
  2. Наличие класса Abc pass для draw () класса, полного свойств.

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

Если есть другие хорошие подходы, не стесняйтесь поделиться ими.

Вот оба случая:

class Abc1 {
    public property a;
    public property b;
    public property c;
    ...
    public property z;

    public void method1();
    ...
    public void methodn();
}

и вот подход 2:

class Abc2 {
    //here we make take down all properties

    public void method1();
    ...
    public void methodn();
}

class Abc2MethodArgs {
    //and we put them here. this class will be passed as argument to
    //Point's draw() method!
    public property a;
    public property b;
    public property c;
    ...
    public property z;
}

Кроме того, если есть какие-либо "формальные" названия для этих двух подходов, я хотел бы знатьих, чтобы я мог лучше выбрать теги / имя потока, так что это более полезно для целей поиска.Это или не стесняйтесь редактировать их.

Ответы [ 5 ]

2 голосов
/ 07 апреля 2010

Лучший подход зависит от характера информации, которую ABC должна предоставить экземплярам Point, характера отношений между этими классами и «ожидаемого» будущего для них. Другими словами, существует множество качественных факторов.

Если вы действительно передаете экземпляр Point a ABC, не , а скорее, отрабатываете подходящую абстракцию для всего, что нужно Point от ABC, и инкапсулируете ее в интерфейс. В статических терминах это похоже на простое создание нового класса для инкапсуляции информации, но динамически совсем другое.

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

И, на более абстрактном уровне, это будет иметь больше смысла и позволит логические изменения позже, если вы определите причину этой кажущейся круговой зависимости и вычеркните ее - то есть создадите интерфейс для представления этого «источника данных для точек» роль, которую ABC должен выполнять. Эта роль отличается от роли «контейнер для очков», и это должно быть отражено в вашем дизайне.

Вы также можете передать параметры в метод draw () - опять же, это может быть хорошо или плохо в зависимости от кучи факторов. Это, конечно, не очень плохая вещь, если вы думаете о последствиях.

2 голосов
/ 07 апреля 2010

Будет больше работы по созданию и поддержке отдельного класса для передачи состояния между ABC и point, но это стоит делать, если вы хотите отделить point от ABC.

Главный вопрос в том, насколько важно для них разделение, если это вообще имеет значение?Если в вашем домене имеет смысл знать точечные экземпляры об экземплярах abc, то, вероятно, не стоит создавать класс параметров, и вам следует просто выбрать вариант 1.

1 голос
/ 07 апреля 2010

Вы можете рассмотреть возможность изменения зависимостей.Вместо того, чтобы Точки обращались к свойствам из ABC, пусть ABC задает свойства для точек, когда (или непосредственно перед этим) вызывается метод draw () для каждой из них.Нечто подобное шаблону Flyweight , используемому при рендеринге ячеек в JTables Swing (см. javadoc ).Вы также можете рассмотреть возможность отделения Point (модель данных) от PointDrawer (повторно используемый код рендеринга).Таким образом, ваши Баллы не будут зависеть от всех этих свойств, только ваши PointDrawers.

И да, это ОО-программирование, даже если вы явно передаете все параметры каждой точке во время рисования - таким образомнет никакой зависимости ни от ABC, ни от потенциального ABC "класса передачи параметров".

1 голос
/ 07 апреля 2010

Так как класс Point и ABC, похоже, должны быть посредниками между собой относительно того, что рисовать, почему бы не вызвать метод draw() для Point, передав фактический объект ABC в качестве аргумента,Объект ABC может предоставлять методы доступа (не открывать эти свойства!), А точечный класс (или реализации подкласса) может решать, что вызывать для ABC для.

1 голос
/ 07 апреля 2010

Идите с подходом # 2, но без объекта. Просто передайте параметры Draw напрямую.

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