如何设计Java应用程序?

24
设计Java应用程序(从简单的控制台应用程序到J2EE应用程序)时,需要考虑哪些一般指导方针和最佳实践?
嗨,
我最近完成了Sun的Java编程教程并练习了核心Java(我有先前的编程经验)。现在我理解了继承、抽象、多态和封装的基础知识。
现在我能够毫不费力地编写Java代码,但是对于应用程序设计还不确定。这是我的主要问题:“设计”应用程序。如果我被要求创建一个Java应用程序,我应该从哪里开始?如何考虑?开发类层次结构时是否应遵循任何正式/非正式的指南?我真的很困惑(抽象类还是接口还是子类..?)。我应该先将所有东西建模,然后再编写代码吗?
对于像我这样的人来说,拥有一组可供遵循的一般指南/最佳实践将非常有用,可以在开发新的Java应用程序时使用。
请为我提供一些指南/思路/书籍/资源/工具,我应该阅读或使用。
提前感谢 斯科特

有很多方法可以实现。JavaEE应用程序的设计与控制台应用程序的设计、Swing应用程序的设计以及移动应用程序的设计都不同。告诉我们你想创建哪种类型的应用程序,这样就更容易帮助你了。 - FrustratedWithFormsDesigner
谢谢,我想从简单的控制台应用程序开始,然后转向 J2EE 应用程序。 - Dushyanth
9个回答

14

由于不同领域中有许多不同的Java应用程序,因此很难给出真正通用的建议。但是,Eric Evans的《领域驱动设计》是绝对推荐的一本书。同时,在Wikipedia上也可以找到简短的介绍。

一般建议:

  • 不要试图一开始就设计所有内容 - 设计一个合理的方案,使您能够开始编码,然后在您对问题领域和实现的理解加深时进行重构
  • 尝试将困难的问题分解成较小的部分/步骤/模块,逐个解决
  • 尝试以具有明确定义的职责的对象为思考方式,这些对象(或多或少)模拟了问题领域,并协作解决问题/处理任务
  • 变得擅长设计需要首先练习;不要害怕犯错误。但是,当您犯错时,请尽可能地分析并从中学习
  • 学习设计模式,但不要过度使用 - 只有在它们真正解决问题并使您的代码更清晰时才使用它们

5
在我看来,这一切都归结于满足以下要求:
  1. 易于理解
  2. 易于维护和演进
  3. 多个开发人员能够并行地为项目做出贡献
为了实现上述要求,有一些经验丰富的专家提出了一些指导方针和原则,包括:
  1. 遵循分层架构
  2. 在和跨层级中遵循SOLID原则。所有设计模式都以某种方式帮助实现这些原则。SRP:单一职责原则、OCP:开闭原则、LSP:里氏替换原则、ISP:接口隔离原则、DIP:依赖倒置原则
  3. DRY和KISS原则
这些指导方针和原则与任何编程范式或语言无关。但是,面向对象的编程语言更容易实现这些原则。

3
有各种不同的范例(通常是由三个字母缩写组成):
  • DDD: 领域驱动设计
  • SDD: 服务驱动设计
  • MDA: 模型驱动体系结构(代码和架构从UML模型中提取)
  • TDD: 测试驱动开发(先实现验证测试,再编写应用程序)
使用这些关键词,你可以在网上找到很多信息。
在J2EE中,我认为SDD最常用(即使我不确定它是否是最佳解决方案,但它现在已经非常“标准化”):服务(软件“智能性”)>领域(用于持久化的bean对象)> DAO(持久化)。
现在DDD变得越来越常用:概念重新聚焦于领域对象,这些对象正在接管“软件智能”层。

1
TDD本身并不是一种设计方法(尽管它可以用来测试API的可用性,因此非常有用)。MDA在90年代非常被炒作,然后消失了,原因很简单:UML是一个非常好的工具,用于传达你的设计,但不适合从中生成源代码。 - Péter Török

3
我建议您查看GRASP原则,它可以为您提供良好的设计基础技能。 点击此处了解更多信息。

2

2
如果我是一个初学者,我不会轻易涉足设计模式。 - Jean-Philippe Caruana

1

是的,你肯定应该对所有事情进行建模,但如果模型不起作用,就要愿意回过头来修改它。关键在于灵活性... - Ayubinator

1
我建议使用TDD进行紧急设计。
我认为Java设计没有什么具体的要求:如果您已经了解了对象设计,那就可以开始了!

我不同意。你为Java应用程序设计的类几乎肯定与你为C++或C#中相同应用程序设计的类不同,更不用说像SmallTalk或OCaml这样的语言了。 - Gabe

1

在开始编程之前,不要没有任何设计就立即开始编码。但这并不意味着您应该在编码之前全部设计完成。因为从我的以往经验来看,我没有任何不需要修正的设计。特别是如果您是一种新的编程语言,您的设计将根据您正在使用的语言的特性和可用库而发生变化。我的建议是拥有一个通用设计,基于面向对象设计的最重要方面,例如继承、多态、封装等等。从这个通用设计出发,根据您在编程过程中遇到的需求进行相应的设计调整。

随着您对语言的经验越来越丰富,您的第一份通用设计将更加高效地适合您的程序。

虽然大部分人都说一个面向对象的设计应该能够在任何面向对象的语言中编写,但是要拥有一个非常好的通用设计并不容易。更加现实的做法是,忽略用于实现特定设计的语言并不是我认为的好方法。


谢谢,穆斯塔法。我现在正在编写小应用程序,使用初始设计完成核心功能,然后重构代码以遵循面向对象编程。 - Dushyanth

1

很有可能你要做的事情已经被别人做过了,至少是类似的。幸运的是,现在有很多开源的东西。所以如果你真的没有头绪,可以下载几个做同样事情的开源应用程序来研究。这应该会给你一个良好的起点。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接