如何创建界面?

时间:2014-04-30 17:41:24

标签: javascript php oop

我想在Javascript中创建一个界面,有没有人知道如何做到这一点?

在PHP中,我可以为多个数据库创建一个接口:

interface Database{
    function connect($dsn,$user,$pass,$option);
    function prepare($query);
    function find($table,$column,$condition);
    function save($table,$column,$condition);
}

class MySQL implements Database{
    function connect($dsn,$user,$pass,$option){ ... }
    function prepare($query){ ... }
    function find($table,$column,$condition){ ... }
    function save($table,$column,$condition){ ... }
}

class Oracle implements Database{
    function connect($dsn,$user,$pass,$option){ ... }
    function prepare($query){ ... }
    function find($table,$column,$condition){ ... }
    function save($table,$column,$condition){ ... }
}

稍后,当我需要查询表时,我只需执行:

$db = new MySQL;
$db->find('table','column','condition');

3 个答案:

答案 0 :(得分:1)

您可以简单地使用这组函数创建一个对象,然后可以将另一个对象替换为另一个数据库的相应函数。

dbInterface={
    search:function(searchstring){
        this.oracleDB.somethingDo(searchstring)
    }
    ,oracleDB=new Oracle("foobar")
}
//dbInterface is now an object with the method "search".

在这种情况下,this引用该函数所附加的对象

一种常见的方法是使用也用作闭包的构造函数来构建这些对象,从而提供方便的局部范围:

function MySQLinteface(initialization, parameters){
    var dbConnection=connect(parameters)
    this.search=function(searchstring){
        dbConnection.doSomething(searchstring)
    }
}
dbInterface=new MySQLinteface("foo", "bar")
//dbInterface is now an object with the method "search".

在这种情况下,this是构造函数的返回对象,因为它是使用new关键字调用的。

在这两种情况下,关键部分是你得到一个公开方法search的对象。你不必正式定义一个界面,你只需要考虑你希望你的界面如何,然后你可以以任何你喜欢的方式重新实现它,让所有这些实现都是插件替换彼此。

答案 1 :(得分:1)

我已经创建了一个可以确定为接口的函数:

var MySQL = function(){
    DatabaseInterface(this);
};
MySQL.prototype.connect = function(dsn,user,pass,option){
    //
};
MySQL.prototype.prepare = function(query){
    //
};
MySQL.prototype.find = function(table,column,condition){
    //
};
MySQL.prototype.save = function(table,column,condition){
    //
};
new MySQL;

function DatabaseInterface(con){
    if(!'connect' in con || !getParamNames(con.connect) == "dsn,user,pass,option") 
        throw new Error("This method is not correctly overwritten1!");
    if(!'prepare' in con || !getParamNames(con.prepare) == "query")
        throw new Error("This method is not correctly overwritten2!");    
    if(!'find' in con || !getParamNames(con.find) == "table,column,condition")
        throw new Error("This method is not correctly overwritten3!");
    if(!'save' in con || !getParamNames(con.save) == "table,column,condition")
        throw new Error("This method is not correctly overwritten4!");
}
var STRIP_COMMENTS = /((\/\/.*$)|(\/\*[\s\S]*?\*\/))/mg;
function getParamNames(func) {
    var fnStr = func.toString().replace(STRIP_COMMENTS, '')
    var result = fnStr.slice(fnStr.indexOf('(')+1, fnStr.indexOf(')')).match(/([^\s,]+)/g)
    if(result === null)
        result = []
        return result
}

在你是mysql类的构造函数中,你说要调用DatabaseInterface函数。该函数检查它是否是正确的数据库连接器。如果不是,他会抛出错误。这很奇怪,但它按预期工作。

但请看看电子商务的答案以及所有其他评论。在javascript中没有接口,在大多数情况下你不需要它。

EXAMPLE

答案 2 :(得分:0)

JavaScript不是静态类型的,因此无法声明任何接口。您只需创建履行合同的对象(如果需要,您可以动态测试对象是否提供此类方法)。这称为duck typing - 如果对象具有connectpreparefindsave方法,我们认为它是数据库接口。有各种辅助函数库可以简化这些测试的声明/创建。