JavaRush /Java 博客 /Random-ZH /Java 代码中的典型错误。
Sdu
第 17 级

Java 代码中的典型错误。

已在 Random-ZH 群组中发布
本材料包含我在与我一起工作的人员的 Java 代码中看到的最典型的错误。由于显而易见的原因,静态分析(我们使用qulice )无法检测到所有此类错误,这就是为什么我决定将它们列在这里。所有这些错误通常都与面向对象编程,特别是 Java 相关。
类名
你的类应该是现实生活中对象的抽象,没有“ 验证器 “控制器 管理器 等。如果你的类名以“-er”结尾,那就是糟糕的设计。当然,像Apache 的 StringUtilsFileUtilsIOUtils这样的反模式帮助器类是糟糕的设计模式的很好的例子。切勿添加后缀或前缀来区分接口和类。例如,所有这些名称都很糟糕: IRecordIfaceEmployeeRecordInterface。通常,接口名称是现实对象的名称,而类名称应该解释实现细节。如果没有关于实现的具体信息,则名称“ Default ”、“ Simple ”或类似的名称即可。例如: class SimpleUser implements User {}; class DefaultRecord implements Record {}; class Suffixed implements Name {}; class Validated implements Content {};
方法名称
方法可以返回“ something ”或返回“ void ”。如果一个方法返回某些内容,那么它的名称应该解释将返回什么。例如(不要使用“ get ”前缀): boolean isValid(String name); String content(); int ageOf(File file); 如果返回“ void ”,则名称应该阐明该方法的作用。例如: void save(File file); void process(Work work); void append(File file, String line); 此规则只有一个例外 - JUnit测试方法。它们的描述如下。
测试方法名称
JUnit 测试中的方法名称必须构造为不带空格的英文句子。用一个例子更容易解释这一点: /** * HttpRequest can return its content in Unicode. * @throws Exception If test fails */ public void returnsItsContentInUnicode() throws Exception { } JavaDoc 的第一句话以您正在测试的类的名称开头,后跟“ can ”,这一点很重要。 所以,第一句话应该总是像“某人可以做某事”这样的短语。方法名称将说明相同的内容,但没有测试主题。如果我将其添加到方法名称的开头,我会得到一个完整的英文句子,如上面的示例所示:“ HttpRequest returns its content in unicode ”。请注意,测试方法名称不以“ can ”开头。只有 JavaDoc 注释以“ can ”开头。另外,方法名不应该以动词开头( 译者:显然,作者指的是动词的祈使语气)。声明测试方法时指示抛出异常是一种很好的做法。
变量名称
避免使用复合变量名称,例如 timeOfDayfirstItemhttpRequest。我的意思是类变量和方法变量。变量名称应该足够长,以避免其范围出现歧义,但如果可能的话也不要太长。该名称必须是单数或复数名词。例如: 有时,如果构造函数将输入数据存储到创建的对象中,构造函数参数和类字段之间可能会发生冲突。在这种情况下,我建议通过删除元音来创建缩写。示例: 在大多数情况下,最好的变量名称是相应类的名称。只需将其大写即可: 但是,切勿对像or 这样的原始类型执行相同的操作。当有多个具有不同特征的变量时,您也可以使用形容词。例如: List names; void sendThroughProxy(File file, Protocol proto); private File content; public HttpRequest request; public class Message { private String recipient; public Message(String rcpt) { this.recipient = rcpt; } } File file; User user; Branch branch; Integer number String string String contact(String left, String right);
构造函数
无一例外,应该只有一个构造函数将数据存储到对象变量中。所有其他构造函数必须使用不同的参数调用此构造函数: public class Server { private String address; public Server(String uri) { this.address = uri; } public Server(URI uri) { this(uri.toString()); } }
一次性变量
不惜一切代价避免一次性变量。我所说的“一次性”是指一次性使用的变量。就像这个例子一样: String name = "data.txt"; return new File(name); 变量只使用一次,代码可以简化为: return new File("data.txt"); 有时,在极少数情况下 - 主要是由于更好的格式 - 可以使用一次性变量。但是,请尽量避免此类情况。
例外情况。
当然,你永远不应该“吞掉”异常;它们应该被抛出得尽可能高。私有方法的异常必须在外部处理。切勿使用异常来控制流程。示例中的代码不正确: int size; try { size = this.fileSize(); } catch (IOException ex) { size = 0; } 说真的,如果 IOException 说“磁盘已满”,您会假设文件大小为零并继续吗?
缩进。
对于缩进,一般规则是括号必须结束行或在同一行结束(相反的规则适用于右括号)。在下面的示例中,代码不正确,因为第一个括号未在同一行结束并且后面有字符。第二个括号也有同样的问题,因为它前面有字符,并且当前行没有左括号。 final File file = new File(directory, "file.txt"); 正确的缩进应如下所示: StringUtils.join( Arrays.asList( "first line", "second line", StringUtils.join( Arrays.asList("a", "b") ) ), "separator" ); 缩进的第二个重要规则是应在一行上放置尽可能多的内容 - 80 个字符以内。上面的例子是无效的,因为它可以被压缩: StringUtils.join( Arrays.asList( "first line", "second line", StringUtils.join(Arrays.asList("a", "b")) ), "separator" );
冗余常数。
当您想要在类方法之间共享对信息的访问时,应该使用类常量,并且此信息是您的类的特征( ! )。不要使用常量来替换字符串或数字文字 - 非常糟糕的做法,它会导致代码污染。常量(像其他 OOP 对象一样)必须在现实世界中有意义。这些常量在现实世界中的含义是什么: class Document { private static final String D_LETTER = "D"; // bad practice private static final String EXTENSION = ".doc"; // good practice } 另一个常见的错误是在单元测试中使用常量以避免在测试方法中重复字符串/数字文字。不要那样做!每个测试方法必须对其自己的一组输入值进行操作。在每个新的测试方法中使用新的文本和数字。测试是独立的。那么为什么它们应该共享相同的输入常量呢?
测试数据耦合。
以下是测试方法中挂钩的示例 User user = new User("Jeff"); // maybe some other code here MatcherAssert.assertThat(user.name(), Matchers.equalTo("Jeff")):在最后一行中,我们将“ Jeff ”与第一行中指定的相同字符串文字连接起来。如果几个月后,有人想要更改第三行中的值,他/她将不得不花费额外的时间搜索以查看此方法中还使用了“ Jeff ”。为了避免这种数据阻塞,您应该引入一个变量。
评论
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION