是否根据OOP的“纯粹学说”来调用没有任何输入和输出参数的方法,而是引用对象本身?

问题描述 投票:2回答:2

在我的例子中,我有一个表示某组数据的类。一些数据的属性被写入类'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,并且由于输入参数pathFilenameis,同样是类的属性,在方法的签名中都不可见。所以我关心的是有方法实际上有输入和输出参数,但不通过它们的签名显示它们。

matlab oop
2个回答
4
投票

它基本上没问题,但我会像这样实现它:

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作为main方法的输出参数。
  2. 我已经将路径的提取移动到私有静态方法,因为它实际上是一个实用函数(您可以实现为实际的子函数而不是方法)。
  3. 我已经将主要方法重命名为load而不是get,以确保它没有被误认为属性get方法。

我不会过分担心“OOP精神” - 相反,只需确保您的代码有效,组织良好,可测试且可维护。


3
投票

根据纯OOP的“学说”,对于除了对象引用之外没有inout参数的方法,这很好。

但是,您正在做的事情不符合方法命名的常规做法。名称以get开头的方法通常是“getter”。 “getter”的主要目的是返回类的一些组件。一般来说,“getter”不应该修改目标对象。

但是你有两个get...方法,1)修改目标对象和2)不返回任何东西。

在我看来:

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

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

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

(免责声明:我是一名Java程序员。但是,OOP的基本原则在所有OO语言中基本相同。)

© www.soinside.com 2019 - 2024. All rights reserved.