# 二、什么是整洁的代码

## 方法尽量短 && 职责单一

```/**
*
*/
public class GeneratePrimes {

/**
* @param maxValue is the generation limit.
* */
public static int[] generatePrimes(int maxValue) {
if (maxValue >= 2){ //the only valid case
//ddeclarations
int s = maxValue +1 ;// size of array
boolean[] f = new boolean[s];
int i;
//initialize array to true.
for ( i = 0;i < s;i++) {
f[i] = true;
}
f[0] = f[1] = false;
// sieve
int j;
for (i = 2;i < Math.sqrt(s) + 1; i++) {
if (f[i]) { // if i is uncrossed , cross its multiples.
for (j = 2 * i; j < s ;j += i) {
f[j] = false; //multiple is not prime
}
}
}

// how many primes are there?
int count = 0;
for (i = 0;i < s; i++) {
if (f[i]) {
count ++; //bump count.
}
}

int[] primes = new int[count];

//move the primes into the result
for (i = 0,j = 0;i < s;i++) {
if (f[i]) {
primes[j++] = i;
}
}
return primes;
}
else { //maxValue < 2
return new int[0]; // return null array if bad input.
}
}
}```

```public class PrimeGenerator {

private static boolean[] crossedOut;
private static int[] result;

public static int[] generatePrimes(int maxValue) {
if (maxValue < 2) {
return new int[0];
}
else {
uncrossIntegersUpTo(maxValue);
crossOutMultiples();
putUncrossedIntegersIntoResult();
return result;
}
}

private static void putUncrossedIntegersIntoResult() {
result = new int[numberOfUncrossedIntegers()];
for (int j = 0, i = 2; i < crossedOut.length; i++) {
if (notCrossed(i)) {
result[j++] = i;
}
}
}

private static int numberOfUncrossedIntegers() {
int count = 0;
for (int i = 2; i < crossedOut.length; i++) {
if (notCrossed(i)) {
count++;
}
}
return count;
}

private static void crossOutMultiples() {
int limit = determinuIterationLimit();
for (int i = 2;i <= limit; i++) {
if (notCrossed(i)) {
crossOutMultiplesOf(i);
}
}
}

private static void crossOutMultiplesOf(int i) {
for (int multiple = 2 * i; multiple < crossedOut.length; multiple +=i) {
crossedOut[multiple] = true;
}
}

private static boolean notCrossed(int i) {
return crossedOut[i] == false;
}

private static int determinuIterationLimit() {
double iterationLimit = Math.sqrt(crossedOut.length);
return (int)iterationLimit;
}

private static void uncrossIntegersUpTo(int maxValue) {
crossedOut = new boolean[maxValue+1];
for (int i = 2; i < crossedOut.length ; i++) {
crossedOut[i] = false;
}
}

}```

## 注释要体现代码之外的东西

### 可怕的废话

```/** The name. */
private String name;
/** The version. */
private String version;
/** The licenceName. */
private String licenceName;
/** The version. */
private String info;```

### 能用函数或变量时就别用注释

```// does the module from the globale list <mod> depend on the
// subsystem we are part of?
if (smodule.getDependSubsystems().contains(subSysMod.getSubSystem())```

```ArrayList moduleDependes = smodule.getDependSubsystems();
String ourSubSystem = subSysMod.getSubSystem();
if  (moduleDependes.contains(ourSubSystem))```

### 用代码来阐述

```// Check to see if the employee is eligible for full benefits
if ((employee.flags & HOURLY_FLAG) && (employee.age > 65))```

`if (employee.isEligibleForFullBenefits())`

## 名副其实的名字

• 去掉 Info 和 Data 这样的后缀：这些就像是英语中的 a/ an/ the 一样，是意义含糊的废话，废话都是冗余的..
• 不要给变量加前缀来标识：变量不需要一个 `m_` or 其他什么的前缀来标识这是一个变量..
• 思考是否有必要标识出变量的类型：我们标注出变量的类型的目的是什么？对于弱类型的语言，可能有时候还是必要的，因为我们有时候并不能从 `students` 这个变量中判明我应该怎样对这个变量进行操作，但是对于 Java 这样的强类型的语言，我们就需要根据实际的场景思考是否真有那么必要了。

## 无副作用

```public class UserValidator {
private Cryptographer cryptographer;

User user = UserGateway.findByName(userName);
if (user != User.NULL) {
String codedPhrase = user.getPhraseEncodedByPassrod();
String phrase = cryptographer.decrypt(codedPhrase, password);
Session.initialize();
return true;
}
}
return false;
}
}```

# 三、代码之外

## 每个人都能写出好的代码

• 好的代码是写出来的吗？（这可能有点类似于好的文章是写出来的吗？）
• 为什么我们写不出好的代码？

# 结尾

0 条评论

• ### 业务复杂=if else？刚来的大神竟然用策略+工厂彻底干掉了他们！

对于业务开发来说，业务逻辑的复杂是必然的，随着业务发展，需求只会越来越复杂，为了考虑到各种各样的情况，代码中不可避免的会出现很多if-else。

• ### 【JavaWeb基础】图书管理系统总结(修订版)

https://github.com/ZhongFuCheng3y/BookSystem

• ### 图书管理系统【总结】

感想 该项目是目前为止，我写过代码量最多的项目了.....虽然清楚是没有含金量的【跟着视频来写的】，但感觉自己也在进步中...... 写的过程中，出了不少的问题...

• ### VsCode为C++设置代码片段

https://code.visualstudio.com/docs/editor/userdefinedsnippets

• ### C++学习笔记 类型声明

类型别名 typedef关键字 typedef关键字是继承自C语言的特性，利用它我们可以为一个类型起别名，一般用于将复杂类型简化。举个简单的例子，将int类型定...

• ### Visual Studio 代码风格约束

注意，这里的错误是IDE1006:Naming rule violation，编译时依然能通过（没找到在哪里设置不允许通过编译）：

• ### 如何写出优雅的 Golang 代码

原文： https://draveness.me/golang-101.html

• ### 聊聊前端项目

做前端也不是很久，也没做过什么特别大型或者是特别复杂需要很多前端配合开发的项目，所以对于前端的架构我并没有一个清晰的认识。只是最近看着新公司的项目，实在有感而发...