`

确定对象的职责:实际例子

阅读更多
   初写程序的时候,我们总是尽可能的使用JAVA的API,从这个角度来看,我们是类的用户。作为用户来讲,我们希望类的使用简单。

   当我们在解决实际问题的时候,我们需要对客观世界进行建模,设计结构良好的类,并且使得类的职责尽可能的清楚和单一,类和类之间的关系能够正确建模客观世界。从这个角度来看,我们是类的作者。作为类的作者,我们设计好了类,供其他人所调用。

   因此,在类的设计者之间和类的使用者之间存在者一个约定,这个约定就确定了程序的风格。
   对于类的作者来说,如果他为了保证类方法的健壮性,那么他会要求类的使用者必须遵循类方法的入口条件:也就是说,传入的参数必须是什么样的,必须满足什么样的规则,否则就报错。因此,我们经常会看到程序中产生 IllegalParameterException异常,这个异常就是因为用户的输入参数不能满足方法的入口准则而抛出的。因此,类的设计者在方法开头会有一系列的参数检查,可能方法中实际有效的行数没有几行,更多的都是参数校验逻辑。这对类的开发者来说比较有利,但是,对于类的使用者就比较麻烦,因为他必须要保证传入的参数,否则,就不能得到想要的结果。
  另外一种是将参数的校验交给使用者,使用者自行保证参数的正确性,调用类的方法就能够得到结果。这样,在使用方就会有比较多的参数校验逻辑,因为我们必须要保证传入  的参数是正确的。在平时的编程中,我们经常会写一些语句:
  if(a!=null){
    call(a,b);
  }
就是因为这个原因。

    在现实中,两种方式我们都会遇到。在开发过程中,只要在开发规范中定义好程序的编写方法以及入口检查机制,结果返回机制就没有问题。

   上面是闲话了。
   下面进入设计话题:Rebuild类到底需不需要检查文件在某个固定的目录下是否存在。

   Rebuild这个类的作用是根据HSQLDB Script文件,重新构建HSQLDB的文件数据库或者内存数据库。对外提供的接口主要有:

    * buildFileDBFromScriptFile(File scriptFile)
    * buildMemDbFromScriptFile(File scriptFile)

这两个方法完成数据库的重新构建工作。在数据库的重新构建过程中可能发生的错误,比如:

    * 数据库连接异常
    * 重新数据库过程中出现的异常
    * 数据库其他异常

都是要对其进行捕捉的。但是,是否也要检查待构建的文件是否已经存在。
   但是,我想这已经不属于RebuildUtil类的问题了。在构建过程中发生的异常都要进行捕捉,这是良好的编程所需要的。但是,对于这个类可能使用的千变万化的场合,这个RebuildUtil怎么能预知呢?

   比如说:如果有一个客户,希望即便有既定的目录下待构建的文件a已经存在,只需要改变文件名称为b就好了。然后就构建这个b数据库。那么我这个RebuildUtil应该怎么做呢?是不是需要在buildFileDBFromScriptFile(File scriptFile)中实现这个逻辑?
   那如果其他客户再有不同的逻辑,比如删除已经存在的文件。
   或者还有客户希望那就生成另外一个目录C,在目录C下生成文件就OK.
 
   可以看到,这些是客户的使用逻辑,而非RebuildUtil中的重建数据库的逻辑。因此,这部分内容不属于RebuildUtil类的职责,因此,从这个方面讲,RebuildUtil不将检查文件是否存在,如果存在就删除之这样的逻辑放在RebuildUtil类中是完全合理的。

   程序员在调用RebuildUtil的时候,应该自行保证File在当前的目录下没有被lock住,这就OK.
分享到:
评论

相关推荐

    设计模式:职责链模式

    职责链模式(Chain of Responsibility)是设计模式中的一种行为模式,它允许将请求沿着处理者对象的链式结构进行传递,直到某个对象决定处理这个请求。这种模式的主要优点在于可以解耦发送者和接收者,使得系统更加...

    C#面向对象设计模式纵横谈(14):Chain of Responsibility 职责链模式(行为型模式)

    - 多个对象处理同一请求,具体哪个对象处理该请求由运行时刻自动确定。 - 在不明确指定接收者的情况下,向多个对象中的一个提交一个请求。 - 可处理一个请求的对象集合应被动态指定。 #### 示例代码 假设我们正在...

    Java设计模式-代理模式例子

    通过学习和实践代理模式,开发者可以更好地理解和掌握面向对象设计原则,如单一职责原则和开闭原则,同时也能提高代码的复用性和可测试性。在Java世界里,设计模式是连接理论和实践的重要桥梁,是每个专业开发者必备...

    类图和对象图

    每个对象都有自己的状态(由类的属性确定)和行为(由类的方法定义)。 #### 二、类图 类图(Class Diagrams)是一种重要的UML(Unified Modeling Language,统一建模语言)图表,用于展示系统中类的静态结构,...

    springmvc简单的例子

    5. **ViewResolver**: 这是 Spring MVC 中的组件,它的职责是根据 Controller 返回的逻辑视图名,找到实际的视图资源。 在"demo_springmvc_simple"这个压缩包中,我们可能看到以下内容: - **配置文件**:如 `...

    写给大家看的面向对象编程书(第3版).[美]Matt Weisfeld(带详细书签).pdf

    1.6.3 接口/实现范型的一个实际例子 13 1.6.4 接口/实现范型的模型 14 1.7 继承 15 1.7.1 超类和子类 16 1.7.2 抽象 16 1.7.3 is-a关系 17 1.8 多态 18 1.9 组合 20 1.9.1 抽象 21 1.9.2 has-a关系 21 ...

    面向对象的设计过程(有案例)

    面向对象设计遵循一些基本原则,如单一职责原则、开闭原则、里氏替换原则等,以提高代码的灵活性和可维护性。同时,使用设计模式(如工厂模式、观察者模式、策略模式等)可以解决常见的设计问题,提供经过验证的...

    14丨实战二(下):如何利用面向对象设计和编程开发接口鉴权功能?1

    通过分析这些职责,我们可以初步确定以下三个核心类: - AuthToken:负责生成和验证token的逻辑。 - Url:处理URL的拼接和解析工作。 - CredentialStorage:存储和检索AppID与密码的信息。 2. 定义类及其属性和...

    各个版本的 设计模式 带例子

    - **装饰器模式(Decorator)**:动态地给一个对象添加一些额外的职责。若要扩展功能,装饰者提供了比继承更有弹性的方案。 - **外观模式(Facade)**:为子系统提供一个一致的接口,使得这些子系统更容易使用。 ...

    面向对象作业

    对于面向对象的设计来说,这些说明可以帮助我们确定具体的类及其职责,从而更好地设计系统的内部结构。 综上所述,面向对象的设计方法强调将复杂的问题分解为简单的对象,并通过这些对象的组合来构建整个系统。通过...

    南开大学复习资料-面向对象程序设计10001.docx

    22. **面向对象的设计原则**:包括单一职责原则(SRP)、开放封闭原则(OCP)、里氏替换原则(LSP)、接口隔离原则(ISP)、依赖倒置原则(DIP)等。 23. **封装的作用**:封装可以防止数据被误用,同时提供了接口...

    对象建模的基本概念.pptx

    5. 模型验证:检查模型是否满足需求,是否符合面向对象原则,如单一职责原则、开闭原则等。 6. 实现与测试:将模型转化为代码,并进行单元测试和集成测试,确保功能正确无误。 总之,对象建模是一种强大的工具,它...

    深入浅出面向对象的分析与设计4

    本文将深入浅出地探讨面向对象的分析与设计的核心概念、原则以及在实际开发中的应用。 ### 面向对象的基本概念 #### 对象 在面向对象的视角下,对象是现实世界或问题域中的实体抽象,它们具有属性和行为。属性代表...

    设计模式例子(高手可以不看)

    标题"设计模式例子(高手可以不看)"可能暗示这是一份面向初学者或中级开发者的学习资料,包含了设计模式的实际应用示例。描述中的“对设计模式的一个练习”进一步确认了这是一个学习和实践设计模式的项目。 设计模式...

    C#设计模式大全

    职责链模式是一个行为型设计模式,它允许请求沿着处理链传递,直到被某个对象处理。 - **结构**:包含处理者接口、具体处理者类。 - **示例性源代码**:例如,处理电子邮件的请求。 - **使用条件**:当处理过程不...

    ssh2用户注册例子

    **Hibernate3** 是一个对象关系映射(ORM)工具,它允许开发者用Java对象模型来操作数据库,而无需编写SQL语句。在用户注册中,Hibernate负责将注册信息持久化到数据库中,通过Session和Transaction接口处理数据的...

    一个MVC模式的小例子(实现了增、删的功能)

    这个小例子为初学者提供了一个简单的MVC模式实践,展示了如何在实际项目中结合Java EE技术栈实现基本的CRUD操作。通过学习和理解这个例子,开发者可以进一步掌握MVC模式的应用,以及相关框架的使用。

    自己整理的java设计模式23例子(包含源码)

    8. **装饰模式(Decorator)**:动态地给一个对象添加一些额外的职责,可以使用多个装饰类叠加功能,而不是通过继承增加复杂性。 9. **代理模式(Proxy)**:为其他对象提供一种代理以控制对这个对象的访问。 10. ...

Global site tag (gtag.js) - Google Analytics