面向对象编程 - 类设计混乱

lin*_*s77 11 oop class-design

我试图围绕面向对象的编程.

我的理解是我们有对象,所以我们可以设计我们的程序来镜像现实生活中的对象.

我们来看一个类层次结构:

class Fruit {
    void Eat() {

    }
}

class Apple extends Fruit {

}
Run Code Online (Sandbox Code Playgroud)

显然,如果Eat()是虚拟的,你可以多态地使用Fruit .但这有意义吗?水果不能自己吃!

水果对象应该传递给具有Eat()功能的人体物体吗?

我试图弄清楚正确的思考方式.一般来说,编程对象应该如何接近现实生活中的对象?

小智 12

你有一个设计问题 - 正如你正确指出的那样,Eat()作为Fruit的成员并没有明显的意义.另一方面,"可食用" 属性会更有意义.就像"onEaten" 事件一样,你的水果/苹果课程揭示了什么(以及你的模型中有哪些其他对象有意义)取决于很多其他因素,包括你试图用你的应用程序中的那些结构来完成什么.

通常,您希望类表示逻辑域级实体.有时这些对应于现实世界中的物理实体,但在许多情况下它们不对应.

在我看来,OO问题分解是程序员通常非常擅长的.我不知道有多少次我看到相当于一辆来自方向盘的汽车并摇了摇头,而原来的开发人员无法绕过他们的设计没有多大意义.


Gor*_*ran 8

简单地镜像现实世界的物体很少是一个好主意.借用一个典型的例子 - 控制咖啡机的软件不是关于咖啡豆和热水 - 而是关于制作咖啡.

您需要找到真实世界问题的基础抽象,而不仅仅是将名词复制到对象层次结构中.

如果你的苹果来自水果,它是否会增加任何有趣的行为?层次结构真的需要吗?继承为您的软件增加了一定程度的复杂性,任何增加复杂性的事情都很糟糕.您的软件跟随和理解起来有点困难,在您的测试中只需要更多内容,并且错误的可能性稍大一些.

我发现OOP更多的是关于空白 - 你遗漏的东西更重要.