在我的例子中,我有一个表示某组数据的类。一些数据的属性被写入类'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
is,同样是类的属性,在方法的签名中都不可见。所以我关心的是有方法实际上有输入和输出参数,但不通过它们的签名显示它们。
它基本上没问题,但我会像这样实现它:
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
笔记:
obj
作为main方法的输出参数。load
而不是get
,以确保它没有被误认为属性get方法。我不会过分担心“OOP精神” - 相反,只需确保您的代码有效,组织良好,可测试且可维护。
根据纯OOP的“学说”,对于除了对象引用之外没有in
或out
参数的方法,这很好。
但是,您正在做的事情不符合方法命名的常规做法。名称以get
开头的方法通常是“getter”。 “getter”的主要目的是返回类的一些组件。一般来说,“getter”不应该修改目标对象。
但是你有两个get...
方法,1)修改目标对象和2)不返回任何东西。
在我看来:
setPathnameFromFilename
或者只是setFilename
。loadRawDataFromSpreadsheet
或类似的东西。另一方面,这个实现对我来说似乎有点尴尬,而不是OOP的“精神”,这是关于用户和类之间明确定义的接口的很多。
我实际上根本没有看到。当然,界面没有明确定义,但主要是因为您没有记录方法,因为您选择了(IMO)误导性/非信息性的类和方法名称。
(免责声明:我是一名Java程序员。但是,OOP的基本原则在所有OO语言中基本相同。)