在我的示例中,我有一个代表一组数据集的类。某些数据的属性写入了类'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
注意:
- 由于它是一个句柄对象,因此您不需要
obj
作为主要方法的输出参数。 - 我已经将路径的提取转移到了私有静态方法,因为它确实是一个效用函数(您可以作为实际的子函数而不是方法实现)。
- 我已重命名为从
load
而不是get
开始的主要方法,以确保它没有误认为属性获取方法。
我不会太担心" OOP的精神" - 相反,只需确保您的代码正常工作,可以测试且可维护。
根据纯OOP的"学说",对于没有in
或out
参数的方法,除了对象参考。
但是,您正在做的事情不符合方法命名的正常实践。以get
开头的名称的方法通常是" Getter"。" getter"的主要目的是返回类的某些组成部分。一般而言," getter"不应修改目标对象。
但是您有两种get...
方法,即1)修改目标对象和2)不要返回任何内容。
我认为:
- 第一个应命名为
setPathnameFromFilename
,或者可能只是setFilename
。 - 第二个应该命名为
loadRawDataFromSpreadsheet
或类似的东西。
另一方面,这种实现对我来说似乎有点尴尬,而不是OOP的"精神",这与用户和类之间的明确定义的接口有关。
我实际上根本看不到。当然,界面不是明确定义的,但这主要是因为您尚未记录方法和,因为您选择了(IMO)误导性/非信息类和方法名称。
(免责声明:我是Java程序员。但是,所有OO语言的基本原理在很大程度上相同。)