Я хорошо понимаю концепции ООП и прототипного наследования в JavaScript, но иногда мне интересно, как их использовать в реальных приложениях.
Я возьму в качестве примера простое (истинное) веб-приложение для управления контактами, которое я разместил на GitHub пару месяцев назад.
В основном обработчике находятся функции:
var UserModel = require('../models/userModel.js');
var checkObjectId = new RegExp('^[0-9a-fA-F]{24}$');
var root;
exports.getContacts = function(request, response) {
var id = JSON.parse(request.params.user)[0];
// validate
if (!checkObjectId.test(id)) {
return res.status(400).json({error: 'Not a user id'});
}
UserModel.findById(id, function(err, user) {
if (err) {
return console.log(err);
}
response.send(user.contacts);
});
};
exports.addContact = function(request, response) {
var id = JSON.parse(request.params.user)[0];
// validate
if (!checkObjectId.test(id)) {
return res.status(400).json({error: 'Not a user id'});
}
UserModel.findById(id, function(err, user) {
if (err) {
return console.error(err);
}
var contact = {};
// avoid to save empty info
if (request.body.first.length > 1) {contact.first = request.body.first;}
if (request.body.last.length > 1) {contact.last = request.body.last;}
if (request.body.mobile.length > 1) {contact.mobile = request.body.mobile;}
if (request.body.home.length > 1) {contact.home = request.body.home;}
if (request.body.office.length > 1) {contact.office = request.body.office;}
if (request.body.email.length > 1) {contact.email = request.body.email;}
if (request.body.company.length > 1) {contact.company = request.body.company;}
if (request.body.description.length > 1) {contact.description = request.body.description;}
if (request.body.keywords.length > 1) {contact.keywords = request.body.keywords;}
user.contacts.push(contact);
user.save(function(err) {
if (err) {
return console.error(err);
}
console.log('contact saved');
response.send(user.contacts);
});
});
};
exports.updateContact = function(request, response) {
var id = JSON.parse(request.params.user)[0];
// validate
if (!checkObjectId.test(id)) {
return res.status(400).json({error: 'Not a user id'});
}
var contact = {
_id: request.body._id,
first: request.body.first,
last: request.body.last,
mobile: request.body.mobile,
home: request.body.home,
office: request.body.office,
email: request.body.email,
company: request.body.company,
description: request.body.description,
keywords: request.body.keywords
};
UserModel.update({_id: id, "contacts._id": request.body._id}, {$set: {"contacts.$": contact}}, function(err, user) {
if (err) {
return console.error(err);
}
response.sendStatus(user);
});
};
exports.deleteContact = function(request, response) {
var id = JSON.parse(request.params.user)[0];
// validate
if (!checkObjectId.test(id)) {
return res.status(400).json({error: 'Not a user id'});
}
return UserModel.update({_id: id}, {$pull: {contacts: {_id: request.params.id}}}, function(err, user) {
if (err) {
return console.error(err);
}
console.log('contact removed');
console.log(user);
response.sendStatus(user);
});
};
Он мало что делает: извлекает данные из БД и возвращает их или берет данные у пользователя и сохраняет их в БД.
Если бы это было немного сложнее, я бы обязательно поместил некоторую логику в отдельные функции, чтобы повторно использовать их и снизить сложность.
Тем не менее, этот код выглядит скорее процедурным, как и гипотетическая более сложная версия с отдельными функциями. Как бы это было организовано по принципу ООП и что я от этого выиграю?
Например, могу ли я получить пользу от конструктора User?
contact
. Поэтому создайте отдельный модуль под названием contact с конструктором функции и в верхней части кода используйтеvar contact = new Contact();
. Тогда проще экстраполировать функциональность в этот новый модуль и взаимодействовать с contact.update () и т. Д. - person Data   schedule 27.08.2015var contact = new Contact();
, а затемexports.getContacts = contact.getContact();
, или я бы стал? - person Buzut   schedule 27.08.2015var contacts = [];
, а затем, когда вы вызоветеaddContact()
, вы сделаетеcontacts.push(new Contact('stuff'));
. Все дело в том, что объект будет обрабатывать все, что есть в вашем основном файле, что является основной целью инкапсуляции. - person Data   schedule 27.08.2015Contact.fromRequest
, а затем поместить туда остальные как методы. - person Bergi   schedule 27.08.2015