罗兰在MATLAB的艺术

把想法变成MATLAB

常见的设计考虑对象属性

我很高兴介绍嘉宾戴夫Foti。戴夫在MATLAB工作了15年,目前管理组负责在MATLAB面向对象编程特性。他感兴趣的是MATLAB工具来满足用户日益复杂的挑战。这篇文章将看一看利用MATLAB中的对象属性。

内容

房地产基础知识

属性是MATLAB对象如何存储数据。在最基本的层面上,属性提供了一种方法来定义哪些数据需要一个特定类型的对象。例如,如果我有一组测量值和每个测量都有相同的信息,然后我可以创建一个类的测量对象与属性来存储每一块信息:

类型surfaceTempReading1
结束日期经度纬度温度结束classdef surfaceTempReading1属性

我可能会有这样一个实例:

t1 = surfaceTempReading1;t1。日期=日期;t1。纬度=“42:16:4 N”;t1。经度=“71:20:2 W”;t1。温度= 260;disp (t1);
surfaceTempReading1属性:日期:16 - 3月- 2011的纬度:“42:16:4 N”经度:71:20:2 W的温度:260

MATLAB文档描述属性在这里

相关的属性

在简单的情况下,它可能是好的所有属性直接存储和检索数据。然而,MATLAB提供方法来定义属性,不直接存储数据。这些依赖属性定义使用依赖属性如:

类型surfaceTempReading2
classdef surfaceTempReading2日期经度纬度温度结束属性(依赖)高度方法函数结束= get.Altitude(阅读)= lookupAltitude(阅读。纬度,reading.Longitude);结束结束结束

在这种情况下,如果我有一个数据集的表面温度,我只是需要纬度和经度来确定温度采样。然而,在分析数据,这可能是有用的和表面的高度关联的温度。而不是必须输入这些数据,可以计算高度从地球表面地形数据库。假设我有一个函数,它可以提供这样的一个值lookupAltitude,然后我可以调用这个函数依赖所谓的高度

t2 = surfaceTempReading2;t2。日期=日期;t2。纬度=“42:16:4 N”;t2。经度=“71:20:2 W”;t2。温度= 260;disp (t2)
surfaceTempReading2属性:日期:16 - 3月- 2011的纬度:“42:16:4 N”经度:“71:20:2 W”温度:260高度:342

改变属性名

依赖属性允许我一些灵活性,以不同的方式实现相同的外部接口。我们班的用户并不一定需要知道高度决定或是否实际上是存储在一个类实例。这种灵活性可能是有用的在随时间演进的一个类而不是打破脚本可能使用的类和函数。例如,如果我决定时间戳是一个更好的名字日期财产,我可以逐步开始切换新名字没有立即改变所有的代码我已经使用日期:

类型surfaceTempReading3
classdef surfaceTempReading3时间戳属性经度纬度温度结束%弃用属性名称属性(隐藏的依赖),日期结束方法函数D = get.Date(阅读)D = reading.TimeStamp;结束函数阅读= set.Date(阅读,D)阅读。时间戳= D;结束结束结束

当我改变我的类以上,不仅会使用旧脚本日期继续工作,但老mat文件保存使用旧的类定义会自动加载日期值到新的时间戳财产。我使用了隐藏的属性,这样旧的属性名不显示在对象显示属性命令或选项卡中完成。

t3 = surfaceTempReading3;t3。日期=日期;disp (t3);
surfaceTempReading3属性:时间戳:“16 - 3月- 2011”纬度:[]经度:温度:[][]

副作用和验证

依赖属性也可以是有用的任何时间属性有副作用——例如当改变属性触发更新其他物体或图形或属性时需要做一些昂贵的操作获得或验证结果。通常这些昂贵的操作可以避免从某些“可信的”代码中定义的类。有一个私有财产,不执行任何副作用允许受信任的代码工作原始属性值。其他代码内部和外部的类可以使用公共和依赖属性执行副作用或昂贵的操作。有时,昂贵的操作只是验证输入值被分配给该财产。我们班举个例子,如果我想验证温度的值,我可以做一些类似以下:

类型surfaceTempReading4;
classdef surfaceTempReading4日期经度纬度结束属性(依赖)温度特性(访问=私人)pTemperature结束函数方法阅读= set.Temperature(阅读、t)如果t < 0错误(“SurfaceTemp: BadTemp”,…的温度必须在k是一个正数。”);结束阅读。pTemperature = t;结束函数t = get.Temperature(阅读)t = reading.pTemperature;结束结束结束

注意:上面的例子已经改变了原文的纠正一个错误。

t4 = surfaceTempReading4;试一试t4。温度= -15;犯错disp (err.message);结束
在开尔文温度必须是正数。

默认值

类可以定义属性的默认值。默认值定义的类和类的每个实例被分配默认值。可以使用默认值时,违约是一个常数,可以记录类定义。默认值可以在mat文件节省空间,因为每个类和属性的值默认保存一次不不同于默认值不需要保存。一般来说默认值应该尽可能文字值,显然默认的是什么。例如:

类型surfaceTempReading5
classdef surfaceTempReading5属性日期纬度= ' 0 n ';经度= ' 0 e”;温度= 0;结束结束

虽然可以使用默认值的一个函数的结果,每个人都应该避免这样做,除非函数返回一个常数值。例如,它可能会做一些类似:

类型surfaceTempReading6
classdef surfaceTempReading6属性%从MATLAB得到当前日期日期=日期;经度纬度温度最终结束

然而,问题在于,当前日期不是一个恒定的默认值,可以记录作为类的一部分。此外,由于MATLAB计算类定义的默认属性表达式只有当一个类被加载或加载,MATLAB的函数调用通常会发生一次会话。会得到相同的日期戳,每个对象类被加载时的当前,而不是当前日期创建一个对象时(也许第二天)。一般来说,一个不想指定一个默认值处理类似的原因。如果目的是使一个新的处理为每个实例,那么这个处理必须在构造函数中创建的,而不是作为一个默认值。因为违约是相同的所有实例创建从一个给定的类定义,所有对象将得到相同的处理。有关处理类的更多信息,请参阅处理和值类

我所描述的几个使用属性和一些常见的属性,但是我很感兴趣你如何使用属性。你可以发表想法在这里




使用MATLAB®7.11发表

|
  • 打印
  • 发送电子邮件

评论

留下你的评论,请点击在这里MathWorks账户登录或创建一个新的。