Должны ли объекты рисовать сами?Как?(Я использую Android, однако вопрос относится ко всем языкам ОО) - PullRequest
5 голосов
/ 17 июня 2011

это мой первый вопрос здесь. Я надеюсь, что кто-то может помочь.
Это связано с хорошей практикой объектно-ориентированного проектирования.
Я пишу приложение для Android, но этот вопрос носит общий характер и в равной степени относится (например, к пользовательскому интерфейсу Swing).
Ради аргумента скажем, у меня есть ученик класса.

public class Student {
    public int StudentID;
    public String firstName;
    public String lastName;
}

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

public class Student {
    public int StudentID;
    public String firstName;
    public String lastName;

    // Constructors
    public Student () {}

    public Student (int StudentID){
        populateFromDataBase (StudentID);
    }

    private void populateFromDataBase (int StudentID){
        // Get the data from the database and set the 
        // values of all the properties of this
    }

    public void save (){
        // Save the values of the properties to db
    }

}

Это сделано для того, чтобы другие классы могли использовать этот класс, не заботясь о том, как он сохраняет свою информацию.
Отказ от ответственности: я знаю, что я не использую аксессоры, просто публичные свойства. Я просто пытаюсь сделать этот пример простым.
Не спрашивайте, как внешний класс узнает StudentID. Это не имеет отношения к вопросу, который я хочу задать, а именно:

(Скажи) Я хочу нарисовать таблицу студентов и их детали на экране. Из класса пользовательского интерфейса (скажем, ListActivity в Android) я мог бы получить массив студентов, а затем просмотреть их, настраивая свойства моего ListView по мере продвижения. Проблема, с которой я столкнулся, заключается в том, что я, кажется, думаю слишком процедурно, а не в истинном духе объектно-ориентированного дизайна. Это также требует, чтобы каждый ученик спрашивал о себе, нарушая инкапсуляцию.
Видимо (из того, что я прочитал) студент должен рисовать сам.
Вот где я запутался. Как студент может нарисовать себя, когда он ничего не знает о пользовательском интерфейсе? Я передаю ссылку на пользовательский интерфейс на объект студента? Это нарушает разделение презентационного и бизнес-уровней или нет? Что считается хорошей практикой? Есть ли какие-нибудь статьи или шаблоны дизайна, желательно с примером кода, потому что я не смог их найти? Я беспокоюсь о чем-то не столь важном, и я должен просто пойти с моей первой грязной идеей?
Я действительно был бы признателен за любой ввод, поскольку очевидно, что эта проблема повторяется со всем, что я кодирую.

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

1 Ответ

3 голосов
/ 20 июня 2011

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

Для рисования я обычно реализую некоторую форму двойной отправки, такую ​​как Шаблон посетителя .

Для отделения от пользовательского интерфейса следует также рассмотреть Модель-Представление-Контроллер , Модель-Представление-Представитель или Модель-View-ViewModel .

Постоянство объектов может быть довольно сложным и может включать в себя различные шаблоны, как описано в Шаблонах архитектуры корпоративных приложений * 1016 Мартина Фаулера и обобщено на веб-сайте Фаулера. каталог .

И, конечно, пользовательский интерфейс не должен обходить модель и переходить прямо к базе данных.

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