当封装基本上被忽略时,我应该使用OOP吗?

时间:2017-06-08 07:50:36

标签: oop encapsulation paradigms

我正在制作一个数学网络程序,允许用户计算和证明各种数量或陈述,例如:矩阵的行列式,集合的交集,确定给定的映射是否是同态。我决定使用OOP范例编写代码(在PHP中,用于处理用户浏览器可能不喜欢的一些超重计算),因为我可以很容易地将集合声明为Set对象,矩阵作为Matrix对象等,并保留一些在后台确定诸如基数,决定因素等事物的混乱细节。然而,在深入研究代码之后,我想知道决定OOP是否是一个错误。这就是原因。

我将使用Matrix类作为一个简单示例。 Matrix具有以下属性:

  • name(类型String)(存储此矩阵的名称)
  • size(类型array)(存储此矩阵的#rows和#列)
  • 条目(类型array)(存储此矩阵的条目)
  • is_invertible(类型Boolean)(存储此矩阵是否可以反转)
  • determinant(类型Int)(存储此矩阵的行列式)
  • 转置(类型array)(存储此矩阵的转置)

创建一个名为A的新矩阵就像这样完成:

$A = new Matrix("A");

现在,在关于矩阵的一般数学问题中,可能是我们知道矩阵的名称,大小,条目,它是否可逆,它的行列式,或它的转置,或者任何组合以上。这意味着所有这些属性都需要可访问,当然,用户可以更改这些属性中的任何属性,具体取决于问题中给出的内容。 (如果需要,我可以举出任何这些案例的问题示例。)

我所遇到的问题是,这会破坏封装规则"规则" OOP("规则"引用,因为根据我的理解,它不是一个严格的规则,只应该在最大程度上维护)。我做了一些关于应该使用getter和setter的搜索,或者甚至是否应该使用它们(对我来说很奇怪,他们不会在OOP设置中......),但这似乎对我没有帮助很多,因为我发现了许多矛盾的答案和案例特定的意见。

所以,我的整体问题是:当用户需要访问权限来修改对象的许多(如果不是全部)属性时,面向类的设计似乎是解决编程问题的理想选择,

  1. OOP是构建代码的最佳方式,尽管基本上完全忽略了封装?
  2. 是否有OOP的替代方案,允许高用户访问,同时保持OO"风味" (即将集合,矩阵等保持为对象)
  3. 如果问题需要,可以暂时中断封装规则吗?或者这不是OOP的精神?

1 个答案:

答案 0 :(得分:1)

  1. 您要做的事情不一定超出OOP的范围。问题是你有一个与编程教科书中通常描述的模型不同的模型(例如,矩阵的值总是存在,所有函数都可以是简单的方法)。 (也许这就是为什么这个问题不公平地被低估了。)没有什么能阻止你在内部存储像“is_invertible”这样的值并实现setter和getter方法。如果您正在尝试学习OOP,这样做可能有意义。但我认为其他问题(参见编码教科书)可能更容易用于学习目的。我看到远程目标是将一些数学作为OOP框架捕获。但是整个数学世界比任何固定的建筑都要丰富得多(像哥德尔定理这样的结果就是理论极限)。您只能成功开发非常狭窄的应用程序框架,例如解决某些方程式。这就是符号代数程序的作用:你可以看看,例如,SymPy或Maple和Mathematica的部分是如何实现的。在我看来,OOP范式既非常有用,也可能过于严格/不必要,具体取决于任务(您当然可以在维基百科或其他地方找到更多有关OOP的内容)。此外,您的问题可以看作是编写一种小型编程语言 - 在许多编程语言中,您将集合,数字等作为对象。

  2. 您可以只使用基本的OOP或根本不使用OOP。您可以使用函数式编程。

  3. 您应该Google /在此网站或其他网站上详细了解此信息。当红色交通灯亮起时,有时可以走过马路吗?