Это хорошая объектная модель JavaScript? (проект телефонной книги) - PullRequest
1 голос
/ 29 апреля 2009

Мне нужно создать телефонную книгу. Благодаря форме я могу получить данные человека. Мне нужно использовать объекты для этой цели. Я создал объект phoneBook () с помощью метода, позволяющего добавить человека в телефонную книгу.
Я решил (хотя его не просили) разделить концепцию «персона» на 2, что приводит к объекту «Персона» и объекту «AddressPerson» (один и тот же человек может иметь два дома: «Мой портной богат! ": -))

Это хороший способ объявить объект Person?
Можем ли мы создать объект Person без адреса и добавить его позже, как я сделал с объектом "Person2"?

Если бы кто-то мог мне помочь, я был бы очень благодарен. Заранее большое спасибо! "

function phoneBook(){
  this.Liste = new Array(); 
}

phoneBook.prototype.Add = function(){
   Liste.push(new Person(aLastName,aFirstName,aAddress));
}

function Person(aLastName,aFirstName,aAdd){
  this.LastName   = aLastName;
  this.FirstName  = aFirstName;
  this.Address = 
    new AddressPerson(aAdd.Street,aAdd.CP,aAdd.Town,aAdd.NumTel,aAdd.Email);
}

function Person2(aLastName,aFirstName){
  this.LastName   = aLastName;
  this.FirstName  = aFirstName;
  this.Address = 'unknow';
}

function AddressPerson(aStreet,aCP,aTown,aNumTel,aEmail){
  this.Street = aStreet;
  this.CP    = aCP;
  this.Town = aTown;
  this.NumTel = aNumTel;
  this.Email= aEmail;
}

Ответы [ 7 ]

4 голосов
/ 29 апреля 2009

Некоторые предложения:

  • Измените ваш класс (PhoneBook) на прописные, а ваши методы / свойства (lastName, add()) на строчные
  • Префикс «a» в параметрах метода не требуется, поскольку в Javascript this никогда не используется неявно.
  • Методы должны принимать объекты в качестве параметров. Например, add() должно быть add(person), где person - это предварительно построенный Person объект.
  • Зачем вам нужно Person2? Это кажется излишним.
  • В конструкторе для Person вы копируете каждое поле Address. Как правило, просто сделать this.address = address будет в порядке. Но если вы хотите, чтобы у каждого Person был свой экземпляр Address, укажите clone() метод для Address.
1 голос
/ 29 апреля 2009

Взгляните на JSLint . Эта работа вроде 'W3C' Markup Validator .

.

JSLint создан Дугласом Крокфордом - Yahoo! Евангелист JavaScript и чувак, который изобрел JSON .

Что такое JSLint:

"JSLint - это программа на JavaScript, которая ищет проблемы в JavaScript программы.

Когда С был молодым программистом язык, было несколько общих ошибки программирования, которые не были пойман примитивными компиляторами, так вспомогательная программа под названием Lint была разработан, который будет сканировать источник файл, ищем проблемы.

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

JavaScript молод для своего возраста язык. Первоначально предполагалось делать небольшие задачи на веб-страницах, задачи для которого Java была слишком тяжелой и неуклюжий. Но JavaScript очень способный язык, и это сейчас используется в более крупных проектах. Многие из функции, которые должны были сделать язык прост в использовании хлопотно для крупных проектов. требуется lint для JavaScript: JSLint, средство проверки синтаксиса JavaScript и валидатор.

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

JSLint определяет профессиональное подмножество JavaScript, более строгий язык чем это определено изданием 3 Спецификация языка ECMAScript. подмножество связано с рекомендациями найдены в Кодексе конвенций для Язык программирования JavaScript.

JavaScript - неаккуратный язык, но внутри него элегантный, лучше язык. JSLint помогает вам программировать на этом лучшем языке и избежать большая часть помои. "

0 голосов
/ 30 апреля 2009

Комментируя свой комментарий, до того как я зарегистрировался:

@ харто - я не думаю, что изменение Персона и Адрес конструкторов принять объект является улучшением. Это просто делает строительство тех объекты излишне сложные ИМО. Кроме того, я думаю, что ваша функция добавления будет пропустить 0-й элемент аргументов массив

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

Что касается функции add, она не пропустит 0-й элемент, потому что он пост-декрементирован, что означает, что выражение возвращает значение перед декрементом. Это самый быстрый цикл, который вы можете разработать в javascript.

0 голосов
/ 29 апреля 2009

Рекомендации по модели данных:

  • Переименуйте AddressPerson в Address. Вы можете гипотетически передавать Address объекты вокруг, которые не соответствуют Person.

  • Рассмотрите возможность перемещения поля email в Person - как вы упомянули, у вас может быть несколько человек на одном адресе (они не обязательно могут совместно использовать адреса электронной почты).

  • Передайте полностью инициализированный Address в конструктор Person.

  • Удалите функцию Person2 и сделайте address необязательным атрибутом Person. Например. назначение становится this.address = (address === undefined) ? "unknown" : address;

С точки зрения стиля / соглашения, ответ Левика хороший - я поддерживаю эти предложения.

0 голосов
/ 29 апреля 2009

Вот мое предложение:

function PhoneBook( person /*, ... */ ){
    this._liste = [];
}

PhoneBook.prototype.add = function(){
    var l = arguments.length;
    while(l--){
        this._liste.unshift( arguments[l] );
    }
}

function Person( p ){
    this.lastName   = p.lastName;
    this.firstName  = p.firstName;
    this.address    = p.address === 'unknown' ? new Address( p.address ) : 'unknown';
}

function Address( a ){
    this.street = a.street;
    this.CP     = a.CP;
    this.town   = a.town;
    this.numTel = a.numTel;
    this.email  = a.email;
}
0 голосов
/ 29 апреля 2009

Большое спасибо
Я изменил свой код так:

function PhoneBook(){<br>
    this.liste = [];<br>
}

PhoneBook.prototype.add = function(person){<br>
   this.liste.push(person);<br>
}

function Person(lastName,firstName,address){<br>
    this.lastName   = lastName;<br>
    this.firstName  = firstName;<br>
    this.address = address;<br>
}

function AddressPerson(street,cp,town,numTel,email){<br>
    this.street = street;<br<
    this.cp     = cp;<br>
    this.town   = town;<br>
    this.numTel = numTel;<br>
    this.email  = email;<br>
}

// tests for the others :-))

var phone = new PhoneBook();
alert(phone.liste.length);
var person = new Person(
    "aaaaaa",
    "bbbbbbb",
    new AddressPerson("zzzzz","87","rrrrr","22222","eeeee@uk.co")
);
alert(person.address.street);
phone.add(person);
alert(phone.liste.length);
alert(phone.liste[0].address.numTel);

Но я не знаю, как это сделать, что Левик сказал в своем ответе:

Но если вы хотите, чтобы у каждого пользователя был свой экземпляр Address, предоставьте метод clone () для Address

0 голосов
/ 29 апреля 2009

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

Вы можете изменить эту строку

  this.Liste = new Array(); 

до

  this.Liste = []; // shorthand for creating an array. You can do the same with an object with {}

Я обычно использую объекты JSON для такого рода вещей. JavaScript Дугласа Крокфорда - очень полезный ресурс.

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