.NET 面向对象程序设计 —— 学习笔记 详细版

发布于:2024-04-26 ⋅ 阅读:(24) ⋅ 点赞:(0)

        开始考虑通过封装、继承、多态把程序的耦合度降低(传统印刷 术的问题就在于所有的字都刻在同一版面上造成耦合度太高所制),开始用设计模式使得程序更加的灵活,容易修改, 并且易于复用。

1.代码规范重构

        大鸟说:“且先不说出题人的意思,单就你现在的代码,就有很多不足的地方需要改进。比如变量命名,你的命名 就是 ABCD,变量不带有任何具体含义,这是非常不规范的;判断分支,你这样的写法,意味着每个条件都要做判断, 等于计算机做了三次无用功;数据输入有效性判断等,如果用户输入的是字符符号而不是数字怎么办?

        如果除数时, 客户输入了 0 怎么办?这些都是可以改进的地方。” “哦,说得没错,这个我以前听老师说过,可是从来没有在意过,我马上改,改完再给你看看。”

class Program 
{ 
 static void Main(string[] args) 
 { 
 try 
 { 
 Console.Write("请输入数字 A:"); 
 string strNumberA = Console.ReadLine(); 
 Console.Write("请选择运算符号(+、-、*、/):"); 
 string strOperate = Console.ReadLine(); 
 Console.Write("请输入数字 B:"); 
 string strNumberB = Console.ReadLine(); 
 string strResult = ""; 
 
 switch (strOperate) 
 { 
 case "+": 
 strResult = Convert.ToString(Convert.ToDouble(strNumberA) + Convert.ToDouble(strNumberB)); 
 break; 
 case "-": 
 strResult = Convert.ToString(Convert.ToDouble(strNumberA) - Convert.ToDouble(strNumberB)); 
 break; 
 case "*": 
 strResult = Convert.ToString(Convert.ToDouble(strNumberA) * Convert.ToDouble(strNumberB)); 
 break; 
 case "/": 
 if (strNumberB != "0") 
 strResult= Convert.ToString(Convert.ToDouble(strNumberA) / Convert.ToDouble(strNumberB)); 
 else 
 strResult = "除数不能为 0"; 
 break; 
 } 
 
 Console.WriteLine("结果是:" + strResult); 
 
 Console.ReadLine(); 
 
 
 } 
 catch (Exception ex) 
 { 
 Console.WriteLine("您的输入有错:" + ex.Message);  } 
 } 
} 

        大鸟:“吼吼,不错,不错,改得很快吗?至在目前代码来说,实现计算器是没有问题了,但这样写出的代码是否 合出题人的意思呢?” 小菜:“你的意思是面向对象?” 大鸟:“哈,小菜非小菜也!”

2.复制 VS 复用

        小菜:“我明白了,他说用任意一种面向对象语言实现,那意思就是要用面向对象的编程方法去实现,对吗?OK, 这个我学过,只不过当时我没想到而已。” 大鸟:“所有编程初学者都会有这样的问题,就是碰到问题就直觉的用计算机能够理解的逻辑来描述和表达待解决 的问题及具体的求解过程。

        这其实是用计算机的方式去思考,比如计算器这个程序,先要求输入两个数和运算符号, 然后根据运算符号判断选择如何运算,得到结果,这本身没有错,但这样的思维却使得我们的程序只为满足实现当前 的需求,程序不容易维护,不容易扩展,更不容易复用。从而达不到高质量代码的要求。

        ” 小菜:“鸟哥呀,我有点糊涂了,如何才能容易维护,容易扩展,又容易复用呢,能不能具体点?” 大鸟:“比如说,我现在要求你再写一个 windows 的计算器,你现在的代码能不能复用呢?”

        小菜:“那还不简单,把代码复制过去不就行了吗?改动又不大,不算麻烦。” 大鸟:“小菜看来还是小菜呀,有人说初级程序员的工作就是 Ctrl+C 和 Ctrl+V,这其实是非常不好的编码习惯, 因为当你的代码中重复的代码多到一定程度,维护的时候,可能就是一场灾难。

        越大的系统,这种方式带来的问题越 严重,编程有一原则,就是用尽可能的办法去避免重复。想想看,你写的这段代码,有哪些是和控制台无关的,而只 是和计算器有关的?”

3.业务的封装

小菜:“你的意思是分一个类出来? 哦,对的,让计算和显示分开。” 大鸟:“准确的说,就是让业务逻辑与界面逻辑分开,让它们之间的耦合度下降。只有分离开,才容易达到容易维 护或扩展。” 小菜:“让我来试试看。”

class Program
{
    static void Main(string[] args)
    {
        try
        {
            Console.Write("请输入数字 A:");
            string strNumberA = Console.ReadLine();
            Console.Write("请选择运算符号(+、-、*、/):");
            string strOperate = Console.ReadLine();
            Console.Write("请输入数字 B:");
            string strNumberB = Console.ReadLine();
            string strResult = "";

            strResult =
            Convert.ToString(Operation.GetResult(Convert.ToDouble(strNumberA), Convert.ToDouble(strNumberB), strOperate
            ));

            Console.WriteLine("结果是:" + strResult);

            Console.ReadLine();


        }
        catch (Exception ex)
        {
            Console.WriteLine("您的输入有错:" + ex.Message);
        }
    }
}

public class Operation
{
    public static double GetResult(double numberA, double numberB, string operate)
    {
        double result = 0d;
        switch (operate)
        {
            case "+":