Как правильно управлять связанными объектами в JavaScript? - PullRequest
7 голосов
/ 17 февраля 2010

Я новичок в объектно-ориентированном программировании и постепенно учусь применять его в javascript. Поэтому, пожалуйста, потерпите меня. :)

У меня есть два основных объекта:

  1. «запись», которая содержит методы для редактирования одной записи из набора записей. (создать, сохранить, загрузить и т. д.)

  2. "recordList", который содержит методы для вывода разбитого на страницы списка названий записей.

Я бы хотел, чтобы эти объекты могли работать вместе. Например, если вызывается record.save (), также вызывается recordList.refresh (), так что нумерованный список отражает обновленные данные.

Для этого я создал третий объект «control», который содержит экземпляры «record» и «recordList». Я использую «контроль» следующим образом:

control = {}

    control.record = object.create("record");
    control.recordList = object.create("recordList");

    control.save = function() {

        this.record.save();
        this.recordList.refresh();

    };

Это работает. Но мне интересно, это правильно? (Я хочу быть уверен, что при этом не нарушаю ни одно из правил проектирования ОО.) Есть ли лучший способ?

Заранее спасибо за помощь.

Ответы [ 4 ]

1 голос
/ 17 февраля 2010

Говоря с точки зрения ООП, я не думаю, что запись спасет сама себя. Запись в базе данных - это просто данные, а сама база данных - это то, что происходит с этими данными, будь то сохранение, загрузка или т. Д. При этом я бы сказал, что запись будет просто объектом, который содержит данные и создаст объект набора записей для взаимодействия с данными. Внутри этого объекта набора записей вы можете поместить свой recordList и соответственно обновить его. Что-то вроде:

var recordset = function() {
    var me = this;
    var currentRecord = object.create("record");
    var recordList = object.create("recordList");
    me.save = function() {
            //Insert record.save code here
            recordList.refresh();
    };
};

Что-то заметить об этом коде. В этой настройке нельзя получить доступ к currentRecord и recordList извне функции, и поэтому у вас есть инкапсуляция, одна из отличительных черт ООП. Это связано с тем, что функция набора записей является закрытием, которое «закрывает» все переменные внутри, что означает, что каждая функция внутри имеет доступ к переменным в области набора записей.

Вы можете позволить внешнему миру получить доступ через функции get или set:

    me.getRecordList = function() {
        return recordList.getArray(); //Not generally a good idea to simply return your internal object
    };
1 голос
/ 17 февраля 2010

Ваше решение в порядке.Два небольших предложения по улучшению

  1. Используйте более конкретное имя, чем элемент управления (даже 'recordControl' в порядке).Вы можете получить множество элементов управления для различных наборов функций.

  2. Используйте литерал объекта для создания всего объекта.Делает ваш код более аккуратным и более читаемым (и сохраняет несколько байтов)

(извините за отсутствие пробелов - редактор не делает то, что я хочу!)

    recordControl = {
        record : object.create("record"),
        recordList : object.create("recordList"),
        save : function() {
            this.record.save();
            this.recordList.refresh();
        }
    }
0 голосов
/ 17 февраля 2010

почему вы не предоставляете свой recordList в записи?

var record = object.create("record");
record.recordList = object.create('recordList');
record.save = function(){
    /*
        do something 
    */
    this.recordList.refresh();
}
0 голосов
/ 17 февраля 2010

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

Тем не менее, ваше решение будет работать нормально, и нормально создать контейнерный класс для нескольких объектов различных типов, которые связаны между собой. Если вам нужен другой способ обработки, проверьте Пул клиентских событий . Единственное, что я могу сказать о том, что вы сделали, - это убедиться, что вы используете object.create так, как было задумано.

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

Удачи.

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