MATLAB:动态访问私有类成员

时间:2013-05-10 19:31:00

标签: matlab oop

我正在设计一个人们将使用的开发平台。该团队代表开发人员和用户。他们将使用该平台进行实际操作,并为该平台开发新代码。我正在使用MATLAB的面向对象编程,而Subversion用于版本控制。我的问题如下:

  1. 我希望将公共接口保持在最低限度,以保持封装并保持系统模块化。我这样做只会让相关的班级成员公开。

  2. 如果某个复杂的过程失败,可能不明白为什么,特别是如果它由于私有类成员而失败。如果在失败点之前需要一个小时或更长时间,我不希望开发人员/用户必须使用断点重新运行代码以找出发生的情况。

  3. 如果开发人员想要尝试涉及私人类成员的新想法,他们可以查看软件的一个分支并做任何他们想做的事情,但这需要时间和计划。这不是他们在'运行时'可以做的事情。

  4. 我想通过后门暂时获取私有类成员的访问权限,这样开发人员和用户就可以动态获取访问权。

  5. 这个问题可能源于我的一些天真。我不是软件工程师,我恰好是我团队中经验最丰富的程序员。因此,我也在寻找不应该这样做的可能原因。有没有更好的方法来思考这个问题?

    classdef DevTest
    
        properties (Access = private)
            privateProp = 'This property is private';
        end
    
        methods (Access = private)
            function privateMethod(This)
                disp('You''ve gained access to a private method!')
            end
        end
    
    end
    

2 个答案:

答案 0 :(得分:1)

这是我的想法。我将创建一个名为Developer的类,它将包含一个Developable对象作为属性。名为Developable的接口将有3个抽象方法,getPropertysetPropertymeval。我会将这些方法的访问权限限制为DevelopableDeveloper。以下是一些示例代码:

classdef

Developable
classdef (Abstract) Developable < handle

    methods (Abstract, Access = {?Developable, ?Developer})
        propVal = getProperty(This, propName)

        This = setProperty(This, propName, propVal)

        varargout = meval(This, methodName, varargin)
    end

end

Developer

classdef Developer < handle

    properties
        DevObj@Developable
    end

    methods
        function This = Developer(DevObj)
            if isa(DevObj, 'Developable')
                This.DevObj = DevObj;
                warnId = '''Developer:debugUseOnly''';
                warnMessage = ['''The Developer class should only be used ' ...
                    'temporarily to gain access to private and ' ...
                    'protected class members. Do not use in any ' ...
                    'permanent manner. Instead contact the owner ' ...
                    'of the class you wish to modify, and work out a ' ...
                    'solution.'''];
                warnStr = ['warning(' warnId ',' warnMessage ')'];
                evalin('caller', warnStr)
            else
                errorId = 'Developer:nonDevelopableObject';
                errorMsg = 'DevObj must be a Developable Object';
                error(errorId, errorMsg)
            end
        end

        function propVal = getProperty(This, propName)
            propVal = This.DevObj.getProperty(propName);
        end

        function setProperty(This, propName, propVal)
            This.DevObj.setProperty(propName, propVal);
        end

        function varargout = meval(This, methodName, varargin)
            if nargout > 0
                out = cell(1, nargout);
                [out{:}] = This.DevObj.meval(methodName, varargin{:});
                varargout = out;
            else
                This.DevObj.meval(methodName, varargin{:});
            end
        end

    end

end

这似乎对我有用,但它有一些问题:

  • 每个子类都必须实现Developable中的三个方法,但这些方法中包含的代码在每个实例中都是相同的。

  • 一旦我开始从Developable类继承,事情就会变得复杂起来。

  • 我还没弄明白如何使用它来获取静态方法的访问权。

有没有人有更好的方法来解决我的问题,或解决我上面列出的一些问题?

以下是Developable类的示例:

classdef DevTest < Developable

    properties (Access = private)
        privateProp = 'This property is private';
    end

    methods (Access = private)
        function privateMethod(This)
            disp('You''ve gained access to a private method!')
        end
    end

    methods (Access = {?Developable, ?Developer})
        function propVal = getProperty(This, propName)
            propVal = This.(propName);
        end

        function This = setProperty(This, propName, propVal)
            This.(propName) = propVal;
        end

        function varargout = meval(This, methodName, varargin)
            if nargout > 0
                varargout = cell(nargout, 1);
                [varargout{:}] = This.(methodName)(varargin{:});
            else
                This.(methodName)(varargin{:});
            end
        end
    end
end

答案 1 :(得分:1)

克里斯,请不要这样做 - 这是一个非常糟糕的主意,它不会让你或你的开发者的生活变得更轻松。

如果您正在为其他开发人员设计一些东西,请相信他们能够进行更改并且不会搞砸。如果您正在为用户设计某些内容,请将其锁定以仅提供对所需内容的访问权限。

如果您正在与一组开发人员一起为用户设计一些东西,那么我希望您使用的是版本控制系统,对吗?

如果没有,则立即停止所有工作,将其置于版本控制中,然后开始使用它。

为用户保持主干被锁定,方法和属性为适当的私有。如果你的某个开发者希望通过公开来试验某些东西,那么他们可以查看一个私人分支并根据自己的喜好进行尽可能多的更改,而不必担心他们会“忘记将其更改回来”(这句话响起了警钟)对我来说,让我觉得你可能没有使用版本控制)。如果他们的实验证明是有用的,并且您可以证明为用户公开某些方法或属性,那么将他们的更改合并回主干。

PS如果您真的想要追求自己的设计,可以考虑制作开发人员方法Hidden,以便其他用户无法看到秘密后门。