Редактировать: Удалены идеи более высокого уровня, включающие в себя специфический для проблемы и менее переносимый код.Javascript: унаследованные инкапсулированные переменные
Я реализовал свой DAL, используя DAO. Мое приложение подключается к различным базам данных (в основном по наследственным причинам). Чтобы облегчить эффективное и разумное использование соединений, я использую Singleton ConnectionBroker
для управления различными подключениями, которые могут (или не могут быть) открыты. Затем этот ConnectionBroker
вводится в DAO, где они могут запрашивать управление определенным объектом соединения, запрашивать новые соединения и т. Д.
С Наследование POV, я хотел бы что-то вроде:
AbstractDbConnection
|-- MongoDbConnection
|-- MsSqlConnection
|-- CouchDbConnection
|-- ...
Где AbstractDbConnection
определяет интерфейс, и реализует некоторую общую логику на основе событий.
var EventEmitter = require('events').EventEmitter;
module.exports = function AbstractDbConnection(host, port, database, login, ...) {
// private
var state = StatesEnum.Closed; // StatesEnum = {Open: 0, Closed: 1, ..}; Object.freeze(StatesEnum);
// api that must be overwritten
this.connect = function connect() {throw new ...}
this.disconnect = function disconnect() {throw new ...}
... <more>
this.getState = function() { return state; }
}
AbstractDbConnection.prototype.__proto__ = EventEmitter.prototype;
А потом я реализовать интерфейс, используя драйвер-зависимый код:
var mssqldriver = require('mssqldriver'), //fictitious driver
AbstractDbConnection = require(__dirname + '/blah/AbstractDbConnection');
module.exports = function MsSqlConnection(host, port, database, login, ...) {
var me = this;
// implement using driver
this.connect = function connect() {...}
this.disconnect = function disconnect() {...}
... <more>
driverSpecificConnection.on('driverSpecificOpenEvent', function() {
me.emit('open'); // relay driver-specific events into common events
state = StatesEnum.Open; // how ??
}
...
}
MsSqlConnection.prototype.__proto__ = new AbstractDbConnection();
Но ясно, что я хочу, чтобы защитить state
свойство от изменения неосторожно.
Вы должны продемонстрировать знание решаемой задачи, и предоставить свои попытки. И кажется, вы хотите, чтобы люди делали домашнее задание. – dezman
@watson Я думаю, что природа вопроса подразумевает, что я понимаю трудность применения этой проблемы к прототипному языку. – Colin
@watson Я не вижу, как это можно читать как «домашнее задание». Это законный проблемный домен, который нелегко решить из-за характера прототипического наследования. – Colin