Tag: 设计

仅与常量接口

最近我遇到了一段代码,其中我找到了一个只有常量的接口。 并且使用静态导入在类中访问这些常量。 常数更多(约30至50)。 就个人而言,我认为这不是一个好习惯。 这就是为什么它根据Effective Java被称为Constant Interface Antipattern。 我没有找到任何有理由去进行这种编码。 此外,仅当我们的应用程序中的许多类导入的常量很少时,才应使用静态导入。 谁能告诉我是否有任何其他充分的理由去寻找常数界面?

避免复合模式中的instanceof

我正在为大学做一个项目,我们正在为游戏编程。 在这个游戏中可以发生几种效果,一种效果可以影响另一种效果的行为。 现在,其中一个想法是使用复合图案,起初看起来像是一个坚固的解决方案。 这里最大的问题是效果的行为方式取决于它与之结合的效果,我们看到解决这个问题的唯一方法是使用我们想要不惜一切代价避免使用的.getClass()或instanceof。 有哪些方法可以设计这个问题? 编辑(一个小例子):我没有明确的代码示例,但我将尝试用以下示例澄清一下: 因此游戏中有手榴弹(显然会爆炸并造成伤害),这种爆炸被视为“爆炸效应”。 手榴弹所在的方形在运行时可能会出现电力故障(PowerfailureEffect)。 ExplosionEffect和PowerfailureEffect可以耦合,这会导致爆炸更强烈并造成更多伤害。 ExplosionEffect还可以与其他效果相结合,导致爆炸伤害的行为更加不同

Libgdx第一人称相机控制

我刚刚开始在libgdx中使用3D进行游戏。 我已经知道如何绘制基本Model ,我CameraController用CameraController玩CameraController 。 现在我想创建一个FirstPersonCamera或FirstPersonCameraController 。 我考虑过扩展PerspectiveCamera并MyMovingObject target添加一个MyMovingObject target 。 MyMovingObject将保持x, y, z position ,其中y是一个常数值,因为此刻我无法up/down移动。 所以我的动作基本上是2D。 MyMovingObject还会存储其moving direction / xSpeed, zSpeed所需的left/right rotation 。 但是Player也应该能够向上和向下查看,而MyMovingObject并不需要这种向上/向下旋转,因为它只会改变视图而不会改变其他属性。 所以我不确定我是否走正确的路。 我希望能够通过使用W,A,S,D向前,向左,向右,向后W,A,S,D并使用鼠标向左旋转。 此外,我想通过使用鼠标来上下打量,就像大多数First Person游戏一样。 我应该使用另一种方式,而不是通过扩展PerspectiveCamera创建我自己的相机? 或者这种方法是否良好,我只需要在MyMovingObject存储向上/向下旋转,如果只需要视图? 或者用W,A,S,D and mouse控制相机并根据相机的位置和旋转更新MyMovingObject的位置会更好吗? 我希望你明白我的意思。 解释它似乎有点复杂(至少对我而言)。 编辑:我现在使用Vector3 direction , Vector3 position和Vector3 size为我的NPC和播放器。 我通过这样做来计算速度: xSpeed = direction.x / (direction.x + direction.z) * speed; zSpeed也一样。 通过这样做,我“过滤”了它的y值,我只得到x和y的百分比。 唯一的问题是,当我直视x和z为0 。 […]

如何使用Enums的简单性设计易于扩展的API?

抱歉标题模糊; 我想不出如何更清楚地说出来。 以下是问题的重点: 强调 询问有关ExifTool for Java库的API设计问题。 以下是当前API 的示例 。 作为USER ,API使用起来非常简单,因为您只需传入要返回的图像元数据的枚举。 作为DEV ,API有点糟糕,因为您无法使用更多Enum类型轻松扩展基类以支持lib中可能不直接支持的其他元数据。 简单地预定义和支持“ 所有元数据 ”并非易事 。 题 鉴于设置信息,我所追求的是试图找到一种方法来预先定义人们通常想要从他们的图像中获得的30或40个最常见的元数据标记; 现在一切都被定义为枚举 ,但这种类不可扩展。 如果我使用“Class-per-Metadata-flag”路由,那么可扩展性将很简单,但是开箱即用的API将不那么友好。 如果闭包提供了一个非常漂亮和简单的解决方案,我会考虑制作这个库Java 8+的v2.0,但是否则我显然更愿意让它与更多系统(Java 6/7)兼容而不是更少。 概要 我对该库的目标是“易于使用和扩展” – 我觉得我已经在1.x版本中使用了“简单易用”的方面,但是该库不易扩展,我想在2.x系列。 我已经坐在2.x版本上超过一年等待灵感罢工,它已经躲过了我; 我希望有人可以发现我的错误,我可以以一种非常优雅的方式向前移动lib。 谢谢你们的时间!

有关工厂模式的问题

