如何设计模块?

时间:2011-10-19 11:13:20

标签: oop language-agnostic architecture coding-style class-design

当您需要设计模块时,您通常会怎么做?到目前为止,我已经注意到它的易用性,API的直观性,可扩展性,性能以及类似的东西。

但对我来说,似乎相当简单和直截了当的可能对于其他用户来说似乎过于复杂。虽然它经常不会发生,但它确实有时发生在我们所有人身上(我希望)。

除了我已经提到的问题之外,在进行编码之前,在设计类层次结构/ API /之前是否应该问自己有什么问题?

如果你认为这个问题更适合关于SO的不同部分,请随意迁移它,但我仍然想要一个答案。

干杯。

2 个答案:

答案 0 :(得分:3)

您应该考虑SOLID Principleshere

关于责任分配适用GRASP Patterns

答案 1 :(得分:3)

你的问题非常好,而且答案很复杂,但答案基本上就是编程方面的经验。

制作软件有一般原则,但我想在这里,在这个简短的回答中,我可以给你一个可以应用的概念。软件是域的表示(例如,银行软件用于定制金融系统,或者雷达软件用于定制雷达检测的思想和原理)。因此,软件就像一个理论:它完全符合您的领域的当前知识,允许推理和扩展。如果有更多的知识可供使用,理论应该扩展,完善或更加通用以适应这种新知识,同时仍然对以前的知识有效。

因此,所有关于理论的概念都适用:

  • 满足您的知识在一个统一的框架中所强加的要求,这个框架听起来同质且集成度很高。
  • 很简单,但要寻找可能更通用的模式,并注意这些模式以便更好地集成。
  • 不要太简单。如果您的软件不符合要求,那么您的理论太有限,必须加以扩展。
  • 允许您的软件满足新的要求,软件不是一成不变的。它变异和发展,适应新的要求,或失去不再需要的功能。

因此,软件应该是简约的,但不是太多,美观但实用。

在实施这些指示时,我建议您留出时间学习您的域名。你无法对你不理解的东西进行建模。学习基础知识,从简单的东西开始,然后逐步完善它们。你偶尔会看到一些东西“感觉”在错误的地方。问问自己的问题,如

  • “谁负责这项行动?”
  • “这个依赖是逻辑的,这个对象需要工作,还是因为代码组织不好而只是一个虚假的?”
  • “这是高级还是低级功能?”
  • “我重复这个吗?”
  • “我可以在内部更改此对象/层/子系统而不知道代码吗?”
  • “我可以在未来扩展这一点而不会破坏或使过去无效吗?”
  • “我可以轻松地测试和探测此功能以获得正确的行为吗?”
  • “理解和使用是否容易直观?”
  • “我可以轻松地重新组合我已经拥有的内容,而无需触及实施新行为吗?”
  • “这个功能是否被隔离,以便我可以在没有我操作的大部分代码的情况下向外界展示它?”