第三次博客总结

《第三次博客》

一.家居强电电路模拟程序-3

  1. 前言

    1>.代码主要功能

      本次迭代的代码功能其实设备之间的连接并没有太多的变化,本次迭代的内容主要是并联和并联串 
      联的处理,这个功能好实现,因为设计好了串联类和并联类,只要设计好存储并联的集合,做好电 
      压之间赋值关系即可处理好,多个并联串联的问题,在主电路中存储并联,相关的电压时把这整个         
      并联当作是一个简单的设备,在计算电压是把这个设备所计算得到的电压再赋值给所对应名称的并 
      联之中,再进一步在并联的方法中计算本并联中的串联中的设备的电压,做好设备的赋值赋值操 
      作,本次迭代出来的功能难点在与互斥开关的类的设计,本次的互斥开关由于是三个引脚,所以在 
      本次的迭代之中我是按照将一个互斥开关,拆分成两个带有引脚表示的简单开关进行来处理,这样 
      的处理可以使得,后续调节互斥开关的状态时变得更加简单便利,子在本次的迭代之中还新增了一 
      个类叫做智能窗帘,本窗帘的智能功能是可以根据所有灯光的大小来调节窗帘的开关程度,所以在 
      计算窗帘的开关程度时,只需便利存储设备的集合,累加出总光照的总和,进而计算出开合程度。
    

    2>.主要知识点

      本次迭代并没有增加很多什么知识点只是利用原来的知识点写出了新的功能和部分,
      主要知识点都是和集合List,字符串的处理,正则表达式,类的设计相关的知识点,没有增加新 
      的知识点
     1.通过 Scanner 和 System.in 来接收用户的输入,实现交互式输入。
     2.字符串处理:使用了字符串操作方法,如 startsWith、substring、split、charAt 等来处理 
     用户输入的字符串。
     3.多态:在往 devices 列表中添加设备对象时,利用多态实现了将不同子类对象当作父类对象来处 
      理。
     4.类继承与对象实例化:定义了 Device 类及其子类 Switch、GearSpeedController、 
     ContinuousSpeedController、IncandescentLamp、FluorescentLamp、CeilingFan,并根据 
     用户输入的不同类型来实例化相应的子类对象。
     5.通过对 devices 中的设备进行遍历查找及强制类型转换,实现了根据用户输入操作来对设备进行 
     状态控制。
     6.使用了 switch-case 语句块进行根据不同条件执行不同的操作。
     7.采用了面向对象设计原则,如单一职责原则、开闭原则,使得代码结构清晰、易于拓展和维护。
     8.遍历循环:使用了 for 循环对设备列表进行遍历操作。
    

    3>.题目的题量

    本题的题量算是一般,因为在主函数的处理方面,增加了一个并联和并联之间的串联,并没有多大的 
    变化,只需要调用并联和串联相关的函数即可,只不过在本次的迭代之中,新增了两个类,而这两个 
    类并没有增加太多的代码的相关内容
    

    4>.题目难度

     在上次的迭代处理好了之后,并联和并联的串联操作,就较好的能处理完成,但是,本次的迭代的互 
     斥开关较为难处理,所以还是有一定的难度的,所以笨的难度一般,处理好了这个互斥开关还是能写 
     出来做到满分的
    
  2. 设计与分析

  1. 采坑心得

         addDevices方法不仅添加设备到列表中,还试图通过传入的resistance参数更新总电阻。然 
         而,这种方法没有考虑到每个设备可能有不同的电阻值,并且应该由设备对象自身来提供其电 
         阻值。方法命名不一致:Mresistance方法名可能是addResistance的误写,这导致了命名不 
         一致和可能的混淆。类型检查和向下转型:在judgeCstate方法中,代码使用了instanceof来 
          检查设备的类型,并随后进行了向下转型。这种类型检查通常不是面向对象设计的最佳实践, 
         因为它限制了代码的灵活性和可维护性。如果可能,最好使用多态性来避免类型检查和向下转 
         型。硬编码状态逻辑:在judgeCstate方法中,对于不同类型的设备(如Switch、 
         MutexSwitch、GearSpeedController等),硬编码了状态判断的逻辑。这使得添加新类型 
         的设备或修改现有设备的状态逻辑变得困难。未完成的代码:judgeCstate方法的代码被截断 
         了,这导致我们无法看到完整的逻辑。不完整的代码片段可能导致理解和维护困难。
         状态表示不明确:cstate字段被用来表示电路的状态(闭合或断开),但没有明确的文档或注 
         释来解释这个字段的确切含义和用法。缺少异常处理:代码中没有包含任何异常处理逻辑,例 
         如,在添加设备到列表时,没有检查是否成功添加或处理可能的异常。
         缺少封装性:虽然类的属性被声明为private(在代码片段中未明确显示,但通常假设),但某 
         些方法(如setV1_V2)可能允许外部类直接修改内部状态,这可能破坏封装性并导致不可预见 
         的行为。缺乏文档注释:代码片段中缺乏文档注释,这使得其他开发人员难以理解类的用途、 
         方法的作用和参数的预期值。缺乏输入验证:在setV1_V2和addDevices等方法中,没有对输 
         入进行验证,例如检查电压或电阻是否在合理的范围内。这可能导致意外的行为或错误。     
    
  2. 改进建议

          重构电阻计算逻辑:
          移除addDevices方法中的电阻参数,改为在Device类中定义一个获取电阻值的方法(如 
          getResistance())。
          在Series类中维护一个计算总电阻的方法(如calculateTotalResistance()),该方法遍 
          历设备列表并累加每个设备的电阻值。
          优化方法命名:
          将Mresistance方法重命名为addResistance或其他更具描述性的名称。
          使用多态性:
          在Device类中定义一个方法(如isOpen()),用于判断设备是否处于开启状态。
          在judgeCstate方法中,遍历设备列表并调用每个设备的isOpen()方法来判断电路是否闭 
          合。完成judgeCstate方法:
          确保judgeCstate方法完整,并且正确地检查所有设备的状态以确定电路的整体状态。
          添加异常处理:
          在添加设备到列表时,可以添加异常处理逻辑来确保设备被成功添加,或者处理添加过程中 
          可能出现的异常。
          明确状态表示:
          在Series类中添加文档注释,明确解释cstate字段的含义和用法。
          增强封装性:
          考虑将某些属性的访问级别更改为private,并通过公共的getter和setter方法来访问和修 
          改这些属性。
          添加文档注释:
          为类、方法、属性和其他重要部分添加文档注释,以便其他开发人员能够更容易地理解代码的 
          功能和用途。
          在设置电压、电阻或添加设备时,添加输入验证逻辑来确保输入的值在合理的范围内,并处理 
          无效的输入。
          如果Series类需要处理更复杂的电路逻辑,可以考虑使用设计模式(如组合模式、观察者模式 
          等)来优化代码
          将设备(如Switch、MutexSwitch、GearSpeedController等)设计为具有共同接口或基类 
          的层次结构,以便在Series类中统一处理不同类型的设备。
          编写单元测试来验证Series类的功能和行为是否符合预期。这有助于确保代码的正确性和稳定 
          性。
    

