设计模式/数据加载解决方案

Dor*_*ori 6 java design-patterns

我一直在研究一些涉及加载数据的项目,有时是远程的,有时是本地的,有时是JSON,有时是XML.我遇到的问题是,由于开发的速度和各种客户的不断变化,我发现我的设计过于僵化,我希望它们更灵活.我一直试图想出一个可重用的数据加载解决方案,并希望得到一些建议,因为我想你们中的很多人都有同样的问题.

我想要做的是创建一个通用的LoadingOperation抽象类,它具有类型为ParserLoader的成员变量,它们分别具有parse()和loadData()方法.该分析器装载机归类是我想有延伸了一类新的接口和实现这些可能是XMLParser的和JSONParser,LocalLoader和RemoteLoader等.随着这样的事情类LoadingOperation要加载的每一件事情,这就是天气本地XML文件,或远程JSON,或其他.

问题是特定的Parser实现无法在不破坏LoadingOperation类的多态行为的情况下返回自定义数据类型.我一直在瞎搞与泛型和声明的子类LoadingOperation

class SpecificLoader extends LoadingOperation<CustomDataType>
Run Code Online (Sandbox Code Playgroud)

Parser类做类似的事情,但这看起来有点奇怪.

有没有人对我做错什么/可能做得更好有任何建议.我希望能够快速响应不断变化的规范(忽略它们不应该改变那么多的事实!)并且具有逻辑上的代码分离等等......

谢谢你的帮助!

编辑:问题也在这里询问链接文字

Knu*_*ubo 1

在我看来,由于需求变化太快,您确实想要用尽可能少的代码轻柔地键入的东西。这是我正在做的一个项目,其中我使用 PHP 作为后端。我使用 sql 和 json 快速从数据库中获取数据并将其返回给客户端。

通常,我在数据库中进行选择,对于每个结果行,我将行转换为映射,其中每一列成为键,值作为该列的结果。然后,该地图列表通过通用 json rutine 转换为 json,并从服务器发送该 json。

像这样的设置非常容易将一些数据从服务器传输到客户端,但是:

  • 您失去了通过使用 hibernate/xml/remoting 可以获得的类型安全性。
  • 您的客户端与您的数据库模式紧密耦合。
  • 获取数据并传输它的速度非常快。
  • 如果您更改查询以获取更多数据,则无需重新编译客户端,除非它们需要使用新数据。

为了让您了解 PHP 中的情况,我这样做:

在我的数据访问对象中:

function getAllPortal() {
    $sql = "select firstname, lastname, U.* from person, portal_user U where id=person order by firstname, lastname";
    $prep = $this->db->prepare($sql);
    return $prep->execute();
}
Run Code Online (Sandbox Code Playgroud)

在我的 http 服务(基于休息)代码中:

    $accPerson = new AccountPerson($db);
    echo json_encode($accPerson->getAllPortal());
Run Code Online (Sandbox Code Playgroud)

要在 Java 中执行此操作,您可能需要创建一些框架来从映射列表(或您想要传输到客户端的其他一些简单结构)中获取数据。我用 PHP 制作了一个可以执行此操作的程序,并且还允许使用准备好的语句。

您可以考虑的其他一些注意事项(即使您没有按照上述操作)可能是:

避免分层。尽可能少地拥有它们。如果您使用 Hibernate - 拥抱它。直接在查询中使用对象并将其转换为 json 并将其发送出去。如果多个人(或客户)需要使用您的数据,这些层将使您的代码变得健壮 - 它们使您的代码不愿快速更改。知道何时分层、何时不分层是诀窍,并尽可能长时间地抵制它。写层需要时间。

选择 XML 甚至更好的 JSON 作为您的传输。不要选择像 xml 和/或 pojos 序列化这样抗拒更改的模式。Pojos 对于业务逻辑来说非常有用,但对于数据传输来说却很糟糕。如果你的客户端足够瘦,就不用再将你的 json 反序列化为对象了。直接使用 JSON。同样,与层一样,技巧是要知道重新创建 pojo 何时能够提供业务价值,何时不能提供业务价值。与图层一样,在看到价值之前不要投入这项工作。编写/维护反序列化器需要时间。