代码改变世界

希望有一天变成口语编程

  在路上。。。  阅读(2515)  评论(29编辑  收藏  举报

一大早的头晕,迷迷糊糊,就此发一篇口水文吧!仔细看看代码也许对你会有收获,程序员总是容易迷失在小小的圈子

机器语言:最原始的控制计算机的语言。基本的语言是0和1。当时,表示0和1的最好模式是穿孔卡片和穿孔纸带,穿孔使光通过表示连接。

汇编语言:是软件设计的最初期语言。汇编语言的特点是直接与机器的CPU、计算机的基本输出输入控制系统大交道。大量直接调用计算机中断,直接使用CPU中的寄存器。控制计算机的效率特别高。

高级语言:是WINDOWS之前和初期的语言规范,高级语言是相对之前的低级语言汇编和机器语言而言。高级语言描述的层次是软件的模块、结构、内存管理。当时,结构化编程是当时先进的软件设计思想。代表的计算机语言是C、PASCAL等。指针、位移、驻留程序、扩展内存为当时的编程高手所津津乐道。面向对象是“紧贴”高级软件语言的模型体系,用于软件开发期间,而不是运行期间,其描述的层次是在软件的组件、对象一级。这是的常用术语是对象、类、包、控件、所见即所得等。统一建模语言(UML)是这一阶段的语言规范的代表,RUP是这一语言规则下产生的工具。

每一次语言的升级都是一次生产力的解放,不行的话看看下面的代码也许恍然大悟:

小小的计算器也许是除了helloworld之外的另一个经典例子呵呵:

别小瞧这么麻烦,因为他人类和computer交流的时候最起码不用拿穿孔卡片和穿孔纸带了:

园子里面对这个感兴趣的应该没.NET的多呵呵,那就.NET吧!

从面向过程开始吧:

private void btnOk_Click(object sender, EventArgs e)
     {
         int operandNum = Convert.ToInt32(this.txtOperandNum.Text.Trim());
         int isOperandNum = Convert.ToInt32(this.txtIsOperandNum.Text.Trim());
         string oper =this.cmbOper.SelectedItem.ToString();
         int result=default(int);
 
         switch (oper)
         {
             case "+": result = operandNum + isOperandNum; break;
             case "-": result = operandNum - isOperandNum; break;
             case "*": result = operandNum * isOperandNum; break;
             case "/": result = operandNum / isOperandNum; break;
             default:
                 MessageBox.Show("不支持您输入的操作!");
                 break;
         }
 
         this.txtResult.Text = result.ToString();
     }

  是不是觉得很简单,上学那会儿应该经常这么干 呵呵?是的就是做了个加减乘除,很明显很多地方还不强壮,因为本片不是讨论健壮的所以先不必吹毛就此了,是不是觉得不通用? 是的 很可恶,稍微改动下 也许就好点了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
private void btnOk_Click(object sender, EventArgs e)
     {
         int operandNum = Convert.ToInt32(this.txtOperandNum.Text.Trim());
         int isOperandNum = Convert.ToInt32(this.txtIsOperandNum.Text.Trim());
         string oper = this.cmbOper.SelectedItem.ToString();
 
         int outPut = Operate(operandNum, oper, isOperandNum);
         this.txtResult.Text = outPut.ToString();
     }
 
private int Operate(int operandNum, string oper, int isOperandNum)
     {
         int result = default(int);
 
         switch (oper)
         {
             case "+": result = operandNum + isOperandNum; break;
             case "-": result = operandNum - isOperandNum; break;
             case "*": result = operandNum * isOperandNum; break;
             case "/": result = operandNum / isOperandNum; break;
             default:
                 MessageBox.Show("不支持您输入的操作!");
                 break;
         }
 
         return result;
     }

  这样或许好点了,但终究没逃出过程,让我们进入面向对象:在设计模式的世界中,所谓历史原则,在具体的子类中取实现的基类或接口吧!

interface ICalcOp
  {
      int Execute(int operandNum, int isOperandNum);
  }

  

class AddOp : ICalcOp
   {
       public int Execute(int operandNum, int isOperandNum)
       {
          return operandNum + isOperandNum;
       }
   }

  难道这样就行了,不行,总不能每次客户端调用的时候都产生一中类型的操作类吧!所以在把各种操作类也封装下吧,也许会更好点:

class Operations
  {
      private static Dictionary<string, ICalcOp> operation ;
 
      public static void FillOper()
      {
          operation = new Dictionary<string, ICalcOp>();
          operation.Add("+",new AddOp());
      }
 
      public static int Operate(int operandNum, string oper, int isOperandNum)
      {
          ICalcOp calc = operation[oper];
          return calc.Execute(operandNum, isOperandNum);
      }

  这样调用也许就好点了

private void btnOk_Click(object sender, EventArgs e)
     {
         int operandNum = Convert.ToInt32(this.txtOperandNum.Text.Trim());
         int isOperandNum = Convert.ToInt32(this.txtIsOperandNum.Text.Trim());
         string oper = this.cmbOper.SelectedItem.ToString();
         int result = default(int);
         Operations.FillOper();
 
         switch (oper)
         {
             case "+": result = Operations.Operate(operandNum, oper, isOperandNum); break;
             //  case "-": result = operandNum - isOperandNum; break;
             //  case "*": result = operandNum * isOperandNum; break;
             //  case "/": result = operandNum / isOperandNum; break;
             default:
                 MessageBox.Show("不支持您输入的操作!");
                 break;
         }
 
         this.txtResult.Text = result.ToString();
     }

  可是分装类还是有点不自在,好像还可以在前进一步,为什么一定要用接口呢?淡然可以不用,微软总是个我们提供更多利剑

class Operations
  {
      delegate int CalcOp(int lhs, int rhs);
 
      static Dictionary<string, CalcOp> operation;
 
      public static void FillOper()
      {
           operation = new Dictionary<string, CalcOp>();
           operation["+"] = delegate(int operandNum, int isOperandNum) { return operandNum + isOperandNum; };
            
      }
 
      public static int Operate(int operandNum, string op, int isOperandNum)
      {
          CalcOp oper = operation[op];
          return oper(operandNum, isOperandNum);
      }
  }

  这样是不是好点了,至少不去专门搞个接口了,不过还是不够,程序员居多是懒人,总是在少些,是的,也许这样更简洁,但是他在一步步被面向对象而去。。。

class Operations
 {
     delegate int CalcOp(int lhs, int rhs);
 
     static Dictionary<string, CalcOp> operation;
 
     public static void FillOper()
     {
          operation = new Dictionary<string, CalcOp>();
          operation["+"] = (int operandNum, int isOperandNum) => operandNum + isOperandNum;
     }
 
     public static int Operate(int operandNum, string op, int isOperandNum)
     {
         CalcOp oper = operation[op];
         return oper(operandNum, isOperandNum);
     }
 }

  其实以上都是铺垫,仅仅是一点代码片段而已,但是静静滴思考下,你也许会发现更多,也许它后面有更多有意思的东西,

对于一个面向对象者来看以上代码是既有可笑之处也有优雅之处,面向对象的世界里一切都是对象是东西是居多是个名字世界,但是

无论是lambda还是匿名委托都在背离这个对象世界而去,更多的关注了动作世界,其实在反过来想想LINQ何尝也不是,但是他确实给我们带了更大的方便,沟通更方便,应为他也强调的是我们要什么,而不是怎么要。无论c还是c#还是F#都是在解放生产力,不过也许有一天我们不在为程序,元编程、 动态和功能范式,XXX等等枯燥的编程烦恼,那时候的语言会和我们人类自然语言一样,那时候看现在的语言,也许你会觉得先都是甲骨文和象形文字,就像当初鼻祖们拿纸袋和计算机沟通的时候也一定没想到今天我们会是这么和计算交互的,在上升到软件开发也是;不要拿石器时代的好工具耕耘现在的田地  呵呵 口才笨拙,胡乱说了一通  欢迎拍砖!

http://www.smarteas.net/his/AgileHIS.html

代码下载:https://files.cnblogs.com/onmyway/SimpleCalc.rar

编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
点击右上角即可分享
微信分享提示