7

我对接口编程相当陌生,并试图将其作为开发测试驱动的主要工具。

目前我们有很多管理器类都实现了一个CRUD接口。然而,有些经理还没有进行更新,有些没有删除,有些可能永远不会这样做。


未实现异常?

可以吗,只是

throw new NotImplementedException()

直到该方法被实施,或者如果它从未实施,甚至一直如此?

(很明显,源代码注释告诉程序员“不应该使用这种方法,例如‘男性’‘女性’这样的类型永远不会被删除)?


分裂?

还是应该将我的 CRUD 界面拆分为可创建、可读取(可搜索)、可更新和可删除?这不会弄乱我的班级定义吗?

PersonManager implements Creatable<Person>, Updateable<Person>, Deletable<Person>, Searchable<Person>

拆分和合并?

或者我应该将所有 4 之类的一些接口组合到 CRUD 中,也许还有一些其他组合,例如读取 + 更新?

也许这也会创建大量接口,其中一个必须单击一个大的继承路径以找出哪个接口实现了当前情况下所有所需的原子接口(我需要读取和创建,那么哪一个只实现了这两个?这会很快变得复杂得多)

4

4 回答 4

6

IMO,对于中间阶段-可以使用NotImplementedException,直到您完成实施为止。

但是,作为一种永久性解决方案-我认为[在大多数情况下]这是一种不好的做法。

相反,我会创建一个包含所有实现类共有的行为的接口,并使用子接口将它们聚集起来以实现更具体的行为。

这个想法类似于 java 标准SortedSet,它扩展了 a Set- 我们不想将其Set视为SortedSets 并为这种类型的变量赋予 值HashSet,而是SortedSet为此目的使用子接口。

于 2012-04-19T08:42:49.037 回答
6

通常你想抛出UnsupportedOperationException一个运行时异常,明确提到不支持请求的操作。

拥有大量接口会导致文件过多,并且如果有人试图查看它们,他们会感到困惑。在这种情况下,Java 文档也没有多大帮助。

如果一个接口的操作太多,并且并非所有操作在逻辑上绑定在一起,那么拆分接口是有意义的。

对于数据库操作,这种情况很少见,因为您将进行一些基本操作,这在大多数情况下都是正确的。

于 2012-04-19T08:43:08.463 回答
1

NotImplementedException 并不意味着该类不支持此操作。这意味着它没有实施,但它将在未来实施。

从逻辑的角度来看,所有接口方法都必须实现,并且必须运行良好。但是如果你离开它,只为自己编写一个应用程序,那么你就会记住这个限制。另一方面,我会很生气一些开发人员实现了接口并且没有实现它。因此,我认为您不能只为将来的开发而保留未实现的接口方法。

我的建议是修改接口,然后在实现的方法中使用异常。

于 2012-04-19T08:45:55.120 回答
0

在支持协变和逆变的框架中,拆分接口然后定义一些复合接口可能非常有用。对于不提供此类支持的框架(甚至有时在提供此类支持的框架上),有时让接口包含各个实现可能支持或不支持的方法会更有帮助(当尝试不受支持的操作时,实现应该抛出异常);如果要这样做,则应包含方法或属性,外部代码可以通过这些方法或属性询问支持哪些操作,而无需使用任何会引发异常的代码。

然而,即使在使用对动作的支持是可选的接口时,有时定义额外的接口来保证某些动作可用也可能会有所帮助。拥有在不添加新成员的情况下继承其他接口的接口可能是实现此目的的好方法。如果做得正确,代表实现所需的唯一额外工作是确保它们将自己声明为最具体的适用类型。客户的情况稍微复杂一点:如果客户的需求可以在类型系统中充分表达,客户可以通过要求特定类型来避免运行时类型检查的需要。另一方面,在客户端之间传递实例的例程可能会因某些客户端而变得复杂。

于 2012-04-19T16:27:35.313 回答