试图模仿的JavaScript不好的做法,一个接口/抽象类
我写在Node.js的一些代码,跳出我作为使用策略模式为更好地组织。从我将创建其余均基于接口,并从那里移动的到来,在JavaScript中情况并非如此明确。
我明白了作为一个典型的语言JavaScript没有接口继承的概念,所以我不知道我所做的是一种气味或没有,因为我似乎无法找到的引用,除了它试图推断接口一个博客文章通过使用碱抽象类迫使继承类来实现的功能(如它抛出)。
我的基类
QueryStrategy = function () {
};
QueryStrategy.prototype.create = function(){
throw new Error("Not Implemented");
}
module.exports = QueryStrategy;
实施1
var util = require('util');
var QueryStrategy = require('./queryStrategy');
SelectQueryStrategy = function (query) {
this.parameters = query.parameters || [];
this.entity = query.entity || '';
};
util.inherits(SelectQueryStrategy, QueryStrategy);
SelectQueryStrategy.prototype.create = function () {
var self = this,
params = self.parameters,
paramList = self.parameters.length >= 1 ? '' : '*';
for (var i = 0; i < params.length; i++) {
var suffix = i === (params.length - 1) ? '' : ', ';
paramList = paramList + params[i].key + suffix;
}
return util.format("SELECT %s FROM %s", paramList, self.entity);
};
module.exports = SelectQueryStrategy;
目前,碱不具有任何共享功能或性质。共享功能会来,属性,因为原型链搜索我没有看到添加“共享”特性,其被创建的实例(请如果这是错的,让我知道)覆盖的点。
这是一个可以接受的方法,或者我应该在这种情况下忽略继承。可能有一些类型检查,它会更容易,如果你能推断出类型为一(即他们必须全部类型QueryStrategy的),但我不希望我的净影响在这里拿。
替代方法
首先,我并不想在这里卖书,我正在看周围的主题有很多的书籍,我有,但希望给予信贷,其应有的。
根据该对夫妇的意见,这是正确地说,类型推断会不会真的在这里做任何差异,可能应刚走下来鸭子类型检查,并可能试图插槽的东西没有在规定语言是不是最好的方法。我已阅读大约接口阿迪·奥斯马尼的Javascript的模式,虽然我的实现是不一样的,虽然接口的使用是可以接受的,可能是不需要的。
这样可能比较简单,以保持战略的做法,但有不同的实现,即在Javascript模式由斯托扬斯特凡,那就是你有一个实现和基于某种形式的,你知道使用哪种策略配置上列出一个。
伪样本
QueryBuilder = function () {
this.types = [];
}
QueryBuilder.prototype.create = function (type, query) {
var strategy = types[type];
strategy.create(query);
};
QueryBuilder.types.Select = {
create: function (query) {
params = query.parameters,
paramList = query.parameters.length >= 1 ? '' : '*';
for (var i = 0; i < params.length; i++) {
var suffix = i === (params.length - 1) ? '' : ', ';
paramList = paramList + params[i].key + suffix;
}
return util.format("SELECT %s FROM %s", paramList, query.entity);
}
};
这可能是去一个更清洁的方式,有一两件事我很注意把握是,如果我要补充类型的原型,但我想在这个简单的情况下,就没有必要了,但在更复杂的情况下,您可以有一个大量的战略和一个文件可能需要被抽象出来。
这是一个更容易接受的方法呢?
我最终什么了
我环顾四周,试图了解更多关于鸭子类型,优点和缺点等,并试图基于一些我收到的意见和答案,以简化我的设计。我坚持在每一个战略的战略十岁上下的方式定义相同的功能(S),基本上整个封装的实现什么变化,并给予他们一个更好的词需要一个共同的合同。
这改变了基类/接口,作为正确地指出,未进行任何建设性取出一两件事,每一个策略是独立的(所以不是100的模式的经典代表%),他们作为陈述只是定义了相同的创建功能。
从其中嵌套IFS和开关曾经属于已被替换它决定使用基于查询类型的请求的类型,其查询策略的单个开关的地方。这可以被重新计入工厂以后,但现在它服务宗旨:
Query.prototype.generate = function () {
var self = this,
strategy = undefined;
switch (this.queryType) {
case "SELECT":
strategy = new Select(self);
break;
case "INSERT":
strategy = new Insert(self);
break;
case "UPDATE":
strategy = new Update(self);
break;
case "DELETE":
strategy = new Delete(self);
break;
}
return strategy.create();
};
每一个战略是独立测试,我觉得这是更易于维护好像有什么东西出现故障,它会在一个地方失败,调查将根据单元测试更容易。显然,有一个权衡,更多的文件,和一个稍微更复杂的结构......我们将看看会发生什么。
回答如下:这是一个可以接受的方法,但它是不是真的要你以任何方式受益,而且可能使这段代码更难以维护。该战略的模式,实际上只在静态类型语言有益。你可以看看打字稿,作为另一个评论中提到。
在JavaScript中你要更多的依靠“鸭打字” ...如果它看起来像鸭子,闻起来像鸭子,那么它可能是一只鸭子。
http://en.wikipedia/wiki/Duck_typing