注意编码工作中的小细节

人们常说“细节决定成败”。

编码工作中,同样需要关注细节。

本文将给出3个小实例来说明编码中关注细节的重要性,同时给出作者对如何注意编码细节的一点见解(说的不对,请指正)。

例1 这个问题如此地显而易见,竟然没有被发现。

List<int> numList = new List<int>();
numList.Add(3);
numList.Add(1);
numList.Add(4);
numList.Add(2);
numList.Add(5);
numList.OrderBy(it => it).ToList();
foreach (int i in numList)
{
       Console.WriteLine(i);
}

在阅读项目代码时,发现了一段类似于例1的代码。代码的本意是想对集合numList排序并将排序后的集合元素一一输出,但实际情况是numList调用OrderBy方法进行排序后却没有将排序的结果赋值给任何对象,而是直接遍历源集合numList输出其中元素,这样做显然得到的不是最初想要的,因为输出的仍是排序前的集合中元素。猜想当时编码者写出这样的代码,主要是因为编码者误认为调用OrderBy方法对集合排序后会将排序结果保存在被排序的集合中,而事实却不是这样。这个小错误应该是显而易见的,但是当时竟然没有被人发现,还是后来出现了BUG才发现了这个编码问题,还好,BUG及时修复了没造成太大的问题,不然就等着哭吧。列举此实例是想告诉大家:不注意细节会让我们的代码危机四伏。而犯一些低级错误正是不注意细节的最初级表现。少犯低级错误是关注细节的良好开端。

例2 当时要是考虑得再多一点,问题也就不会出现了。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace NoticeDetailExp4
{
    class Program
    {
        static void Main(string[] args)
        {
            //这里的left、top、width、height被写死了,实际情形中是通过某种计算产生的
            double width = 1.5;
            double height = 1.5;
            double left = 0;
            double top = 0;
            if (width != 0 && height != 0)
            {
                Rectangle r = ExampleMethod(left, top, width, height);
            }
        }

        public static Rectangle ExampleMethod(double left, double top, double width, double height)
        {
            return new Rectangle(left, top, width, height);
        }
    }

    public class Rectangle
    {
        private double left;
        public double top;
        public double width;
        public double height;
        public Rectangle(double left, double top, double width, double height)
        {
            if (width <= 0 || height <= 0)
            {
                throw new InvalidOperationException();
            }
            this.left = left;
            this.top = top;
            this.width = width;
            this.height = height;
        }
    }
}

本例中定义了矩形类Rectangle,Rectangle类的构造函数接收四个参数left,top,width,height来生成Rectangle对象,在生成Rectangle对象时会对输入参数width、height进行校验,当二者中有一个小于等于0时便会抛出无效操作的异常(矩形的长度和高度必须大于0)。再看Rectangle类的实例化代码,调用Rectangle类的构造函数进行实例化前,先对width和height的值进行校验,当width与height的值都不等于0时就调用Rectangle类的实例化方法。这样一来,问题就来了,Rectangle构造函数中要求的width与height的值必须大于0,而在类的实例化前,我们判断width、height值是否合法的条件却是width、height值不等于0,这样一来当我们传入负值时便同样会导致无效操作的异常。当时编码者在实例化Rectangle类时可谓是信心满满地认为width、height值是不会小于0 的,但是不幸的事还是发生了,在某种极端条件下这里的width、height的值小于0了,自然而然出现了BUG。这个例子说明:有些时候我们过于相信自己的判断其实也是忽略细节的另一种表现,要想编码工作尽量趋于完美,我们就应该尽量想得远一点,对于某种解决方案只要有更保险的解决办法时,我们还是应该采用更保险的解决方案。

例3 找个最好的实现方案,感觉真的很美好

using System;
using System.Collections.Generic;
using System.Linq;

namespace NoticeDetailExp2
{
    class Program
    {
        static void Main(string[] args)
        {
            List<Work> WorkList = new List<Work>();
            WorkList.Add(new Work() { Name = "Work1", StartDate = new DateTime(2013, 12, 7), EndDate = new DateTime(2013, 12, 9) });
            WorkList.Add(new Work() { Name = "Work2", StartDate = new DateTime(2013, 12, 4), EndDate = new DateTime(2013, 12, 7) });
            WorkList.Add(new Work() { Name = "Work3", StartDate = new DateTime(2013, 12, 7), EndDate = new DateTime(2013, 12, 14) });
            WorkList.Add(new Work() { Name = "Work4", StartDate = new DateTime(2013, 12, 5), EndDate = new DateTime(2013, 12, 14) });
            WorkList.Add(new Work() { Name = "Work5", StartDate = new DateTime(2013, 12, 4), EndDate = new DateTime(2013, 12, 5) });
            WorkList.Add(new Work() { Name = "Work6", StartDate = new DateTime(2013, 12, 13), EndDate = new DateTime(2013, 12, 14) });
            DateTime dt1 = new DateTime(2013, 12, 6);
            DateTime dt2 = new DateTime(2013, 12, 12);
            var needList = WorkList.Where(it => !(it.StartDate > dt2 || it.EndDate < dt1));
            foreach (var work in needList)
            {
                Console.WriteLine(work.Name + "," + work.StartDate + "," + work.EndDate);
            }
        }

        public class Work
        {
            public string Name { get; set; }
            public DateTime StartDate { get; set; }
            public DateTime EndDate { get; set; }
        }
    }
}

实例3主要是想实现:筛选出WorkList中满足条件的作业。条件是:作业时间与给定的时间区间[dt1,dt2]存在交集(具体见下图所示)。

图中的红色线条代表给定的时间区间[dt1,dt2],(1)-(6)代表所有类型的作业(按照时间跨度区分的作业),很显然图中的(1)、(2)、(3)、(4)的作业满足条件应该被筛选出,而剩下的(5)、(6)应该被排除在外。那这个筛选条件用代码该怎样实现呢,至少有两种实现方法。

方案1:

            var needList = WorkList.Where(it =>
                (it.StartDate < dt1 && it.EndDate > dt1)     //(1)
                || (it.StartDate > dt1 && it.EndDate < dt2)  //(2)
                || (it.StartDate > dt1 && it.EndDate > dt2)  //(3)
                || (it.StartDate < dt1 && it.EndDate > dt2));//(4)

方案2:

var needList = WorkList.Where(it => !(it.StartDate > dt2 || it.EndDate < dt1));

本例中采用方案2,方案2是先找到(5)、(6)类作业,再将(5)、(6)类作业从集合中排除。而方案1则是直接从集合中找出(1)、(2)、(3)、(4)类作业。采用方案1写出的条件表达式较复杂,稍不注意便会出错,而采用方案2的代码简单而同样不难理解,综合考虑,选择了方案2。例3主要是想告诉大家:其实每个问题往往都有很多种解决方案,选择一个最好的方案,同样是注意细节的一种表现。

好了,本文列举了3个实例说明了编码过程中注意细节的重要性,并得出了自己的一点看法:关注细节,首先不要犯一些低级错误,其次就是要尽量考虑远一点(预知风险),最后就是能够选择最优的解决方案。

注意编码工作中的小细节,布布扣,bubuko.com

时间: 2024-10-25 05:07:51

注意编码工作中的小细节的相关文章

Java中的小细节

1.访问权限 1.private 只有本类才能被访问 2.default(默认)只有本包中才能被访问 3.protected只有子类和本包才能被访问,可以跨包. 4.public 可以在所有类中被访问 2.Java命名规范 1.类.所有单词首字母大写 2.方法.第一个单词的首字母小写 3.属性.第一个单词的首字母小写 4.包名.所有单词小写 5.常量.所有单词的字母大写.final定义的 Java中的小细节,码迷,mamicode.com

装修中的小细节和冷知识

一般在装修完以后都会都会发现很多小毛病和不足之处,这是因为什么呢,就是因为很多小细节没有注意到,可别小看这些小细节有时候却能起到很大的作用,那下面我给大家说一些在装修中的冷知识,看完记得收藏. 1.玄关的收纳很重要,全家人的鞋子加在一起数量多,需要大的鞋柜才能装得下,我们可以利用墙面空间全部打上柜子,这样收纳空间要比买的多,也更加实用. 2.客厅插座要留足,电视墙要留足五个插座,3孔和2孔插座都要有,沙发墙可以做两个usb插座,方便给手机充电,要是留少了就会发现日后要接拖线板,危险不说更大大的影

