【发布时间】:2015-08-27 18:51:21
【问题描述】:
我非常了解 JavaScript 中 OOP 和原型继承的概念,但有时我想知道如何在现实世界的应用程序中使用这些概念。
我将以几个月前在 GitHub 上推送的一个简单(主义)contact management web application 为例。
在主处理程序中主要驻留函数:
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);
});
};
它做的不多:从数据库中获取数据并返回它们,或者从用户那里获取数据并将它们保存到数据库中。
如果它更复杂一点,我肯定会将一些逻辑放在单独的函数中以重用它们并分解复杂性。
尽管如此,这段代码看起来相当程序化,具有独立功能的假设更复杂的版本也是如此。它将如何以 OOP 方式组织,我将如何从中受益?
例如,我会从 User 构造函数中受益吗?
【问题讨论】:
-
我认为您的代码非常适合拆分为对象。原因是您的函数的名称会与候选对象相呼应,即 addContact、getContacts、updateContact...它们都使用名词
contact。因此,使用函数构造函数创建一个名为contact 的单独模块,并在代码顶部使用var contact = new Contact();然后将功能外推到这个新模块中并与contact.update() 等接口 -
我当然可以,但是因为我有一个处理特定事情的处理程序(比如联系人处理程序、邮件处理程序……),我不确定我是否会从
var contact = new Contact();然后@ 987654326@ 或者我会? -
在您的主处理程序文件中,您可以创建一个数组,然后向其推送一个新联系人
var contacts = [];,然后当您调用addContact()时,您将执行contacts.push(new Contact('stuff'));。重点是该对象将处理您在主文件中拥有的所有内容,这是封装的主要目标。 -
我明白了,我试试看!
-
@user1717735:你应该创建一个
Contact.fromRequest方法,然后将其余的作为方法放在那里。
标签: javascript node.js oop procedural-programming