一.家居强电电路模拟程序-4

  1. 前言

    1>.代码主要功能

       本次迭迭代只要是增加了计算个个设备电压的两端引脚电压的操作,还有计算个个点电压,还需 
       要判断个个设备的经过的电流的大小是否超过这个设备的最大电流如果超过则需要输出提示
        基本设备类和设备子类:
     实现了一个设备控制系统的基本框架,包括了设备类(Device)、控制设备类 
     (ControlDevice)、开关类(Switch)、分档调速器类(GearSpeedController)、连续调速器 
      类 
     (ContinuousSpeedController)、受控设备类(ControlledDevice)以及多种具体的受控设备 
      类 
     (如白炽灯、日光灯、吊扇、落地扇等)。
    
      其中,设备类包括了设备的基本信息和属性,并且设备类为其他类提供了基本的属性和方法继承; 
      控制设备类是设备类的子类,用来实现具体的设备控制逻辑;开关类实现了开关设备的功能,可以 
      切换开关状态并输出相应电压;分档调速器类实现了分档调速的功能,可以根据档位调整输出电 
      压;连续调速器类实现了连续调速的功能,可以根据速度因子调整输出电压;受控设备类是设备类 
      的子类,用来实现具体的受控设备的输出计算逻辑;最后,具体的受控设备类(如白炽灯、日光 
      灯、吊扇、落地扇)分别实现了自身的输出计算逻辑,根据不同的电势差计算出相应的输出值。
      其次是并联和串联类:这段代码主要是实现了电路中串联电路和并联电路的计算功能。其中 
      Series 类表示串联电路,包括添加设备、计算总电阻、判断电路状态(闭合或断开)、计算设备 
      之间的电压差等功能;Parallel 类表示并联电路,包括添加串联电路、计算总电阻、设置电压差 
      等功能在 Series 类中,通过 addDevices 方法可以向串联电路中添加设备并计算总电阻,通过 
      judgeCstate 方法判断串联电路中各设备的状态,通过 devicesV1_V2 方法计算各设备的电压 
      差。而在 Parallel 类中,通过 addCDevices 方法向并联电路中添加串联电路并计算总电阻, 
      通过 devicesV1_V2 方法设置并联电路中各串联电路的电压差。
      对于电压的计算部分:遍历第一系列(series1)中的电器设备,查找名称为"M1"的设备,将该设 
      备的电阻设置为并联电阻的值,并重新给"M1"设备赋予这个电阻值。
      根据第一个电路设备的类型进行判断,计算总电路的电压:
      如果是开关设备(Switch),根据开关状态设置电压为220.0或0.0。
      如果是齿轮速度控制器(GearSpeedController),获取其输出电压。
      如果是连续速度控制器(ContinuousSpeedController),获取其输出电压。
      否则将电压设定为220.0。
      将计算得到的电压赋值给总电路,并计算总电路中各个电器的电压。
      遍历总电路中的设备,如果设备名称是"M1",则将其电压赋值给并联电路。
      对并联电路中的每个串联(Series)进行计算各个电器的电压。
      最后使用排序的代码对于个个设备的类型和编号进行排序输出个个设备的状态
    

    2>.主要知识点

     以下是代码涉及到的主要知识点
     1.通过 Scanner 和 System.in 来接收用户的输入,实现交互式输入。
     2.字符串处理:使用了字符串操作方法,如 startsWith、substring、split、charAt 等来处理 
     用户输入的字符串。
     3.多态:在往 devices 列表中添加设备对象时,利用多态实现了将不同子类对象当作父类对象来处 
      理。
     4.类继承与对象实例化:定义了 Device 类及其子类 Switch、GearSpeedController、 
     ContinuousSpeedController、IncandescentLamp、FluorescentLamp、CeilingFan,并根据 
     用户输入的不同类型来实例化相应的子类对象。
     5.通过对 devices 中的设备进行遍历查找及强制类型转换,实现了根据用户输入操作来对设备进行 
     状态控制。
     6.使用了 switch-case 语句块进行根据不同条件执行不同的操作。
     7.采用了面向对象设计原则,如单一职责原则、开闭原则,使得代码结构清晰、易于拓展和维护。
     8.遍历循环:使用了 for 循环对设备列表进行遍历操作。
     9. 访问修饰符(Access Modifiers):
       private 修饰符用于限制属性的访问范围,确保它们只能在类内部被访问
     10.接口和抽象类(尽管在示例中未直接显示):
     接口和抽象类允许定义不完整的类结构,其他类可以实现这些接口或继承这些抽象类来提供具体的实
    

    3>.题目的题量

     本次迭代的本题的题量是很多而且本次的新增的内容不是很多但是,本地的电压反面的处理较为复杂 
     与麻烦,本次的迭代之中考虑的并联里面包含了并联的操作,在本次的电压处理中点的更为复杂很容 
     易产生错误,所以本次所迭代的代码的数量较为多,较为复杂,最为复杂的是二极管和互斥开关的引 
     脚电压的处理,在这方面的代码的处理需要编写相关的代码较为多,代码的量较多,我本次迭代的代 
     码的长度为1000多行所以较为复杂
    

    4>.题目难度

      本次的题目难度较为复杂,在本次的作业中我的测试点只过了七十多分的,整体的难度为一般,但 
      是对于部分的电压处理还是较为复杂的
    
  2. 设计与分析

  1. 采坑心得

        成员变量V1_V2的命名可能不够直观,因为它似乎表示两个电压之间的差值,但名称中包含了下 
        划线,可能让人误解为是两个独立的电压值。建议考虑更清晰的命名,如voltageDifference。
        Mresistance方法的命名不符合Java的命名规范,通常应该使用小写字母开头,并使用驼峰命名 
        法。例如,可以将其重命名为addResistance。 在judgeCstate方法中,检查电路
        中的设备(如开关和二极管)来确定电路是否闭合。但是,该方法没有返回任何值,也没有修改 
        cstate成员变量。需要修改此方法以返回电路的状态,或者更新cstate的值。
        二极管的状态:在judgeCstate方法中,我检查了二极管(Diode)的state成员变量。但是, 
        二极管是否“正向”通常不仅仅取决于其state变量,还取决于电流的方向和电压的极性。
    
        添加设备的方法:在addDevices方法中,我同时添加了设备和其电阻值。但是,这种方法假设 
        每个设备都只有一个固定的电阻值,这可能不适用于所有类型的设备需要考虑一个更通 
        用的方法来添加设备,并允许在稍后设置或修改其电阻值。
        电压和电流的计算:在您的类中,虽然您存储了电压和电流的值,但您没有提供方法来计算这些 
        值。在串联电路中,总电压是各个设备电压之和,总电流在各个位置是相等的。需要添加 
        方法来计算这些值。来简化我的步骤,在我的方法之中的步骤很多没有使用函数来多次调用
    
  2. 改进建议

         class Series {  
             private final String name;  
             private double totalResistance;  
             private double current;  
             private boolean isClosed = false;  
             private double voltageDifference;  
             private List<Device> devices;  
    
             public Series(String name) {  
                 this.name = name;  
                 this.devices = new ArrayList<>();  
             }  
    
             public void addDevice(Device device) {  
                 // 假设Device类包含获取电阻的方法  
                 this.devices.add(device);  
                 this.totalResistance += device.getResistance(); // 假设有            
             getResistance()方法  
             }  
    
             public boolean isClosed() {  
                 return isClosed;  
             }  
    
             public void calculateState() {  
                 isClosed = true; // 假设初始为闭合  
                 for (Device device : devices) {  
         if (device instanceof Switch && !((Switch) device).isClosed()) {  
                         isClosed = false;  
                         break;  
                     }  
                     // 添加对其他设备类型的检查...  
                 }  
             }  
    
             // ... 其他方法,如计算电压、电流等  
         }  
    
         // 示例的Switch类  
         class Switch implements Device {  
             private boolean isClosed;  
             private double resistance; // 当开关闭合时的电阻  
           
             // ... 构造函数、getter、setter等  
    
             public boolean isClosed() {  
                             return isClosed;  
             }  
    
             // ... 其他方法  
         }
    

