Добавление push в массив внутри класса, который загоняется


Я в основном делаю это:

class Person
  constructor : (@parent, @data)->
    @index = @parent.length

class People
  constructor : ->
    people = []

    for data in database.people
      people.push new Person(people, data)

В последнее время я пытаюсь следующее:

class Person
  constructor : (@data)->

  pushTo : (list)->
    this.index = list.length
    list.push this

class People
  constructor : ->
    people = []

    for data in database.people
      person = new Person(data)
      person.pushTo people

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



214
4
задан 12 сентября 2011 в 10:09 Источник Поделиться
Комментарии
3 ответа


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

Я думаю, вы должны задать себе вопрос "Зачем я это делаю?" Почему вы должны держать @индекс внутри человека?


  • Это просто идентификатор? Если это так, почему бы вам не использовать _.уникальный идентификатор ("человек") от подчеркивания в JS? Что бы намного чище.

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

  • Используете ли вы его для поиска человека по его индексу в списке позже? В принципе я могу представить себе два вида обработки данных.


    1. Вы перебирать список людей. В этом случае вы будете в порядке с библиотеки Underscore каждый способ:

      _.each people, (person, index) ->
      // your code here ^----- see that? ;)

    2. У тебя есть человек, данные из внешнего источника, и вы хотите повторно использовать связанные лица объекта. В этом случае вы должны использовать ID и поиск для вашего объекта с найдите или выберите методы.



Некоторые заметки:


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

    indexFor = (targetPerson) ->
    unless person.index // we search for index once and then store it for later use
    _.find people, (person, index) ->
    person.index = index if found = (person.id == targetPerson.id)
    found
    targetPerson.index

  2. уникальный идентификатор используется внутренний счетчик так, чтобы ID всегда растет. Он не может быть сброшен, которые могут быть не всегда удобно. Например, если вам нужно, чтобы сохранить свою коллекцию и загрузить его позже, вы не сможете рассказать генератора соответственно увеличить счетчик. В этом случае я бы все-таки пойти с Уникальный идентификатор для представления кода, но использовать какой-то другой идентификатор поколения схема настойчивость. Я бы с UUID-ы: но вы можете также попробовать метки хотя я не рекомендую его, так как вообще время так уж сложно получить права.

  3. Вы должны обязательно проверить другие методы подчеркивания библиотека. Когда вы сталкиваетесь с некой низкоуровневых задач, вы должны спросить, если подчеркнуть это для вас уже. Если это не проверить jQuery или любой библиотеки, которую вы используете для пользовательского интерфейса. Если вы все еще повезло спросить у Google или сайте StackOverflow. Я уверен, что ты отличный кодер, и вы можете решить многие из этих задач самостоятельно, но зачем тратить время и силы изобретать вещи, вместо того чтобы создавать что-то новое? Знаю, библиотеках и использовать их. Это как новый язык или новый текстовый редактор - сначала это больно, но это окупается в дальнейшем.

2
ответ дан 19 сентября 2011 в 08:09 Источник Поделиться

Что касается @Андрей ответ: Самое лучшее в CoffeeScript практики будет использовать это вместо ==. Т. е., человек.идентификатор targetPerson.ИД. В CoffeeScript будет заменить === на месте либо кушать.

Что касается вопроса @Pickels': постижение список является отличным инструментом здесь. Рассматривайте это:

people = (new Person(people, data) for data in database.people)

Это компилирует:

var data, people;

people = (function() {
var _i, _len, _ref, _results;
_ref = database.people;
_results = [];
for (_i = 0, _len = _ref.length; _i < _len; _i++) {
data = _ref[_i];
_results.push(new Person(people, data));
}
return _results;
})();

который, я полагаю, что вы хотите.

Отличная новая ссылка на CoffeeScript стиль руководства.

1
ответ дан 20 декабря 2011 в 06:12 Источник Поделиться

Вот шаблон, который я использую все время; для моделей/коллекций, как в вашем примере, или даже для управления видом и произвольные объекты. Это также, как модели Spine.JS работы.

Можно объявить статические методы и свойства класса с помощью метода@. Так называть человека.Метод fetch() здесь будет инстанцировать новый человек экземпляры с соответствующим идентификатором (массив#push возвращает новую длину) и добавлять их в массив коллекции, собственной статической переменной.

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

class Person
collection = []

@Fetch: -> new Person data for data in database
@Get: (id) -> if id? then collection[id] else collection

constructor: (@data) -> @id = collection.push this

database = ["Barry", "Other Barry", "Sterling"]
Person.Fetch()
alert Person.Get(1).data # alerts "Other Barry"

0
ответ дан 17 февраля 2013 в 11:02 Источник Поделиться