很多人说他们在项目中使用工厂模式。 但是当我真正看到它们的实现时,它看起来与我在第一本书中读到的定义完全不同。 在书中他们描述了两种工厂模式即 工厂方法 : – 类指定其子类,以根据某些参数指定要创建的对象。 所以我们期望这里有一些基类的抽象方法,这些方法将由子类和pupose实现,即创建一些对象 抽象工厂 : – 提供工厂(以接口或抽象工厂的forms),用于创建相关或依赖对象的族,而无需指定其具体类。 我在这里有一个问题,它们是指依赖或相关对象族的含义。 让我们参考http://www.apwebco.com/gofpatterns/creational/AbstractFactory.html 。 根据我的理解,这意味着在FinancialToolsFactory (在链接中)能够创建TaxProcessor ,这是一系列产品,其中的实际concreate产品是CanadaTaxProcessor和EuropeTaxProcessor 。 所以在这里我们将有n个具体工厂(在这种情况下是CanadaFinancialToolsFactory和EuropeFinancialToolsFactory ),它们将在这种情况下扩展/实现抽象工厂FinancialToolsFactory 。 如果上述理解是正确的,请告诉我,因为我认为它是工厂模式的关键。 第二个问题: 人们对工厂模式名称的处理如下: public class MyFactory { public static T getObject(Class cls) { if (cls == null) { throw new IllegalArgumentException(“Invalid className”); } T daoObject = (T)map.get(cls); if (daoObject == null) { daoObject […]

Java中Decorator模式的替代方案?

假设您具有以下与统计相关的类的层次结构,其结构类似于Template方法模式 : interface S { // Method definitions up-to and including the S3 class } class S0 implements S { // Code that counts samples } class S1 extends S0 { // Code that calls the superclass methods and also computes the mean } class S2 extends S1 { // Code that calls the superclass […]

如何实现对Java中映射到内存的文件的并发读取?

我有许multithreading同时读取相同的文件(完全约100M),只有一个线程来更新文件。 我想将文件映射到内存中以减少文件I / O. 如何在Java中完成? 我基本上考虑了以下两种方法: 用字节数组来存储文件,每次创建ByteArrayInputStream以在multithreading读取时读取缓冲区。 使用NIO获取一个文件通道,同步通道以从MappedByteBuffer读取以进行multithreading读取。 我不确定这些方法是否有效。 如果有更好的解决方案,请帮助提供一些提示。

Spring Controller:使用域对象作为@RequestBody

我有一个域对象类User (它是一个JPA实体): @Entity public class User { private String name; private boolean enabled = true; // getters/setters } 我正在尝试使用Spring 3 MVC提供REST API以允许客户端创建新用户: @Controller public class UserController { @RequestMapping(value=”/user”, method=RequestMethod.POST) @ResponseBody public String createRealm(@RequestBody User user) { user.setEnabled(true); // client is not allowed to modify this field userService.createUser(user); … } } 它工作得很好,但我不知道将域对象用作@RequestBody是否是一个好主意,因为我必须保护一些不应被客户端直接修改的字段(即在这种情况下为“enabled”)。 这些替代方案的优缺点是什么: 使用域对象并保护不允许用户修改的字段(例如,将它们设置为null或手动设置为其默认值) 使用一组新的辅助对象 (类似于DTO),例如仅包含我想通过REST […]

想要在java中的复杂结构上建议(DAO和服务层链接/耦合)

介绍 我试图在Java中使用接口,抽象类和generics构建一个相当复杂的结构。 由于没有仿制药的经验,只有平均创建优质OOP设计的经验,这开始certificate是一个相当大的挑战。 我有一种感觉,我正在尝试做的事情实际上无法完成,但我可以接近它。 我会尽量简短地解释一下。 我只想告诉我,这个结构将代表我的DAO和服务层来访问数据库。 使这个问题更抽象只会让它变得更加困难。 我的DAO层完全没有问题。 有一个通用的DAO接口,每个实体都有一个DAO接口,它扩展了generics接口并填充了generics类型。 然后是每个DAO实现扩展的抽象类,后者又实现相应的接口。 很可能会混淆读取,所以这里是以产品DAO为例的图表: 现在,对于服务类,我有一个类似的结构。 无论如何,服务类中的大多数方法都映射到DAO方法。 如果您使用“服务”替换上图中的每个“DAO”,您将获得我的服务层的基础。 但根据我的以下想法,有一件事我想做: 实体的每个服务类至少将访问一个DAO对象,即它所针对的实体的DAO。 哪个是…… 问题/问题 如果我可以进行适当的OO设计, 使每个服务类都有一个实例变量用于各自实体的DAO对象,我认为服务层将是完美的。 对我的建议是受欢迎的,以防我的设计看起来不那么好。 我已经像这样实现了它: 类AbstractService public abstract class AbstractService { EntityDAO entityDAO; public AbstractService() { entityDAO = makeEntityDAO(); //compiler/IDE warning: overridable method call in constructor } abstract EntityDAO makeEntityDAO(); } 类ProductServiceImpl public class ProductServiceImpl extends AbstractService { […]

为什么虚拟function不能过度使用?

我刚刚读到我们不应该过度使用虚函数。 人们认为虚拟function越少,错误越少,维护也越少。 由于虚函数会出现什么样的缺陷和缺点? 我对C ++或Java的上下文感兴趣。 我能想到的一个原因是由于v表查找,虚函数可能比正常函数慢。