正在寻找软件模块设计的一套思路

从大一开始就讲OOP三大要素 封装、继承、多态,到现在为止仍然很难在三者中挖掘共通的规律
我认为三者中封装是基础,也是最难掌握的。
比如你想模拟现实中人吃苹果的场景,首先抽象模型“人”和“苹果”,那么是应该给“人”一个“吃”的动作还是应该给苹果一个“被吃”的动作或者二者都有???
我想软件设计的高度抽象性很难用现实来还原场景动作,上例中给人“吃”的动作显然更符合大自然界规律,而更多脱离现实的东西却很难知道职责应该划分在谁身上,这就存在了,“封装不得体”和“过度封装”这些现象。经常看书本,鲜有对封装原则进行阐述的,封装的不得体的话会让未来的结构变得十分蹩脚且难于读懂,我读过一些写得不错的代码封装方式也让人莫名其妙,寻找最佳封装方式将是长期艰难的路程。

根本还是一个ooa的问题