我最近对我在项目代码库中出现的问题越来越感到沮丧.
我正在开发一个拥有> 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的罐子.
我很肯定,如果我们让某人完成重构整个软件包的任务,我们可以减少一半的公用事业,我想知道是否有任何工具可以降低成本,并且有任何方法可以可以尽可能地延迟重复出现的问题.
我希望转换一个看起来像这样的类......
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>.
我有一个依赖于几个第三方库的项目,项目本身被打包为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))向后兼容的,这是一个更普遍的问题.
我似乎无法弄清楚为什么我的一个测试失败了.
这是测试:
@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) MergeGraphiQL UI 中按钮的用途是什么?它似乎在做与按钮相同的事情Prettify。
请提供示例
java ×4
annotations ×1
dependencies ×1
graphiql ×1
graphql ×1
jaxb ×1
jaxb2 ×1
testing ×1
usability ×1