首页 > 代码库 > 细节带来好的代码
细节带来好的代码
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,改到这一步,差不多可以了。