在JavaScript / Node.js中思考OOP

我很好的理解了JavaScript中OOP和原型inheritance的概念,但是有时候我想知道如何在真实应用程序中使用这些概念。

我将以几个月前在GitHub上推出的一个简单的(istic) 联系人pipe理Web应用程序为例。

主要处理程序主要驻留function:

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); }); }; 

它没有太多的function:从数据库中获取数据并返回它们或者从用户处获取数据并保存到数据库中。

如果它更复杂一点,我肯定会把一些逻辑放在不同的函数中来重复使用它们,并打破复杂性。

尽pipe如此,这个代码看起来相当程序化,所以具有不同function的假设的更复杂的版本也是如此。 它将如何以面向对象的方式进行组织,我将如何从中获益?

例如,我会从用户构造函数中受益吗?

我认为你可以做的第一件事是将你的构造函数的实例嵌套在一个初始化函数中,这样你就不必重复你的validation代码。

 var connection = (function() { var UserModel = require('../models/userModel.js'); var notAUser = {error: 'Not a user id'}; function init(request, response) { var status = validate(JSON.parse(request.params.user)[0]); if (!status.id) return response.status(400).json(status); return new Connect(request, response, status.id); } function Connect(request, response, id) { this.request = request; this.response = response; this.id = id; this.info = { _id: id, "contacts._id": request.body._id }; } function validate(id) { if (!/^[0-9a-fA-F]{24}$/.test(id)) return notAUser; else return {id: id}; } Connect.prototype.getContact = function() {} //etc... return init; })(); module.exports = connection; 

然后在你的实际应用中

 var connection = require("./connection.js"); someAsync(data, function(req, res) { var query = connection(req, res); //returned instance of constructor query.getContact(someData, callback); }); 

我将首先封装requestresponse因为每个方法都需要这些。 喜欢:

 var contact = function (request, response) { return { add: add } function add() { // add() gets access request and response for free } }; 

或者,如果您热衷于新运营商:

 function Contact(request, response) { this.request = request; this.response = response; } Contact.prototype.add = function () { this.request; } 

然后将重复的代码和callback移动到可以在对象内部重用的私有方法。

Interesting Posts