Tag: 设计

设计决策:为什么以及何时将接口设为私有?

私有接口是否曾用于设计决策? 如果是这样,原因是什么,何时知道需要私有接口?

使用PowerMock或您的测试对您的设计有多大影响?

多年来我一直是EasyMock的粉丝,多亏了SO,我遇到了对PowerMock的引用,并且它能够模拟构造函数和静态方法,这两种方法在将测试转换为遗留代码库时会导致问题。 显然,unit testing(和TDD)的巨大好处之一是它导致(强制?)更清洁的设计,在我看来,PowerMock的引入可能会减损它。 我会看到这主要表现为: 回到初始化合作者而不是注入它们 使用静态而不是使方法归协作者所有 除此之外,关于我的代码被操作用于测试的字节码,对我来说并不合适。 我不能真正给出具体的理由,只是因为它只是为了测试而不是为了生产而让我感到有点不安。 在我目前的演出中,我们真的推动unit testing作为人们改进编码实践的一种方式,并且感觉将PowerMock引入等式可能会让人们稍微跳过这一步,所以我不愿意开始使用它。 话虽如此,我真的可以看到在哪里使用它可以减少开始测试类需要完成的重构量。 我想我的问题是,人们使用PowerMock(或任何其他类似的库)获得这些function的经验是什么,您是否会使用它们以及您希望您的测试对您的设计有多大影响?

我们可以在Java中使用构造函数的返回类型吗?

以下代码给出了编译错误: class parent { parent(int a){} } class child extends parent{} 错误: Main.java:6: cannot find symbol symbol : constructor parent() location: class parent class child extends parent{} ^ 1 error 我试图做不同的事情,发现向父构造函数添加一个返回类型摆脱了错误! class parent { int parent(int a){} } class child extends parent{} 我已经读过构造函数不应该有返回类型,这显然不是一直都是正确的。 所以我的问题是我们什么时候应该有构造函数的返回类型?

Java应用程序的零停机时间部署

我正在尝试构建非常轻量级的解决方案,以便为Java应用程序实现零停机部署。 为简单起见,我们认为我们有两台服务器。 我的解决方案是使用: 在“前端” – 一些负载均衡器(软件) – 我在这里考虑HAProxy。 在“后面” – 两台服务器,都运行Tomcat和已部署的应用程序。 当我们即将部署新版本时 我们使用HAProxy禁用其中一个服务器,因此只有一个服务器(让我们称之为服务器A,运行旧版本)将可用。 在其他服务器上部署新版本(让我们称之为服务器B),运行生产unit testing(如果我们有它们:-)并使用HAProxy启用服务器B,同时禁用服务器A. 现在我们只有一个服务器活动(服务器B,新版本)。 在服务器B上部署新版本,然后重新启用它。 有什么建议怎么改进? 怎么自动化? 任何现成的解决方案或我必须最终使用自己的自定义脚本? 谢谢!

如何解决松散耦合/dependency injection与富域模型之间的冲突?

编辑:这不是理论层面的冲突,而是实施层面的冲突。 另一个编辑:问题是没有域模型作为仅数据/ DTO与更丰富,更复杂的对象映射,其中Order具有OrderItems和一些calculateTotal逻辑。 具体问题是,例如,Order需要从中国的某些Web服务中获取OrderItem的最新批发价格(例如)。 因此,您运行了一些Spring Service,允许在中国调用此PriceQuery服务。 Order具有calculateTotal,它遍历每个OrderItem,获取最新价格,并将其添加到总数中。 那么您如何确保每个订单都引用此PriceQuery服务? 如何在反序列化,从DB加载和新实例化时恢复它? 这是我的确切问题。 简单的方法是传递对calculateTotal方法的引用,但是如果您的Object在其整个生命周期内部使用此服务该怎么办? 如果它在10种方法中使用怎么办? 每次传递引用都很麻烦。 另一种方法是将calculateTotal移出Order并进入OrderService,但这会打破OO设计,我们会转向旧的“事务脚本”方式。 原帖: 简短版本:富域对象需要引用许多组件,但这些对象会被持久化或序列化,因此它们对外部组件(在本例中为Spring bean:服务,存储库,任何东西)所持有的任何引用都是暂时的并且会被消除。 当对象被反序列化或从DB加载时,需要重新注入它们,但这非常难看,我看不到一种优雅的方法。 更长的版本:有一段时间了,我在Spring的帮助下练习了松耦合和DI。 这对我保持可管理性和可测试性有很大帮助。 不久前,我读了Domain-Driven Design和一些Martin Fowler。 因此,我一直在尝试将我的域模型从简单的DTO(通常是表行的简单表示,只是数据无逻辑)转换为更丰富的域模型。 随着我的域增长并承担新的职责,我的域对象开始需要我在Spring上下文中使用的一些bean(服务,存储库,组件)。 这已成为一场噩梦,也是转换为丰富域名设计最困难的部分之一。 基本上有些点我手动将应用程序上下文的引用注入到我的域中: 当从Repository或其他负责实体加载对象时,因为组件引用是暂时的,显然不会持久化 从Factory创建对象时,因为新创建的对象缺少组件引用 当对象在Quartz作业或其他地方被反序列化时,因为瞬态组件引用被擦除 首先,它很难看,因为我将对象传递给应用程序上下文引用,并期望它通过名称引用它所需的组件。 这不是注射,而是直接拉动。 其次,它是丑陋的代码,因为在所有提到的地方我需要逻辑来注入appContext 第三,它容易出错,因为我必须记住在所有那些地方注入所有这些物体,这比它听起来更难。 必须有一个更好的方法,我希望你能够对它有所了解。

