首页 > 代码库 > 细节带来好的代码

细节带来好的代码

1、什么是好的代码?

从工作角度上看,我觉得就是能用的代码,适用的代码,通用的代码。比如来说,一段的代码把功能实现了,这个是能用的代码。但是呢,代码可能中间还是有一些偏差,比如界面上数据显示很粗糙,运行速度不够快。所以写完能用的代码后,我们会再修改,修改,显示数据优化下,优化线程,优化内存管理。好的,再看一看,功能看起来还不错,心满意足了,这个是适用的代码。某一天我们把这个程序搬到另一个平台上面,哇哦,我们发现问题了,代码出现毛病了,怎么办,我们只好打开源码,再修改,修改,针对不兼容的部分做修改(html+js开发上尤为突出,android平台也会出现,但是有时候隐藏得比较深,需要专门的测试才能找得出来),终于这个程序在大部分平台上都可以运行了(为什么不是在所有的平台上都能运行,别扯了!不太可能)。好的,这一段代码我们称之为通用的代码。

2、怎么写好的代码?

如果不从框架上去考虑(其实我也想从框架上考虑,无奈码农级别,不敢扯那个东西),单纯从功能实现上考虑,细节是最重要的。上一段落,提到android不兼容的部分,有时候需要专门的测试才能找得出来,为什么这么说,细节,测试在检查功能的时候会比开发更注重细节。比如,做android平台上的某一即时通讯应用的时候,我们做的一个消息显示的板块,在大部分手机上测试都未出现问题,我们以为这个功能应该是没什么问题了,后来还是反馈出bug了,在魅族手机上出现问题,当内容太多且有分隔符时,消息显示全部为空格。所以细节很重要,尽量想到别人想不到的地方。

3、细节可以锻炼么?

细节怎么锻炼么,个人觉得可以(觉得扯的,莫往下看)。细节从何而来,天生是一部分,然后接着就是思维方式(这个需要多总结,每个人都有自己的方式,写博客也是一种),还有一种最笨的方式,也是最有效的方式,多做。做多了,自然就细心了,一个错误,你可以连犯三次,但是第四次呢,第五次,如果你连犯十次的话,好吧,只能说,你不只软件不适合干,别的活估计也难。

4、简单示例

一个android的功能,绘制虚线。

在drawable下添加dotted_line.xml,代码为:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="line" >
    <!--显示一条虚线,破折线的宽度为dashWith,破折线之间的空隙的宽度为dashGap,当dashGap=0dp时,为实线 -->
    <stroke
        android:dashGap="3dp"
        android:dashWidth="6dp"
        android:width="1dp"
        android:color="#63a219" />
	<!-- 虚线的高度 -->
    <size android:height="1dp" />
</shape>

把LinearLayout的背景设置为设置为dotted_line.xml

 <!-- 虚线1 -->
   	<LinearLayout 
	    android:layout_width="fill_parent"
	    android:layout_height="2dp"
	    android:background="@drawable/dotted_line"
	    android:layout_marginLeft="10dp"
	    android:layout_marginRight="10dp"/>

这样就结束了么,我们拿起手机看一下,2.3系统下可以用,再看4.0下,都是一条条的实线。怎么解决呢,查看文档后,我们发现只需要把AndroidManifest.xml中的application下添加android:hardwareAccelerated="false"就可以了。、

好了,我们再运行看一下,嗯嗯,可以用了,但是android:hardwareAccelerated在android3.0之后才有支持,怎么办?自己写一个空间或许能够解决。

package com.anyfish.face.view;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.DashPathEffect;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.PathEffect;
import android.graphics.Rect;
import android.util.AttributeSet;
import android.view.View;

/**
 * @author LYH
 *
 */
public class DashedLine extends View {
    private final String namespace = "http://com.smartmap.driverbook";
    private float startX;
    private float startY;
    private float endX;
    private float endY;
    private Rect mRect;
  
    public DashedLine(Context context, AttributeSet attrs) {
        super(context, attrs);          
        
    }

    @Override
    protected void onDraw(Canvas canvas) {
        // TODO Auto-generated method stub
        super.onDraw(canvas);        
        Paint paint = new Paint();
        paint.setStyle(Paint.Style.STROKE);
        paint.setColor(Color.DKGRAY);
        Path path = new Path();     
        path.moveTo(0, 10);
        path.lineTo(480,10);      
        PathEffect effects = new DashPathEffect(new float[]{5,5,5,5},1);
        paint.setPathEffect(effects);
        canvas.drawPath(path, paint);
    }
}

在要绘制虚线的地方添加上这么一个控件

<com.anyfish.face.view.DashedLine
                                android:layout_width="fill_parent"
                                android:layout_height="10dip"
                                 />

再看一下,是否可以了,嗯,是有效果了,但是换个屏幕分辨率比较大的手机再试试,还是出现问题了,虚线不够长!!!怎么办,再改改吧,改成屏幕自适应的。

package com.anyfish.face.view;

import com.anyfish.face.R;
import com.anyfish.util.utils.Utils;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.DashPathEffect;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.PathEffect;
import android.graphics.Rect;
import android.util.AttributeSet;
import android.view.View;

/**
 * @author LYH
 *
 */
public class DashedLine extends View {
	private float density;
	private Paint paint;
	private Path path;
	private PathEffect effects;

	public DashedLine(Context context)
	{
	    super(context);
	    init(context);
	}

	public DashedLine(Context context, AttributeSet attrs)
	{
	    super(context, attrs);
	    init(context);
	}

	public DashedLine(Context context, AttributeSet attrs, int defStyle)
	{
	    super(context, attrs, defStyle);
	    init(context);
	}

	private void init(Context context)
	{
	    density = Utils.getScreenDensity(context);
	    paint = new Paint();
	    paint.setStyle(Paint.Style.STROKE);
	    paint.setStrokeWidth(density * 4);
	    //set your own color
	    paint.setColor(context.getResources().getColor(R.color.text_diver));
	    path = new Path();
	    //array is ON and OFF distances in px (4px line then 2px space)
	    effects = new DashPathEffect(new float[] { 5, 5, 5, 5 }, 0);

	}

	@Override
	protected void onDraw(Canvas canvas)
	{
	    // TODO Auto-generated method stub
	    super.onDraw(canvas);
	    paint.setPathEffect(effects);
	    int measuredHeight = getMeasuredHeight();
	    int measuredWidth = getMeasuredWidth();
	    if (measuredHeight <= measuredWidth)
	    {
	        // horizontal
	        path.moveTo(0, 0);
	        path.lineTo(measuredWidth, 0);
	        canvas.drawPath(path, paint);
	    }
	    else
	    {
	        // vertical
	        path.moveTo(0, 0);
	        path.lineTo(0, measuredHeight);
	        canvas.drawPath(path, paint);
	    }
	}
}

ok,改到这一步,差不多可以了。