针对良好的课堂设计时,要记住哪些事项?

时间:2013-10-06 05:51:41

标签: java

昨天我参加了一家领先的IT服务公司的采访。技术面试很好,没有问题,然后我又转到另一套关于管理,设计和流程的问题。除了以下问题,我已回答了所有问题。

采访者提问:

  

假设你正在开发一个我将在我的课程中消费的课程   通过扩展它,你保留的关键点是什么   心神? Ex,Class A,它有一个名为“方法A”的方法返回一个Collection,   让我们说“清单”。您将采取哪些预防措施?

我的回答:我将考虑以下几点,例如:

  1. 班级和方法需要公开
  2. 方法1返回一个列表,然后这需要是泛型。所以我们可以避免类强制转换异常
  3. 如果在多线程环境中访问此类,则需要同步该方法。
  4. 但采访者并不相信我的观点。他期待我得到一个不同的答案,但我无法得到他的思考过程,他除外。

    请提供您的建议。

4 个答案:

答案 0 :(得分:10)

我希望你坚持设计Single Reaponsibility,Open / Close和Dependency Injection的原则。保持无状态,简单和可测试。确保无需更改即可扩展。

然而,我没有采访你。

答案 1 :(得分:6)

还有一些尚未提及的要点是:

    您的课程的
  1. 体面的文档,这样您就无需深入了解您的代码,以了解您提供的功能以及问题所在。
  2. 尝试扩展您自己的课程,然后再将其发送给其他人。这样,如果你的课程设计不合理,你就可以感受到痛苦,从而可以改善它。
  3. 如果您要返回列表或任何集合,您需要问的一个重要问题是“调用者是否可以修改返回的集合”?或者“这个返回的列表是您班级内部状态的直接表示吗?”。在这种情况下,您可能希望返回副本以避免调用者弄乱您的内部状态,即保持适当的封装
  4. 计划方法的可见性。在publicprotectedpackage privateprivate方法之间划一条明确的界线。确保不要暴露任何超出实际需要的数量。删除功能 hard 。如果精心设计的API中缺少某些内容,您可以稍后再添加。但是你暴露了一些无用的公共方法,你真的无法在不弃用方法的情况下升级你的API,因为你永远不知道还有谁在使用它。

答案 2 :(得分:2)

如果你要归还一个集合,你应该考虑的第一件事就是我应该保护自己免受呼叫者改变我的内部状态,例如。

List list = myObject.getList();
list.retainAll(list2);

现在我拥有list1list2之间的所有共同元素。问题是myObject可能不会指望你销毁它返回的列表的内容。

解决此问题的两种常见方法是采取防御性副本或使用Collections.unmodifiableXxxx()来收集集合。对于额外的偏执,您可以同时执行这两种操作。

我更喜欢绕过这种方式是为了避免返回收藏品。您可以返回计数和方法来获取第n个值,或者返回Map返回键并提供getter,或者您可以允许访问者访问每个元素。这样您就不会暴露您的收藏品或需要副本。

答案 3 :(得分:0)

问题非常通用,但我想补充几点:

  1. 除了您要公开的方法之外,还要将其他方法和变量设为私有。整点是将可见度保持在最低限度。
  2. 尽可能使其不可变,这将减少mutithreaded环境中的开销。
  3. 您可能想要评估是否支持可序列化。如果没有,那么不提供默认构造函数。如果是可序列化的,那么请评估序列化代理模式。