0

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

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

  2. 如果某些复杂的过程失败,原因可能并不明显,尤其是由于私有类成员而失败时。如果在故障点之前花了一个小时或更长时间,我不希望开发人员/用户必须重新运行带有断点的代码来找出发生了什么。

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

  4. 我想要一种通过后门临时获得对私有类成员的访问权的方法,这将允许开发人员和用户动态地获得访问权。

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

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
4

2 回答 2

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

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

  • 每个子类都必须实现 from 中的三个方法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
于 2013-05-10T19:30:59.723 回答
1

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

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

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

如果没有,请立即停止所有工作,将其纳入版本控制,然后开始使用它。

为用户锁定主干线,并酌情将方法和属性设为私有。如果您的一位开发人员希望通过将其公开来进行试验,他们可以查看一个私有分支并进行任意数量的更改,而无需担心他们会“忘记将其更改回来”(这句话敲响了警钟对我来说,让我觉得你可能没有使用版本控制)。如果他们的实验证明有用,并且您可以证明为用户公开某些方法或属性是合理的,那么将他们的更改合并回主干。

PS如果你真的想追求你的设计,你可以考虑制作你的开发者方法Hidden,让其他用户看不到秘密后门。

于 2013-05-11T18:34:03.720 回答