根据 OOP 的"pure doctrine",调用一个没有任何输入和输出参数但引用对象本身的方法吗?



在我的示例中,我有一个代表一组数据集的类。某些数据的属性写入了类'properties,而类'methods主要执行任务,例如阅读电子表格中的原始数据并进行一些预定。我想知道以下内容是否是根据OOP的"纯粹学说",如果没有的话,是否以及如何在语法上进行改进。这是这样一个类的非常简单(未经测试的)实现。

classdef dataObjectTest < handle
    properties
        filename char
        pathFilename char
        rawData double
    end
    methods
        function obj = setPathnameFromFilename(obj, filename)
            %setPathnameFromFilename Determine full path- & filename from single filename
            %   filename: Name of the file containing the raw data, e.g., 'Test.xls'
            obj.filename = filename;
            intermed = dir(obj.filename);
            obj.pathFilename = fullfile(intermed.folder, obj.filename);
        end
        function obj = loadRawDataFromSpreadsheet(obj)
            % loadRawDataFromSpreadsheet Convert the raw data stored in a spreadsheet into a Matlab
            % array, using the full path- & filename determined by setPathnameFromFilename
            %   rawData: Array contating the raw data
            obj.rawData = xlsread(obj.pathFilename);
        end
    end
end

这是一个人从另一个程序/脚本中调用此类的方式:

test = dataObjectTest;
test.setPathnameFromFilename('Test.xls');
test.loadRawDataFromSpreadsheet;

我特别担心第三行。由于该方法loadRawDataFromSpreadsheet的输入和输出参数都是类的属性,因此不需要在功能标题中明确定义它们。另一方面,这种实现对我来说似乎有些尴尬,而不是OOP的"精神",这与用户和班级之间的明确定义接口有关。因此,尽管我的代码有效,但我仍然想知道这是否是"正确的方法",或者是否可以显着改进。

更新:肯定的是,我方法的名称的选择可能是误导性的,但这不是问题的重点。所以让我尝试澄清。

第一种方法将用户赋予的字符串filename返回pathFilename。但是,由于这也是类的属性,因此从函数签名中看不到它,即该函数应该看起来像:

function pathFilename = setPathnameFromFilename(obj, filename)

但这在MATLAB中不起作用。(varName =部分用其他语言对应于return varName。)第二种方法返回数组rawData,并且由于输入参数pathFilename再次是类的属性,因此在方法的签名中都看不见。因此,我担心的是使用实际上具有 in-和outtuf contuments的方法,但不会通过其签名来揭示它们。

基本上很好,但是我会这样实现:

classdef dataObjectTest < handle
    properties
        filename char
        pathname char
        rawData array
    end
    methods    
        function loadRawDataFromSpreadsheet(obj, filename)
            obj.filename = filename;
            obj.pathname = dataObjectTest.extractPathName(filename
            obj.rawData = xlsread(obj.pathname);
        end
    end
    methods (Static, Access = private)
        function pathname = extractPathName(filename)
            intermed = dir(filename);
            pathname = fullfile(intermed.folder, filename);
        end
    end
end

注意:

  1. 由于它是一个句柄对象,因此您不需要obj作为主要方法的输出参数。
  2. 我已经将路径的提取转移到了私有静态方法,因为它确实是一个效用函数(您可以作为实际的子函数而不是方法实现)。
  3. 我已重命名为从load而不是get开始的主要方法,以确保它没有误认为属性获取方法。

我不会太担心" OOP的精神" - 相反,只需确保您的代码正常工作,可以测试且可维护。

根据纯OOP的"学说",对于没有inout参数的方法,除了对象参考。

但是,您正在做的事情不符合方法命名的正常实践。以get开头的名称的方法通常是" Getter"。" getter"的主要目的是返回类的某些组成部分。一般而言," getter"不应修改目标对象。

但是您有两种get...方法,即1)修改目标对象和2)不要返回任何内容。

我认为:

  • 第一个应命名为setPathnameFromFilename,或者可能只是setFilename
  • 第二个应该命名为loadRawDataFromSpreadsheet或类似的东西。

另一方面,这种实现对我来说似乎有点尴尬,而不是OOP的"精神",这与用户和类之间的明确定义的接口有关。

我实际上根本看不到。当然,界面不是明确定义的,但这主要是因为您尚未记录方法,因为您选择了(IMO)误导性/非信息类和方法名称。

(免责声明:我是Java程序员。但是,所有OO语言的基本原理在很大程度上相同。)

相关内容

  • 没有找到相关文章

最新更新