1

我正在开发一个 node.js 应用程序。寻找创建数据模型的方法。

发送到客户端/从客户端发送的数据是 JSON。由于数据库是 MongoDb,因此进出数据库的数据是 JSON。

我是 JS 新手,我可以找到很多专门用于创建封装对象的 js 库。还需要吗?

仅将模型定义为简单的 js 对象并在必要时使用基于原型的继承可能会产生什么后果?

任何帮助表示赞赏。谢谢。

4

2 回答 2

0

仅将模型定义为简单的 js 对象并在必要时使用基于原型的继承可能会产生什么后果?

IMO,随着应用程序大小的增加或团队规模的增加,随着许多开发人员开始使用相同的代码,您将失去可维护性。

换句话说 - 如果没有适当的封装,很容易修改不属于自己的对象 - 很容易干预您不想被触摸的部分。

如果您正在编写某种库/框架,其中只有 API 向用户公开并且您没有适当的封装,则可能仅通过一次修改就可以降低所有内容。

例如:

var myObj = {
    mySecretPrivateCrucialFunction: function () {
        // all the awesome crucial logic
    },
    //This is what you want other parts of the code ...
    // ... to be interacting with in this object
    myPublicMethod: function () { 
            // some logic
        mySecretPrivateCrucialFunction(); 
            // some thing else
    }
}

我可以做这个。

myObj.mySecretPrivateCrucialFunction = function () {
    alert('yay..i got you..');
};

但如果你这样做 - 你不会给那个机会。

var myObj = (function () {
        var mySecretPrivateCrucialFunction = function () {
                // all the awesome crucial logic
            }
        //This is what you want other parts of the code ...
        // ... to be interacting with in this object
        return {
            myPublicMethod: function () {} /*some logic */
            mySecretPrivateCrucialFunction(); /*some thing else */
        }
    })();

如果您想让所有属性隐藏/私有并且仍然想要获取对象的 JSON 表示 - 您可以执行以下操作 -

var myObj = (function () {
    // your private properties
    var prop1 = 1;
    var prop2 = 2;
    // your getters
    var getProp1 = function () {
            return prop1;
        };
    var getProp2 = function () {
            return Prop2;
        };
    // your setters
    var setProp1 = function (newValue) {
            prop1 = newValue;
        };
    var setProp2 = function (newValue) {
            prop2 = newValue;
        };
    // your JSON representation of the object
    var toString = function () {
            return JSON.stringify({
                prop1: prop1,
                prop2: prop2
            });
        };
    // Object that gets exposed -
    return {
        "getProp1": getProp1,
        "getProp2": getProp2,
        "setProp1": setProp1,
        "setProp2": setProp2,
        "toString": toString
    }
})();
于 2012-12-25T17:05:13.600 回答
0

在我看来,有两种方法可以解决这个问题:

我假设您的数据正在作为 JSON字符串传输。
"[{\"key\":\"val\"}]"出现在您的响应中,然后您将它们通过JSON.parse以将它们变成可行的数组和对象。

所以第一种方法是制作“类实例”(不需要new或继承,只是一个封装数据并根据数据类型公开接口的构造函数)。

function makeTweet (data) {
    var tweet = {
            from_user : data.from_user || "anonymous",
            /* ... */
        },

        toString = function () {},

        public_interface : {
            toString : toString,
            /* getters, etc */
        };
    return public_interface;
}

我知道你已经知道这些东西,但是考虑一下在同一个进程中有两个或三个不同数据类型的情况(比如在行尾,当你准备打印到客户端时),并且您有一个过程正在读取和写入每个对象上的公共字段。如果不同的对象具有不同的属性,那么事情的结局就会很糟糕,或者会以一堆废话而告终if

另一种看待它的方式可能是实体/服务系统

function handleTweets (tweetArr) {
    var templateFormat = system.output_format,
        string = "";

    if (templateFormat === "HTML") {
        string = HTMLtemplateTweets(tweetArr);
    } else { /* ... */ }
}

function HTMLtemplateTweets (tweetArr) {}
function JSONtemplateTweets (tweetArr) {}
function XMLtemplateTweets  (tweetArr) {}
...

重点是将 JSON 字符串转换为纯数据对象数组,并将它们提供给特定类型的库/系统函数行。

这更像是一种非常简化的实体/系统方法,而不是一种 OO(作为经典接受的)方法。

现在,您的数据安全来自于确保您的对象只走一条预期的路径,因此对于该类型的每个对象,转换都是可预测的。

如果您希望在 JS 中出于性能/内存目的“继承”,那么这也可能是一个值得关注的方向。

于 2012-12-25T18:32:22.410 回答