你的位置:首页 > ASP.net教程

[ASP.net教程]程序员的基础和解决问题的思维很重要


为什么今天突然想说这个话题,那是因为在工作当中,被队友坑过。同样的一个功能,你让不同的人去实现,可能会有不同的实现方式,同样,就会得到不一样的结果。有些人做出来性能好,代码精简,可读性好,易于维护等,有些人写的代码不独代码凌乱堪,更能让服务器崩溃。程序员的基础和思维很重要,解决问题的思维,要多思考,而不能只考虑完成功能,其它就啥都不管了,说得严重点,给人条活路好么?人都是爹妈生的!

1、我先列一个最最简单的基础编程题,我完全相信我现在的公司中有人(虽然工作几年了...)会给我一个错误的答案

int a = 5;int b = a++ + (++a) * 2 + ++a;Console.WriteLine(a);Console.WriteLine(b);

解:5+ a=a+1 a=a+1 a=7 a=a+1=5 +7*2+8;
注意优先顺序,从左至右,一元运算符高于二元运算符
答案是:
8
27
如果你口算不出来,请复习下这一块的基础知识,补一补。
算运运算符 ++ --++;分为前++和后++,不管是前++还是后++,最终的结果都是这个变量的值自身加1.区别:如果在一个表达式中遇到了++运算符,如果是前++,则首先这个变量的值自身加一,然后拿着这个加一后的值去参与运算。如果是后++,则首先拿原值参与运算,运算完成后,自身再加一。
这里只是举个例子,现实中看到了类似的代码,我呢个去,我费了好大劲........这是要考验我的理解能力和基础能力还是要显示得你牛逼呢?所以啊,还是要自我修炼,才能无论别人怎么坑我,我都能有办法应付哇
2、再来看一道基础题,控制台输入一个成绩,如果 成绩>=90 :输出A,如果90>成绩>=80 输出B,如果80>成绩>=70 输出C ,如果70>成绩>=60 输出D,如果 成绩<60输出E
(考虑用if好还是用if-else好还是if else if好,思考,为什么好?)
代码如下:
      Console.WriteLine("请输入你的考试成绩");      int score = Convert.ToInt32(Console.ReadLine());

if else 的做法
      #region if -else的做法      if (score >= 90)      {        Console.WriteLine("A");      }      else//<90      {        if (score >= 80)        {          Console.WriteLine("B");        }        else//<80        {          if (score >= 70)          {            Console.WriteLine("C");          }          else//<70          {            if (score >= 60)            {              Console.WriteLine("D");            }            else            {              Console.WriteLine("E");            }          }        }      }       #endregion

 if的做法
 #region if的做法      if (score >= 90)      {        Console.WriteLine("A");      }      if (score >= 80)      {        Console.WriteLine("B");      }      if (score >= 70)      {        Console.WriteLine("C");      }      if (score >= 60)      {        Console.WriteLine("D");      }      if (score < 60)      {        Console.WriteLine("E");      }       #endregion

if else if的做法
  #region if else if的做法      if (score >= 90)      {        Console.WriteLine("A");      }      else if (score >= 80)      {        Console.WriteLine("B");      }      else if (score >= 70)      {        Console.WriteLine("C");      }      else if (score >= 60)      {        Console.WriteLine("D");      }       #endregion

请比对下这三种实现方式有什么不同,哪一种好,为什么?我在工作中,经常会看到一些程序员乱用if else,明明可以有更好的实现方式。

分支结构:if结构  if-else结构
选择结构:if else-if

3、使用一个同步程序或者定时任务计划来往Ftp服务器上面拋送订单报文,然后获取Ftp服务器上面的回执报文

公司程序是这样写的:

1、从数据库中查询需要拋送的订单

2、在服务器上面生成订单报文并存在一个文件夹下面

3、然后使用Ftp上传这些订单报文,已经上传成功的就修改这个报文名称(后面+_1)

4、上传完报文后,然后根据这些报文名称就去Ftp服务器上面下载回执报文,又存到一个文件夹里面

5、再读取这个文件夹里面的回执文件,已经读取过的,就把回执文件改名

.......

我真心说不下去了,第一次看到的时候,我就觉得写这代码的人应该抓去牢房里关着,不要放出来

结果程序跑了一个月,服务器奔溃了,我上服务器上面删报文文件删除了2个小时,几十个G,然后看下程序代码,一千万匹草泥马奔腾而过,然后安排人重写代码...

我到现在都想不明白,程序为什么要这样写?即便你要生成订单报文,你按年、月、日生成报文文件,处理完成之后,把报文文件移动到特定目录下面,总比你改名快吧,然后定期把一个月前的交易记录删除(不要就直接删除)或者压缩包(要的话就压缩备份),怎么就不想一下一个月,这个文件夹下面会有几十万个文件呢,这是典型要干死服务器的节奏啊。至于根据文件名去下载Ftp上面的回执文件,也不需要再从这个文件夹里面遍历出所有_1的文件名,再去下载,这多慢啊,何不记录在redis里面或者memory存储类型的mysql数据表中呢?还有生成交易报文,上传交易报文,取交易报文回执都是在同一个线程里面的,为什么不使用多个人定时任务计划,多个进程呢?我一直想不明白.........

不过海关的技术人人员也真是奇葩,订单报文居然用

 4、foreach或者for循环中,N次更新、插入、删除数据库操作

我很好奇,为什么在循环里面要进行一次数据库连接、然后执行数据库操作,然后关闭连接,为什么不把需要进行数据库操作的内容保存在一个集合里面,最后一次性去执行Sql操作,让循环里面只进行一次打开、执行、关闭操作呢?人家ORM框架里面都有了批处理操作....

我在项目中看见很多地方,批量导入,批量更新回执状态的时候,经常看见这样的C#代码,抓狂,想把写代码的人拉去吊着打...........

5、系统后台,是一个完整的界面,也就是说,无论你点击啥,整个界面刷新,对就是整个界面刷新,刷新还要每次从session里面读出html把菜单重新加载一遍,我第一次看到,眼睛就被刷瞎了.......然后左侧菜单栏,为了保持记录选中状态,然后各种js+cookies就出来了,几百户js穿插,我艹,当时想重构的心都没有,就想重写(可是谁给我时间?烂摊子一个...),还有那奇葩的资源角色权限管理,居然是半自动的,市面上面早就是全自动了,什么是半自动,就是后台界面配置了,代码里面还要去修改,而且还是硬编码,我真的是长见识了,随便从网上乱下载一个源码也不至于这样啊!至于为什么能做出这样的项目,我不想说话。最后客户终于忍受不了,要求改,我就安排一个同事改了,用最简单的方式弄个frameset,然后把那几百行户js删除,终于只刷新中间部分了,唉!记得当时美工给我的(我当时做财务系统http://www.cnblogs.com/jiekzou/p/4508392.html)和给这个项目开发者的是同一个界面,可做出来后就是天壤之别了....

省略一万字,这些都是最最基本的东西,为什么一些工作几年了的程序员会犯这样的错误,估计是懒得思考吧,程序员是要学会偷懒,但是要勤于思考.....