何时编写静态方法与实例方法的编码是否有经验法则?

我正在学习Java(和OOP),虽然它可能与我现在所处的位置无关,但我想知道是否可以分享一些常见的陷阱或良好的设计实践。

通过服务API公开Hibernate标准

这更像是一个设计而不是实现问题,而且它会很长,所以请耐心等待。 最好用一个例子来解释: 假设我有一个名为Product的业务实体,其中包含许多属性( 名称 , 价格 , 供应商等)。 它由接口( Product )和实现( ProductImpl ,在Hibernate中映射)以及基本CRUD服务接口( ProductService )和实现( ProductServiceImpl )表示。 Product和ProductService作为API公开,它们的实现不是。 我想向ProductService添加一个List findProducts(QueryCriteria criteria)方法,该方法将返回满足给定条件的产品列表。 要求是: 通过直接产品属性查询(例如product.price gt 50.0 ) 按关联查询(例如product.vendor.name = “Oracle” ) 排序结果(例如order by product.vendor.name desc, product.price asc”排序) 应用其他filter。 与API客户端指定的上述3个项目不同,服务可以基于客户端的身份应用其他filter(例如,调用此方法的客户端可能仅限于查看由给定供应商制造的产品)。 此类filter优先于客户端指定的任何条件(例如,如果filter设置为product.vendor.name = “Microsoft” ,则上述(2)中的查询应生成空结果集。 因此,问题是这种方法使用的QueryCriteria接口应该是什么样的? 我可以想到3个解决方案,我不喜欢其中任何一个: 允许客户端直接指定HQL(以“where”子句开头)。 这是最直接的解决方案,但也是最有问题的安全方面。 即使假设filter(上面的#4)足够简单,可以通过Hibernate的会话filter实现,HQL仍然需要解析 – 至少 – 确保将查询参数指定为参数而不是内联。 使用精简包装的Hibernate的DetachedCriteria代替QueryCriteria 。 “精简包装”因为不能允许客户端直接创建DetachedCriteria ,因为无法控制为其创建的映射实体。 […]

使用Spring设计Java库

我正在从现有程序中将一些function提取到一个单独的库中。 这个程序使用Spring进行dependency injection和其他任务,我也想继续在库中使用它。 这个库需要监视文件系统的更改,因此它将启动某种单独的线程来执行此操作。 我真的不知道我对库的初始化有什么选择: 如何初始化库的上下文? 我不能假设库用户也会使用Spring,但我可以使用库分发Spring。 如何管理文件系统监控线程? 期望程序实例化库的主类和调用init或类似的东西是好的设计吗?

如何在真实的JMS分布式架构中利用Spring Integration?

对于以下场景,我正在寻找有关最佳实践的建议和提示: 在分布式(主要是基于Java)系统中: 许多(不同的)客户端应用程序(web-app,命令行工具,REST API) 中央JMS消息代理(目前支持使用ActiveMQ) 多个独立处理节点(在多个远程计算机上运行,​​计算由JMS消息有效负载指定的不同类型的昂贵操作) 如何最好地应用Spring Integration框架提供的JMS支持来将客户端与工作节点分离? 在阅读参考文档和一些初步实验时,看起来JMS入站适配器的配置本身就需要使用订户,而订户在解耦方案中不存在。 小方说明:通过JMS文本消息进行通信(使用JSON数据结构以实现未来的可扩展性)。

用Java设计高性能状态机

我正在开始编写Java库来实现高性能的有限状态机。 我知道那里有很多库,但是我想从头开始编写自己的库,因为几乎所有的库都构建了自动机,这些自动机被优化为一次只能处理一个。 我想知道SO社区中涉及状态机设计的人员在实现像这样的高性能库时最重要/最好的设计原则是什么。 注意事项 生成的自动机通常不是很大的。 (~100-500州)。 实现应该能够扩展 。 实现应该能够实现快速转换 (最小化,确定等)。 希望实施DFA,NFA,GNFA,PDA和可能的Tree Automata。 希望在可能的情况下在单一界面下。 应该在内存使用和性能之间取得良好的平衡。 目前关于设计的当前问题是: 应该定义State , Symbol和Transition类吗? 或者应该使用“隐藏的”内部结构。 就个人而言,我觉得使用类本会浪费大量内存,因为相同的信息可以以更加浓缩的forms存储。 但是,这是否可以实现更快的转换? 它是否有任何其他优点/缺点? 在内部存储数据的最佳方法是什么? 使用像HashMap和HashSet这样的数据结构可以实现分摊的常量时间查找,但是存在涉及开销的元素。 这是最好的方法吗? 将转换信息存储为原始(或非)数组似乎浪费了相当多的内存。 特别是当库需要一次处理很多自动机时。 不同数据结构的优缺点是什么? 我很感激任何意见。 谢谢!