关于if语句中的小细节

if语句都会用,但是有一些小细节并不容易被发现. 比如我们不应该写这样的代码: if(flag==0) flag为布尔变量,布尔变量的值为真或假,用0表示假,真是多少是不一样的. 所以我们应该避免将布尔变量与0或1这样的整型值进行比较. 那么我们也不应该写这样的代码: if(i) i为一个整型变量,但是写成上面那样就会被人误以为是布尔值,良好的编程习惯是这样的: if(i==0)或if(i!=0) 还有重要的一点是,我们不能将float型和double型数据与0这种整型变量进行==或!=. 因为

工作中的小发现

1.又到了周五.今天有点忙,现在才做完需求,不是有多难,而是启动项目时间花掉了很多. 1.更改之前的习惯: 采用预编译写sql,这是我工作中的虎哥提醒了我,预编译是sql的安全编写方式,预防注入攻击.再也不要写sql+变量了. 2.使用JPA写法.底层也是StringBuilder的拼接.但是提供了多单表的增删该查 3.easyui和js代码. 结合使用,观看性强,更有成就感. 4.代码避免多层循环,用更简洁的方式编写代码. 5.劳逸结合,任务是做不完的. 但需求永无止境. 原文地址:https

工作中的小零碎

with item(USERID,USERNAME,PASSWORD,BANKNAME,BANKCODE,ORDERNUMBER,ISVALID,SUPERVISECODE,USERTYPE,GROUPID,ISREPORT,PARENTCODE,ISUNITE,BANKTYPE)    as (    select * from m_reportuser  where  bankcode='F031H101310101001' and usertype='0'    union all    

关于 JavaScript 中一个小细节问题 (在控制台中直接 {} 对象报错问题)

在 Chrome 浏览器,大家可能遇到这样一个小问题. 随便输入一个 Object 对象  ,比如 {Name:'王尼玛',Age:20} ,将会报错.之前,也从来没去考虑过到底是为啥原因. 今天,刚好看到博客园有博友文章,顺便记录一下. 在 JavaScript 中, : 有三种作用,想必大家都知道,其一  三元表达式  true? A:B,其二 在 switch case 中 case 语句中会用到,其三 就是上图中,对象直接量表达式中. 其实 ,在 JS 中,: 还有一种用法,如下所示,内

QT中的小细节

一 .  QT4和QT5的区别(信号和槽):1.  QT4: connect(button,SIGNAL(pressed()),this,SLOT(close())); /** * 优点 :写法简单 * 缺点: SIGNAL(), SLOT()是两个宏,将函数转换为字符串 * 编译时不做错误检查,影响程序的健壮性 */ 2.  QT5 connect(button,&QPushButton::clicked,this,&Widget::close); /** * sender: 信号发出者

不要忽视Web编程中的小细节

概述:长时间以来,我们创造了某些在构造和范围内用以提升网站易用性的约定和实践.然后在我们进行web编程的时候总有一些疏忽和纰漏.这里总结了一些web编程时容易出现的小错误,并给出了相应的补救方法,希望可以帮助提高网站的可用性.只要避免下列这些错误,网站的用户体验度就会大大提升. 错误一: 表单标签没有与相应字段相关联 利用 "for" 属性,使客户可以通过点击标签在表格内选择正确的输入字段.这对于复选框和单选字段来说就是要有更大的可点击区域. 错误二: Logo图表没有链接到主页 给l

Python正则表达式使用过程中的小细节

今天用Python写了个简单的爬虫程序,抓取虎扑篮球(nba.hupu.com)的首页内容,代码如下: 1 #coding:gb2312 2 import urllib2, re 3 webpage = urllib2.urlopen('http://nba.hupu.com') 4 text = webpage.read() 5 m = re.search('<a href=(.*) (.*)?>彩票</a>', text) 6 print m.group(1) 按照预想应该输出