编程真善美

命名风格:

驼峰命名法

小驼峰法

变量一般用小驼峰法标识。驼峰法的意思是:除第一个单词之外,其他单词首字母大写:camelCase

大驼峰法(即帕斯卡命名法)

相比小驼峰法,大驼峰法把第一个单词的首字母也大写了。常用于类名属性命名空间等:CamelCase

下划线命名法

单词间用下划线(_)分割 :underscope_case

编程切入点:

先制造核心发动机,不用忙着写主程序,每个方法要有文档:

例子:输入给定范围内的素数

package cn.edu.mju.dev;

import java.util.Scanner;

public class PrimeFinder {

    /**
     * main function
     * @param args
     */
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.println("start:");
        int begin, end, count = 0;
        long sum = 0;
        begin = scanner.nextInt();
        System.out.println("end:");
        end = scanner.nextInt();
        for(int i = begin; i <= end; i++){
            if(isPrime(i)) {
                count ++;
                sum += i;
                System.out.print("\t"+i);
                if(count % 10 == 0) System.out.println();
            }
        }
    }
    
    
    /**
     * 判断是否是质数
     * @param 带判定的数
     * @return
     * true 是质数
     * false 不是质数
     */
    private static boolean isPrime(int num) {
        // special case
        if(num <= 1)    return false;
        if(num == 2) return true;
        // general case
        int i;
        for(i = 2; i < num; i++) {
            if (num % i == 0) break;
        }
        return i == num;
    }
}

上例算法不够先进,我们需要进行代码的优化,只要判断待测数num能不能被2-待测数的平方根√num整除即可:

package cn.edu.mju.dev;

import java.util.Scanner;

public class PrimeFinder {

    /**
     * main function
     * @param args
     */
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.println("start:");
        int begin, end, count = 0;
        long sum = 0;
        begin = scanner.nextInt();
        System.out.println("end:");
        end = scanner.nextInt();
        for(int i = begin; i <= end; i++){
            if(isAdvPrime(i)) {
                count ++;
                sum += i;
                System.out.print("\t"+i);
                if(count % 10 == 0) System.out.println();
            }
        }
    }
    
    
    /**
     * 判断是否是质数
     * @param 带判定的数
     * @return
     * true 是质数
     * false 不是质数
     */
    private static boolean isPrime(int num) {
        // special case
        if(num<1)    return false;
        if(num == 2) return true;
        // general case
        int i;
        for(i = 2; i < num; i++) {
            if (num % i == 0) break;
        }
        return i == num;
    }
    
    /**
     * 判断是否是质数(大数据适应版)
     * @param 带判定的数
     * @return
     * true 是质数
     * false 不是质数
     */
    private static boolean isAdvPrime(int num) {
        // special case
        if(num <= 1)    return false;
        if(num == 2) return true;
        // general case
        int i;
        int sqrt = (int)Math.sqrt(num);
        for(i = 2; i <= sqrt; i++) {
            if (num % i == 0) break;
        }
        return i == sqrt + 1;
    }
}

总结:

  1. 测试驱动的开发:(Test-Driven-Development)
  2. 模块化开发
  3. 技术沉淀