情有千千劫,有感于程序编码的质量(一)
代码的编写就和我们写文章一样,良好的规范和习惯可以使我们的代码写出来特别的优雅,加强机器的执行效率.一般来说,真正好的代码让人看起来非常清爽,而不是晦涩难懂,杂乱无章的”天书”。所以不管在什么情况下,思想,正是因为它,主宰这世界上的一切,当然,我们的代码也不例外。正如你是如何看待世界,就如同世界如何看待你。思想的精髓也在于此。我们写代码之前,切记一定要三思而后行,之所以站得高才能看得远嘛!好的,让我们看一下这些代码。可能这些都是平常你我所构建出来的。文中的语言会使用C# 和Java,因为JDK和.net FrameWork中的库函数很少,而这两门又是当下比较流行的两门语言,所以我们把这两门语言结合一起来看.
1.逻辑
(1)判断数组里面的值的逻辑。(C# 版)
//*****************************************************
bool isEqual = false;
int []a = new int[]{0,1,2,3,4,5,6,7,8,9};
for(int i=0;i<a.Lenght;i++)
{
if(a[i]>5)
isEqual = true;
}
//*****************************************************
问题:
当找到第一个值,程序的循环并没有退出。要知道计算机在背后做出了很多事情,我们需找出它正在做些什么事。循环——往往是消耗资源的最终杀手,在我看来有,提高程序的效率至少有百分之九十的改进是需要改进循环。
解决方案:
*在isEqual = true后添加break语句,退出循环。
*使用goto语句,模拟break语句,但不推荐使用。(java里面同const关键字一样,只保其作为的关键字,而实际上却是不可用,所以此方法在java里面不可用),
*将for循环改为while循环.
For循环改while循环(java):
//*****************************************************
public static void main(String[] args) {
boolean isEqual = false;
int[] a = new int[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
int i = 0;
while(!isEqual || i<a.length){
i++;
if (a[i] > 5)
isEqual = true;
}
System.out.println(i);
}
//*****************************************************
输出结果: 6
本应该循环六次做完的事,在之前的那个循环做了十次.而我们需要判断的结果却是一样的.
(2)永远不要使用异常机制来中断循环.
来看一下这个函数.(java)
//*****************************************************
public static void main(String[] args) {
boolean isEqual = false;
int[] a = new int[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
int i = 0;
while (!isEqual ) {
i++;
try{
if (a[i] > 12)
isEqual = true;
}
catch(Exception ex){
break;
}
}
System.out.println(i);
}
//*****************************************************
在这里这个函数的作者很自作聪明的想用异常机制来中断循环,其实不知道,其性能在里面大打折扣,要知道异常机制用在循环里面性能极为低下,一般来说,用比不用要慢90倍左右.
(3)不要对函数形参进行判断.
这里所指的不要,是指看情况的.一般来说,面对用户级的都需要进行判断,而对于代码编写者一般就不需要.当然如果你是要写一个发布的库,就当别论了.来看一下这两个函数.(java)
//*****************************************************
public static void main(String[] args) {
int[] a = new int[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
int[] b = new int[] { 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 };
List<int[]> list = new LinkedList<int[]>();
list.add(a);
list.add(b);
for (int i = 0; i < list.size(); i++) {
checkValue(list.get(i));
}
}
private static boolean checkValue(int[] a) {
boolean isEqual = false;
int i = 0;
if(a!=null){
while (!isEqual || i < a.length) {
i++;
if (i > 5)
isEqual = true;
}
}
return isEqual;
}
//*****************************************************
这里并没有要要用户输入几个数来生成一个数组.再加一个if(a!=null)有点”多此一举,画蛇添足”.因为是此代码是程序级的,对形参的判断看是什么情况,当然程序如果是公开的库,还是需要对形参进行一定的判断的,总的来说,形参在程序里面能不判断还是不要判断的为好.(C#)
//*****************************************************
class TestLoop
{
public static void Main ()
{
int num = Console.Read();
int[] testArray = new int [100];
for (int i = 0; i < 100; i++)
{
if (num < 10)
testArray[i] = 100;
else
testArray[i] = 1000;
}
}
}
//*****************************************************
这是一个再平常不过的例子,只是跟据用户输入的数来判断把这个数组如何赋值.可读性比较高.很多初学者应该都会这样写吧.而我却会这样写,可读性可能下降一些,但是效率可能会高很多.
//*****************************************************
class TestLoop
{
public static void Main ()
{
int num = Console.Read();
int[] testArray = new int [100];
if (num < 10)
{
for (int i = 0; i < 100; i++)
{
testArray[i] = 100;
}
}
else
{
for (int i = 0; i < 100; i++)
{
testArray[i] = 1000;
}
}
}
}
//*****************************************************
别告诉我你不知道这样写的好处啊,呵呵,注意if语句是在循环外边.只要判断一次,而上一个却要判断100次.
未完,待续…………………………………………………………