总结:

  在作业7的迭代之中,增加了互斥开关和智能窗帘两个类,这两个类中较为难处理的就是互斥开关的处 
  理,重点在于互斥开关的类的设计,本次的类的设计之中我将一个互斥开关拆分成了两个普通开关,与 
  普通开关不同的是这个开关带有引脚号2 3,还有一个重点是并联与并联的串联,做好并联与并联的串 
  联需要将并联当作是一个带有电阻的设备,简化成一个整体来进行操作,将这个简化的整体赋值电阻, 
  在总串联设备之中计算电压,最后将并联里的设备进行计算电流和电压的操作,处理好这两个重点基本 
  就可以完成大部分的测试点
  在作业8的迭代之中,第一个重点是并联里面包含了并联的这个功能,需要处理号这个功能就需要将电 
  路简化,最间的方法就是将并联整体看作是一个具有电阻的设备去处理这个重点,最后容易出错的点是 
  在电压的计算过程之中,电压的赋值操作,由于是并联里面含有并联所以这个电压的赋值操作较为麻 
  烦,容易出错。第二个重点就是计算个个设备的引脚电压的操作,计算引脚的电压需要计算好这个设备 
  的电势差,还需要计算这个设备的引脚的初始电压,而初始电压的计算需要从开始220起始开始计算, 
  所以简单的并联包含并联的电路还是能计算出来,但是本题的难点是二极管和互斥开关的计算过程,二 
  极管的计算需要考虑的条件我也没有太搞明白,最后四个测试点没有同学通过,互斥开关的计算也较为 
  麻烦,主要是互斥开关具有三个引脚
  本次的电路系统的四次迭代完成,整体来说还算不错,通过了大部分的测试点,但是不足的地方还是有 
  很多,在我自己编写的代码的时候我只会考虑代码的逻辑而不太会考虑代码的可读性,所以我的代码 
  的长度还是较为隆长不太容易理解,本次的迭代之中我也学习到了很多的知识点,主要学习到的是根据 
  题目去编写相关的代码功能这一思路的提升,加油~
posted @ 2024-06-29 14:55  李福建  阅读(6)  评论(0编辑  收藏  举报