小编Asa*_*saf的帖子

跟踪实用程序类

我最近对我在项目代码库中出现的问题越来越感到沮丧.

我正在开发一个拥有> 1M行代码的大型java项目.接口和类结构设计得非常好,编写代码的工程师非常精通.问题在于,为了使代码更清晰,人们在需要重用某些功能时编写实用程序类,随着时间的推移,随着项目的增长,越来越多的实用程序方法出现.但是,当下一位工程师遇到对相同功能的需求时,他无法知道有人已在代码中的某处实现了实用程序类(或方法),并在另一个类中实现了该功能的另一个副本.结果是大量代码重复和太多具有重叠功能的实用程序类.

我们作为一个团队可以实施任何工具或任何设计原则,以防止实用程序类的重复和低可见性吗?

示例:工程师A有3个位置需要将XML转换为String,因此他编写了一个名为XMLUtil的实用程序类,并toString(Document)在其中放置一个静态方法.工程师B有几个地方将文档序列化为各种格式,包括String,因此他编写了一个名为SerializationUtil的实用程序类,并且有一个名为static的方法serialize(Document),它返回一个String.

请注意,这不仅仅是代码复制,因为上述示例的2个实现很可能是不同的(例如,一个使用变换器API而另一个使用Xerces2-J),因此这可以被视为"最佳实践" "问题也是......

更新:我想我更好地描述了我们开发的当前环境.我们使用Hudson进行CI,使用Clover进行代码覆盖,使用Checkstyle进行静态代码分析.我们使用敏捷开发,包括日常会谈和(可能不充分)代码审查.我们在.util中定义了所有的实用程序类,由于它的大小现在有13个子包,在根(.util)类下有大约60个类.我们还使用第三方库,例如大多数apache commons jar和一些组成Guava的罐子.

我很肯定,如果我们让某人完成重构整个软件包的任务,我们可以减少一半的公用事业,我想知道是否有任何工具可以降低成本,并且有任何方法可以可以尽可能地延迟重复出现的问题.

java usability software-design code-duplication

19
推荐指数
2
解决办法
2395
查看次数

什么是Jaxb等效的Text节点值?

我希望转换一个看起来像这样的类......

public class Amenity {
   public String id;
   public String value;
}
Run Code Online (Sandbox Code Playgroud)

使用JaxB注释将以下XML转换为以下XML:

<amenity id="id-string-here">value-string-here</amenity>
Run Code Online (Sandbox Code Playgroud)

有谁知道在value成员变量上使用什么注释来完成这个?我到目前为止最接近的是:

@XmlRootElement
public class Amenity {
   @XmlAttribute
   public String id;
   @XmlElement
   public String value;
}
Run Code Online (Sandbox Code Playgroud)

不幸的是,这种方法不允许我指定value不应将成员变量呈现为自己的标记<value></value>.

java annotations jaxb xml-serialization jaxb2

15
推荐指数
1
解决办法
1万
查看次数

处理依赖的第三方库中的更改

我有一个依赖于几个第三方库的项目,项目本身被打包为jar并作为库分发给其他开发人员.这些开发人员将依赖项添加到其类路径中,并在其代码中使用我的库.

最近我遇到了第三方依赖项之一的问题,apache commons编解码器库,问题是:

byte[] arr = "hi".getBytes();
// Codec Version 1.4
Base64.encodeBase64String(arr) == "aGk=\r\n" // this is true

// Codec Version 1.6
Base64.encodeBase64String(arr) == "aGk=" // this is true
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,方法的输出随着次要版本的更改而发生了变化.

我的问题是,我不想强​​迫我的图书馆用户使用第三方图书馆的特定次要版本.假设我知道对依赖库的更改,无论如何我可以识别哪个库版本被包含在类路径中并且相应地表现?或者,什么被认为是这种情景的最佳做法?

PS - 我知道对于上面的例子,我可以使用new String(Base64.encodeBase64(data, false))向后兼容的,这是一个更普遍的问题.

java dependencies

13
推荐指数
2
解决办法
1591
查看次数

虽然引发了预期的异常,但JUnit测试失败

我似乎无法弄清楚为什么我的一个测试失败了.

这是测试:

@Test(expected = IllegalArgumentException.class)
public void complainsIfFromLocIsDifferentObject() throws Throwable {
    board.set(make(), 1, 3); //Creates different rook from 'piece'
    assertFalse("ChessPiece Test 2", piece.isValidMove(getValidMove(1, 3), board));
}
Run Code Online (Sandbox Code Playgroud)

我设置了一个断点,并多次完成整个过程.它进入了类中的第二个if语句ChessPiece,似乎抛出了异常.然后该过程返回到Rook类并在super块下返回false .

关于发生了什么的任何想法?谢谢

相关代码:

public class Rook extends ChessPiece {

    @Override
    public boolean isValidMove(Move m, IChessBoard b) {
        if (super.isValidMove(m, b) == false)
            return false;

        // Add logic specific to rook
        if(m.fromRow == m.toRow || m.fromColumn == m.toColumn)
            return true;
        else 
            return false;
    }
}


public abstract class …
Run Code Online (Sandbox Code Playgroud)

java testing

12
推荐指数
2
解决办法
4万
查看次数

GraphiQL 中的“合并”按钮是什么?

MergeGraphiQL UI 中按钮的用途是什么?它似乎在做与按钮相同的事情Prettify

请提供示例

graphql graphiql

5
推荐指数
1
解决办法
327
查看次数