对象和数据结构

对象:暴露行为(接口),隐藏数据(私有变量)

数据结构:没有明显的行为(接口),暴露数据。如DTO(Data Transfer Objects)、Entity

1.对象与数据结构的反对称性(参考书中代码清单6-5)

  • 使用数据结构便于在不改动现在数据结构的前提下添加新函数;使用对象便于在不改动既有函数的前提下添加新类。
  • 使用数据结构难以添加新数据结构,因为必须修改所有函数;使用对象难以添加新函数,因为必须修改所有类。
  • 万物皆对象只是个传说,有时候我们也会在简单数据结构上做一些过程式的操作。

2.Demeter定律(最少知识原则)

  • 模块不应该了解它所操作对象的内部情形
  • class C的方法f只应该调用以下对象的方法:
  • C
  • 在方法f里创建的对象
  • 作为参数传递给方法f的对象
  • C持有的对象
  • 方法不应调用 由任何函数返回的对象 的方法。下面的代码违反了demeter定律: final String outputDir = ctxt.getOptions.getScratchDir.getAbsolutePath;
  • 一个简单例子是,人可以命令一条狗行走(walk),但是不应该直接指挥狗的腿行走,应该由狗去指挥控制它的腿如何行走。

异常处理

异常处理很重要,但如果异常处理四处分散在代码中 导致逻辑模糊不清,它就是错的。

1.使用异常而不是返回错误码

  • 如果使用错误码,调用者必须在函数返回时立刻处理错误,但这很容易被我们忘记。
  • 错误码通常会导致嵌套if else

2.先写try-catch语句

  • 当编写可能会抛异常的代码时,先写好try-catch再往里堆逻辑

3.使用unchecked exception(java独有) 4.在catch里尽可能的记录错误信息,记录失败的操作以及失败的类型。 5.根据调用者的需要 定义不同的异常处理类

  • 同一个try里catch多个不同exception,但是catch处理的事(打日志等)是一致的,可以考虑用函数打包一下这个异常处理,针对不同异常仅需throw成同一个异常而不做任何处理,在外层catch时统一处理(打日志等)。如果仅想捕获一部分异常而放过其他异常,就使用不同的函数打包这个异常处理。

6.特例模式: 创建一个类来处理特例。 try{

MealExpendses expenses = expenseRepotDAO.getMeals(employee.getID);

m_total += expenses.getTotal; // 如果消耗了餐食,计入总额

} catch(MealExpensesNotFound e) {

m_total += getMealPeDiem; // 如果没消耗,将员工补贴计入总额

}

异常打断了业务逻辑。可以在getMeals里不抛异常,而是在没消耗餐食的时候返回一个特殊的MealExpense对象(PerdiemMealExpense),复写getTotal方法。

MealExpendses expenses = expenseRepotDAO.getMeals(employee.getID);

m_total += expenses.getTotal;

publc classPerDiemMealExpensesimplementsMealExpenses{

publicintgetTotal{

//return xxx; //返回员工补贴

}

}

7.别返回null值

  • 返回null值只要一处没检查null,应用程序就会失败
  • 当想返回null值的时候,可以试试抛出异常,或者返回特例模式的对象。

8.别传递null值

  • 在方法中传递null值是一种糟糕的做法,应该尽量避免。
  • 在方法里用if或assert过滤null值参数,但是还是会出现运行时错误,没有良好的办法对付调动者意外传入的null值,恰当的做法就是禁止传入null值。
posted on 2021-06-20 15:08  在下程序猿  阅读(57)  评论(0编辑  收藏  举报