一种将(添加隐私)封装到 MVC 中的模型的方法?

Posted

技术标签:

【中文标题】一种将(添加隐私)封装到 MVC 中的模型的方法?【英文标题】:A way to encapsulte ( add privacy ) to models in the MVC? 【发布时间】:2012-08-02 00:27:10 【问题描述】:

我命名我的模型和一个这样的控制器:

var MC = ;

然后根据需要添加属性。

例如,初始化我所有模型的代码如下所示:

MC.initAll = function() 

    MC.MASettings.init();
    MC.MATweet.init();

    MC.MUserTry.init();
    MC.MUserNew.init();
    MC.MUserExist.init();

    Su.UserOut.init();
    Su.Media.init();

我打算把它改成一个循环...只要循环通过 MC,如果 init() 存在就执行它。

这种架构唯一让我困扰的是,没有传统意义上的隐私或封装,即一切都是公开的。

另外,我不实例化我的模型,我只是将它们称为函数,但这与 .js 中的实例化几乎相同。

有没有一种简单的方法可以为我的模型添加隐私,并且仍然可以将它们作为对象中的属性进行访问。

这里只是一个例子,是我最简单的模型:

MC.MUserTry = 
    init: function() 
        document.getElementById( 'ut_but' ).addEventListener( "click", function( ) 
            MC.Controller( MC.o_p( 'MUserTry' ) );
        , false );
    ,
    pre : function( o_p ) 
        o_p.page.email = document.getElementById( 'ut_but' ).getAttribute( 'data-email' );
        return o_p; 
    ,
    post : function( o_p ) 
        sLocal( o_p.server.hash, o_p.server.privacy, o_p.server.name, o_p.server.picture, 'ma' );
        vStateUpdate( o_p.server.name, o_p.server.picture, o_p.server.privacy );
        vTPane( o_p.server.tweets ); vBPane( o_p.server.bookmarks ); 
        vFlipP( 'ma' ); 
    
;

pre() 在 ajax 调用之前运行,post() 之后运行,init() 通过 onload 事件或类似事件调用。

这里是实际实现这个的控制器。

MC.Controller = function( o_p ) 

   console.log( 'o_p = ' + o_p.model );

   var t1, t2, t3, t4, 
       i1, i2, i3, i4,
       o_p_string_send;

    if( SU.get('debug') ) 
        t1 = new Date().getTime();
    

    o_p = MC[ o_p.model ].pre( o_p );  

    if ( o_p.result !== 'complete' ) 
        o_p_string_send = JSON.stringify( o_p );

        if( SU.get('debug') ) 
            t2 = new Date().getTime();
            console.log( '---------------Server Send: \n ' + o_p_string_send );
         

        cMachine( 'pipe=' + o_p_string_send , function( o_p_string_receive ) 

            if( SU.get('debug') )  
                console.log( '---------------Server Receive: \n ' + o_p_string_receive ); 
                t3 = new Date().getTime();
            

            o_p.server = JSON.parse( o_p_string_receive );

            MC[ o_p.model ].post( o_p );

            if( SU.get('debug') ) 
                t4 = new Date().getTime(); i1 = t2-t1 ; i2 = t3-t2 ; i3 = t4-t3; i4 = o_p.server.time;
                console.log( '---------------Time: \n Pre | Transit | Post | Server = ', i1, ' | ', i2, ' | ', i3,' | ', i4 );  
            

         );
    
;

我想添加隐私。如何做到这一点,并且仍然保持我的模型作为对象属性可访问?

相关

How to create global, instance based objects from local scope?

【问题讨论】:

那么,您希望整个MUserTry 对象是私有的吗? 从哪里可以使用该接口?这完全是范围问题。 但是该控制器将被定义为MC 模块的一部分? 【参考方案1】:

有没有一种简单的方法可以为我的模型添加隐私,并且仍然可以将它们作为对象中的属性进行访问?

显然,您需要将整个对象设为私有。是的,这也可以像 javascript 中的任何其他隐私一样工作 - 闭包。

看看module pattern(网上有很多关于这个的教程)。

【讨论】:

闭包一个函数。它只是具有导出您可能需要的界面的好处。 它只需要对调用它的部分公开,在你的情况下似乎是Controller。如果两者都定义在同一个范围内,它们仍然不需要是全局的。 没有。 closures do "export" (a) 函数公开,但仍然可以访问内部的“私有”变量。 是的。该方法现在可以公开访问,是在一个范围内声明的,它可以引用从外部不可用的“私有”事物。 “普通函数”是什么意思?您将无法从外部访问在其范围内声明的变量。它们通常会在函数执行完成后被垃圾回收。【参考方案2】:

你可以用闭包做到这一点。

var MyNamespace = ;
MyNamespace.MyClass = (function() 
    function privateMethod() 
        // ...
    

    function publicMethod() 
        // can call privateMethod() from in here
    

    return (
        publicMethod: publicMethod
    );
());

这将创建一个名为MyNamespace.MyClass 的对象,其中包含一个私有方法和一个公共方法。在您的情况下,您可能希望为每个模型类执行此操作。让他们的 init 方法公开并隐藏他们的其他方法。

【讨论】:

MyNamespace.MyClass.publicMethod(); MyClass 将获得具有publicMethod 属性的对象。 如果您在启动时只运行此代码一次,那么不,内部函数不会被创建多次。他们怎么可能?这段代码运行一次,MyNamespace.MyClass 被赋予了一个匿名函数的返回值(该返回值只是一个只有一个属性的对象:'publicMethod'),就是这样。

以上是关于一种将(添加隐私)封装到 MVC 中的模型的方法?的主要内容,如果未能解决你的问题,请参考以下文章

MVC简易封装

从MVC到前后端分离

mvc是啥,有啥用

一种将不同长度的命名向量合并到 R 中的数据框(将名称信息保留为列名)的快速方法

差分隐私若干基本知识点介绍

MVC - 将动态添加的控件绑定到模型中的 List<T>