第三次OOP作业总结
前言
此次作业为家居强电电路模拟程序的再次迭代,主要增加了两个特殊用电器,并且考察学生前几次的程序架构的完善性。新增的电压与电流的要求迫使程序更加智能。
设计与分析
题一:家居强电电路模拟程序-3
题解:在器具方面,控制设备增加了互斥开关,受控设备增加了窗帘,电路设计方面增加了多个并联串接的可能性。
-
解题思路:增加
Switch
类代表互斥开关,由于互斥开关具有电阻,所以将计算控制设备的电阻加入到计算电路总电阻的行列中,而非像之前一样仅仅遍历受控设备的电阻来计算电路的总电阻;增加Curtain
类来表示窗帘,由于窗帘的特殊工作原理,即需要计算室内的关照强度来决定输出内容,所以在排序之后,因为恰好Curtain
类的输出顺序在白炽灯,日光灯的后面,可以将所有灯的亮度记录下来,当出现设备的实际类型为Curtain
时,将总的亮度传入该设备中,再进行输出。 -
说明:此处互斥开关实际上只是一个包装类,内部含有一个
LinkedList<Button>
类型的数据,接入电路的实际上是互斥开关内部的几个BUtton
,互斥开关只在输出时使用。 -
修改:由于互斥开关引脚问题,即它的1引脚可能出现两次,2、3引脚至多出现一次,所以更改所有设备的构造方法,要求按顺序传入引脚的编号。
-
UML类图
-
度量
-
方法
Method CogC ev(G) iv(G) v(G) Button.Button(String) 0 1 1 1 Button.changeState() 0 1 1 1 Button.setV() 1 1 2 2 Button.toString() 1 1 1 2 Concatenation.Concatenation() 0 1 1 1 Concatenation.Concatenation(String) 0 1 1 1 Concatenation.addControl(Control, int) 2 2 1 3 Concatenation.addControled(Controled, int) 2 2 1 3 Concatenation.addanotherconcate(Concatenation) 0 1 1 1 Concatenation.changeButton(int) 1 1 2 2 Concatenation.changeSeriesControl(int, double) 1 1 2 2 Concatenation.changeStageControl(int, String) 4 1 3 3 Concatenation.getConcatenations() 0 1 1 1 Concatenation.getControlLinkedList() 0 1 1 1 Concatenation.getControledLinkedList() 0 1 1 1 Concatenation.getControledhash() 0 1 1 1 Concatenation.getControlhash() 0 1 1 1 Concatenation.getParallels() 0 1 1 1 Concatenation.isState() 12 1 5 9 Concatenation.link(double) 4 1 5 5 Concatenation.setConcatenations(LinkedList ) 0 1 1 1 Concatenation.setControlLinkedList(LinkedList ) 0 1 1 1 Concatenation.setControledLinkedList(LinkedList ) 0 1 1 1 Concatenation.setControledhash(HashSet ) 0 1 1 1 Concatenation.setControlhash(HashMap<String, Integer>) 0 1 1 1 Concatenation.setParallels(HashMap<String, User>) 0 1 1 1 Concatenation.setR() 4 1 5 5 Control.Control(String) 0 1 1 1 Controled.Controled(String) 0 1 1 1 Controled.getValue() 0 1 1 1 Controled.setValue(double) 0 1 1 1 Curtain.Curtain(String) 0 1 1 1 Curtain.getNeedlight() 0 1 1 1 Curtain.setNeedlight(double) 0 1 1 1 Curtain.setValue() 4 1 2 7 Curtain.toString() 0 1 1 1 Fan.Fan(String) 0 1 1 1 Fan.setValue() 3 1 3 3 Fan.toString() 0 1 1 1 IncandescentLamp.IncandescentLamp(String) 0 1 1 1 IncandescentLamp.setValue() 2 1 2 2 IncandescentLamp.toString() 0 1 1 1 LandFan.LandFan(String) 0 1 1 1 LandFan.setValue() 7 1 7 7 LandFan.toString() 0 1 1 1 Main.add(String, Concatenation) 27 3 7 16 Main.main(String[]) 67 1 26 27 Parallel.Parallel() 0 1 1 1 Parallel.Parallel(String) 0 1 1 1 Parallel.addconcern(Concatenation) 0 1 1 1 Parallel.isState() 3 1 2 3 Parallel.link(double) 1 1 2 2 Parallel.setR() 3 1 3 3 SeriesControl.SeriesControl(String) 0 1 1 1 SeriesControl.resetTimes(double) 0 1 1 1 SeriesControl.setV() 0 1 1 1 SeriesControl.toString() 0 1 1 1 StageControl.StageControl(String) 0 1 1 1 StageControl.addstage() 1 2 1 2 StageControl.changeStageControl(String) 1 1 1 3 StageControl.cutstage() 1 2 1 2 StageControl.setStage(int) 0 1 1 1 StageControl.setV() 0 1 1 1 StageControl.toString() 0 1 1 1 SumLamp.SumLamp(String) 0 1 1 1 SumLamp.setValue() 2 1 2 2 SumLamp.toString() 0 1 1 1 Switch.Switch(String) 0 1 1 1 Switch.changeButton() 3 1 3 3 Switch.getButtons() 0 1 1 1 Switch.setIssort(boolean) 0 1 1 1 Switch.setV() 0 1 1 1 Switch.toString() 4 2 2 3 User.User() 0 1 1 1 User.User(String) 0 1 1 1 User.compareTo(User) 2 2 2 2 User.getArraytime() 0 1 1 1 User.getName() 0 1 1 1 User.getR() 0 1 1 1 User.getV() 0 1 1 1 User.isNext() 0 1 1 1 User.isState() 0 1 1 1 User.setArraytime(int) 0 1 1 1 User.setName(String) 0 1 1 1 User.setNext(boolean) 0 1 1 1 User.setR(double) 0 1 1 1 User.setState(boolean) 0 1 1 1 User.setV(double) 0 1 1 1 -
类
Class OCavg OCmax WMC Button 2.25 5 9 Concatenation 4.08 17 49 Control 1 1 1 Controled 1 1 3 Curtain 3 8 15 Fan 2.67 4 8 IncandescentLamp 2.33 4 7 LandFan 3.33 5 10 Main 25.5 33 51 Parallel 2.58 8 31 Pin 1 1 8 SeriesControl 1.75 4 7 StageControl 2 4 14 SumLamp 2.33 4 7 Switch 3.4 9 34 User 1.12 4 36 diode 2.8 8 14
-
题二:家居强电电路模拟程序-4
题解:在用具方面,增加了二极管;电路设计方面增加了并联套并联的可能性;输出方面,增加了引脚电压的输出要求,以及电路电流的计算要求。
-
解题思路:增加
diode
类代表二极管。为了解决引脚电压问题,修改串联中用具的存储方式,从之前的将控制设备与受控设备分开存放改为将所有用具都存放在一个LinkedList
类型中,并增加一个属性showV
来演示电压在电路中传导的过程;对于电流问题,如果电路为通路则通过I=R/V计算。为了方便引脚的使用,增加一个引脚类Pin
。 -
diode
实际上为一个包装类,其内部只含有一个开关,开关的开与闭由二极管的引脚顺序决定。 -
增添:
downlink
方法:将一个串联或并联看出一个整体,如果它所在的电路是短路的,那么它也是短路的。callBack
方法:在遇见并联电路时,如果一条路开路,一条路通路,并联电路的输出电压会从开路中返回,直到达到开路的用具。- 电流判断特殊情况:如果一个并联出现两个及以上的无电阻的通路,需要将电流平均分配给不含电阻的各个通路。
-
判断核心
public void judgeOfShow(User userself, User user, double takeV){if(userself.isState()){if(user.isState()){user.setPinsV(user,userself.getShowV(),0);}elseuser.setPinsV(user,userself.getShowV(),userself.getShowV());}else{if(user.isState()){user.setPinsV(user,userself.getShowV(),0);}elseuser.setPinsV(user,userself.getShowV(),userself.getShowV()-takeV);}}
如果本身是开路的,分两种情况,如果该用电器是开路的,那么两个引脚别为
ShowV
与0
,如果是闭合的,那么两个引脚都为ShowV
;电路如果是闭合的,其实只有一种情况,就是用电器闭合,那么两个引脚风别为ShowV
与ShowV-takeV
[1]。当电路本身是开路的而开路的元件在该元件之前,那么传出的
ShowV
为0,也可被包括,故不用考虑这种情况。 -
UML类图
-
度量
-
方法
Method CogC ev(G) iv(G) v(G) Button.Button(String, String, String) 0 1 1 1 Button.changeState() 0 1 1 1 Button.setV() 1 1 2 2 Button.toString() 6 1 2 5 Concatenation.Concatenation() 0 1 1 1 Concatenation.Concatenation(String) 0 1 1 1 Concatenation.addEloctor(User) 5 1 4 4 Concatenation.callback(double) 21 7 9 10 Concatenation.callsuperState() 0 1 1 1 Concatenation.downlink(boolean) 5 1 5 5 Concatenation.getElector() 0 1 1 1 Concatenation.isState() 3 1 2 3 Concatenation.link(double) 47 1 19 19 Concatenation.setElector(LinkedList ) 0 1 1 1 Concatenation.setNowState(boolean) 2 1 3 3 Concatenation.setR() 5 1 4 4 Control.Control(String, String, String) 0 1 1 1 Controled.Controled(String, String, String) 0 1 1 1 Controled.getValue() 0 1 1 1 Controled.setValue(double) 0 1 1 1 Curtain.Curtain(String, String, String) 0 1 1 1 Curtain.getNeedlight() 0 1 1 1 Curtain.setNeedlight(double) 0 1 1 1 Curtain.setValue() 4 1 2 7 Curtain.toString() 4 1 2 4 Fan.Fan(String, String, String) 0 1 1 1 Fan.setValue() 3 1 3 3 Fan.toString() 5 1 2 4 IncandescentLamp.IncandescentLamp(String, String, String) 0 1 1 1 IncandescentLamp.setValue() 2 1 2 2 IncandescentLamp.toString() 5 1 2 4 LandFan.LandFan(String, String, String) 0 1 1 1 LandFan.setValue() 8 1 8 8 LandFan.toString() 5 1 2 4 Main.add(String, Concatenation) 31 3 8 18 Main.main(String[]) 99 1 35 36 Parallel.Parallel() 0 1 1 1 Parallel.Parallel(String) 0 1 1 1 Parallel.addconcern(Concatenation) 0 1 1 1 Parallel.callBack(double) 3 1 3 3 Parallel.callsuperState() 0 1 1 1 Parallel.downlink(boolean) 2 1 3 3 Parallel.isState() 17 1 9 10 Parallel.judgeOfShow(User, User, double) 8 1 4 4 Parallel.link(double) 1 1 2 2 Parallel.setI(double) 1 1 1 2 Parallel.setNowState(boolean) 1 1 2 2 Parallel.setR() 5 1 4 4 Pin.Pin() 0 1 1 1 Pin.Pin(String) 0 1 1 1 Pin.compareTo(Pin) 0 1 1 1 Pin.getName() 0 1 1 1 Pin.getV() 0 1 1 1 Pin.setName(String) 0 1 1 1 Pin.setV(double) 0 1 1 1 Pin.toString() 0 1 1 1 SeriesControl.SeriesControl(String, String, String) 0 1 1 1 SeriesControl.resetTimes(double) 0 1 1 1 SeriesControl.setV() 0 1 1 1 SeriesControl.toString() 5 1 2 4 StageControl.StageControl(String, String, String) 0 1 1 1 StageControl.addstage() 1 2 1 2 StageControl.changeStageControl(String) 1 1 1 3 StageControl.cutstage() 1 2 1 2 StageControl.setStage(int) 0 1 1 1 StageControl.setV() 0 1 1 1 StageControl.toString() 5 1 2 4 SumLamp.SumLamp(String, String, String) 0 1 1 1 SumLamp.setValue() 2 1 2 2 SumLamp.toString() 5 1 2 4 Switch.Switch(String, String, String) 0 1 1 1 Switch.addPin() 22 1 7 7 Switch.changeButton() 3 1 3 3 Switch.fullPin() 12 1 8 10 Switch.getButtons() 0 1 1 1 Switch.getPinName() 0 1 1 1 Switch.setIssort(boolean) 0 1 1 1 Switch.setPinName(HashSet ) 0 1 1 1 Switch.setV() 0 1 1 1 Switch.toString() 14 1 5 9 User.User() 0 1 1 1 User.User(String, String, String) 0 1 1 1 User.compareTo(User) 2 2 2 2 User.getArraytime() 0 1 1 1 User.getI() 0 1 1 1 User.getLimitI() 0 1 1 1 User.getName() 0 1 1 1 User.getPins() 0 1 1 1 User.getR() 0 1 1 1 User.getShowV() 0 1 1 1 User.getV() 0 1 1 1 User.isIssort() 0 1 1 1 User.isJustthisstate() 0 1 1 1 User.isNext() 0 1 1 1 User.isNowState() 0 1 1 1 User.isShowV() 0 1 1 1 User.isState() 0 1 1 1 User.judgeOfShow(User, User, double) 8 1 4 4 User.setArraytime(int) 0 1 1 1 User.setI(double) 0 1 1 1 User.setIssort(boolean) 0 1 1 1 User.setJustthisstate(boolean) 0 1 1 1 User.setLimitI(double) 0 1 1 1 User.setName(String) 0 1 1 1 User.setNext(boolean) 0 1 1 1 User.setNowState(boolean) 0 1 1 1 User.setPins(LinkedList ) 0 1 1 1 User.setPinsV(User, double, double) 0 1 1 1 User.setR(double) 0 1 1 1 User.setShowV(double) 0 1 1 1 User.setState(boolean) 0 1 1 1 User.setV(double) 0 1 1 1 diode.diode(String, String, String) 2 1 2 2 diode.getButton() 0 1 1 1 diode.setButton(Button) 0 1 1 1 diode.setV() 1 1 2 2 diode.toString() 17 1 6 9 -
类
Class OCavg OCmax WMC Button 2.25 5 9 Concatenation 4.08 17 49 Control 1 1 1 Controled 1 1 3 Curtain 3 8 15 Fan 2.67 4 8 IncandescentLamp 2.33 4 7 LandFan 3.33 5 10 Main 25.5 33 51 Parallel 2.58 8 31 Pin 1 1 8 SeriesControl 1.75 4 7 StageControl 2 4 14 SumLamp 2.33 4 7 Switch 3.4 9 34 User 1.12 4 36 diode 2.8 8 14
-
踩坑心得
- 在Java中,当你执行
LinledList<String> a ={"a","b","c"};Collections.reverse(a);LinkedList<String> b = a;
这样的代码时,你并没有创建a
的一个新副本,而是让b
和a
引用同一个LinkedList
对象。因此,对b
所做的任何修改都会影响到a
,因为它们引用的是同一个对象。
改进建议
将按电阻分配获得电压的方式进行修改,在遍历用具链表的时候根据电阻来计算电压并决定引脚内的数值。
总结
- 此次作业要求同学们有很好的构造能力,由控制设备与受控设备展开,同时不相互孤立,也因此带来了不小的困难。
- 题目设置有部分歧义,希望改进。
takeV为该用电器消耗的电压 ↩︎