通过一个简单的示例,对面向对象编程(OOP)中的良好实践进行了简短的讨论
7次浏览(过去30天)
显示旧的注释
嗨,伙计们,
我对寻找更多关于面向对象编程的良好实践感兴趣,也欢迎为非程序员提供像样的书籍。
让我们考虑下面的例子:
-类点的一些属性和构造函数的输入参数。
类点
classdef点
属性(Access = public)
ID
X
Y
结束
方法(Access = public)
函数obj =点(id, x, y)
%的构造函数
obj。ID= id;
obj。X= x;
obj。Y= y;
结束
结束
结束
- Class Points with Items属性,应该包含Point对象和AddPoint对象等方法
classdef点
属性(Access = public)
Item = Point()
计数= 0
结束
方法(Access = public)
函数obj = Points()
%
结束
函数obj = AddCount(obj)
obj。Count = obj。计数+ 1;
结束
函数obj = AddPoint(obj, id, x, y)
obj = obj. addcount ()
obj.Item(obj.Count) = Point(id, x, y)
结束
函数obj = AddPoint(obj, id, x, y)
% obj.Item(1) =点(id, x, y)
%结束
结束
结束
问题是,类点应该如何构建:
- 我应该使用方法AddPoint在点返回一个点对象?如果是,我应该如何获得点对象在点类?我初始化私有属性作为点的实例,并分配对象给它,还是还有其他更好的方法吗?会有很多Point对象,所以应该事先创建一个对象数组。
- 如你所见,在Points类中有一个Item属性,它是常见的(在简单的程序)分配对象属性,然后调用它的方法通过点符号分配对象?我知道有访问列表,但目前对我来说有点复杂。
我相信答案是主观的,取决于程序的复杂性(不是那么复杂),因此我愿意听取你的想法。
0评论
答案(2)
史蒂文的主
2021年9月17日
首先,如果有两个类的名称只在大小写或单数和复数之间有区别,如果输入错误,可能会引起混淆。
其次,在这里使用Points类比使用Point对象向量有什么好处?
>> P =点(“波士顿”, 10, 7)
P =
点属性:
ID:“波士顿”
X: 10
Y: 7
>> P(2) =点(“纽约”, 9, 6.5)
P =
1×2点带有属性的数组:
ID
X
Y
>> P(3) =点(“洛杉矶”, 1, 3)
P =
1×3点带有属性的数组:
ID
X
Y
>> ny = p (2)
纽约=
点属性:
ID:“纽约”
X: 9
Y: 6.5
> >元素个数(P)
ans =
3.
每•艾萨克森
2021年9月20日
编辑:每•艾萨克森
2021年9月30日
“[…适合非程序员阅读的体面书籍。”
阿菲克:没有关于
面向对象的设计和编程
用Matlab算例。然而,Python有很多。Python OO与Matlab OO非常接近,因此Python书籍非常有用。有一点Visual Basic的背景,我曾经完成了大部分的头部优先设计模式(Java示例)。我发现这很有用,但是今天我要找一本Python的书,因为Python像Matlab一样是“动态的”。(见
Peter Norvig的《动态规划中的设计模式》。
)
我向谷歌询问“一本关于面向对象的Python初学者的好书”,并收到了一些有用评论的链接。
“我应该在Points中使用AddPoint方法来返回Point对象吗?”[…有没有更好的办法?”
没有足够的背景来回答这个问题。这取决于您将如何使用这些类。我猜不出来。为什么这些属性
项
而且
PointObject
?它们是标量吗?名字都是单数。
属性(Access = public)
Item = Point()
计数= 0
PointObject = Point()
结束
obj。项(
1
)
索引的值(ONE)是打字错误吗?
obj.Item(1) = Point(id, x, y);
“会有很多Point对象”
小心,用Matlab在成千上万个简单的点对象上操作可能会非常慢。
2的评论
每•艾萨克森
2021年9月21日
“事情变得越来越糟糕了。”
这不是初学者的练习。找出其他人是如何完成任务的。
- 询问谷歌“形状矩形线点面向对象设计”。
- 看到如何编写一个真正面向对象的程序(没有一行代码)