第三次Blog

  • 前言
    • 家居强电电路模拟程序-3
      对于本次大作业,家居强电电路模拟程序-3添加的内容其实并不是很多,只是在写代码之前设计的时候思考了一段时间,写代码的过程非常顺利,并且提交代码也是一遍过,这也是我第一次在大作业的大题目中一遍过。
    • 家居强电电路模拟程序-4
      对于本次大作业,家居强电电路模拟程序-4添加的内容和难度一下就上来了,也是花了很多时间在代码的设计以及迭代上,但最后依旧没有得到一个令人满意的分数,也主要是因为最初的类的设计并不是那么合理,导致最后迭代需要改进的地方很多。
  • 设计与分析
    • 家居强电电路模拟程序-3
      先来看看类的设计

      在上一次代码的基础上,我设计了互斥开关类(Hswitch)并且继承自开关类
//互斥开关
class Hswitch extends Switch {
	private Map<String,Pin> pins;
	private String nowLine;
	private Pin outPin1;
	private Pin outPin2;
	
    public Hswitch(String name) {
        super(name);
        this.resistance=0;
        this.status=true;
        pins=new LinkedHashMap<>();
        this.outPin1=new Pin(5,true);
        this.outPin2=new Pin(10,false);
    }
    public void put(String str,int j) {
    	switch(j) {
    	case 2:pins.put(str,outPin1);break;
    	case 3:pins.put(str,outPin2);break;
    	}
    }
    public void setNowLine(String nowLine) {
    	this.nowLine=nowLine;
    }
    @Override
    public void changeStatus() {
    	this.status=!this.status;
        outPin1.changeStatus();
        outPin2.changeStatus();
    }
    @Override
    public Boolean getStatus() {
    	return pins.get(nowLine).getStatus();
    }
    @Override
    public double getResistance() {
    	return pins.get(nowLine).getResistance();
    }
}

由于互斥开关不同的引脚有不同的电阻,所以我设计了引脚类(Pin)。

class Pin {

	private double voltage;
	private double resistance;
	private Boolean status;
	
	public Pin(double resistance,Boolean status) {
		this.resistance=resistance;
		this.status=status;
	}
	public double getvoltage() {
		return this.voltage;
	}
    public double getResistance() {
    	return resistance;
    }
    public Boolean getStatus() {
        return status;
    }
    public void changeStatus() {
    	this.status=!this.status;
    }
}

那么互斥开关类就有输出引脚1和输出引脚2的属性,通过重写父类的getResistance()方法来实现获得不同状态下引脚的电阻,并且计算电压或电流。还添加了一个窗帘类(Curtain),有当前环境的光照强度(luminance)和窗帘打开的比例(ratio)。

//窗帘
class Curtain extends Device {
	private double luminance;
	private double ratio;
	
	public Curtain(String name) {
        super(name);
        this.luminance=0;
        this.ratio=1;
        this.status=true;
        this.resistance=15;
    }
	@Override
    public void work() {
		if(this.voltage<50)
			ratio=1;
		else {
			if(this.luminance>=0&&this.luminance<50)
				this.ratio=1;
			else if(this.luminance>=50&&this.luminance<100)
				this.ratio=0.8;
			else if(this.luminance>=100&&this.luminance<200)
				this.ratio=0.6;
			else if(this.luminance>=200&&this.luminance<300)
				this.ratio=0.4;
			else if(this.luminance>=300&&this.luminance<400)
				this.ratio=0.2;
			else
				this.ratio=0;
		}
	}
	@Override
    public void show() {
		work();
		System.out.println("@"+this.name+":"+(int)(this.ratio*100)+"%");
    }
	public void setLuminance(double luminance) {
		this.luminance=luminance;
	}
}
    • 家居强电电路模拟程序-4
      先来看看类的设计

      在上一次代码的基础上,把输入引脚和输出引脚放在了设备类(Device)中,而互斥开关就单独多了一个输出引脚。由于有些类,如开关和互斥开关等输入引脚与输出引脚并不固定,所以要在输入的时候判断哪个是输入引脚哪个是输出引脚。还添加了二极管类(Diode),
//二极管
class Diode extends Device {
	
	public Diode(String name) {
		super(name);
        this.status=true;
        this.resistance=0;
        this.maxIntensity=8;
	}
	public void put(int i) {
		if(i==1) {
			this.forwardConnectivity=true;
            this.status=true;
        }
        else {
        	this.forwardConnectivity=false;
            this.status=false;
        }
	}
	@Override
	public void work() {
		// TODO 自动生成的方法存根
	}
	@Override
	public void show() {
		if(forwardConnectivity)
			System.out.print("@"+this.name+":conduction");
        else
        	System.out.print("@"+this.name+":cutoff");
		System.out.print(" "+(int)this.inPin.getVoltage()+"-"+(int)this.outPin1.getVoltage());
		if(this.intensity>this.maxIntensity)
			System.out.println(" exceeding current limit error");
		else
			System.out.println();
	}
}

也是通过判断是否反接来判断电阻值、判断是否是通路,也通过此来判断输出的方式。

  • 踩坑心得
    • 家居强电电路模拟程序-3
      这一次代码的迭代,相对于上次来说并不是很困难,添加的东西也没有很多,写起来也非常得心应手,没有踩到什么坑。
    • 家居强电电路模拟程序-4
      这一次代码的迭代难度就一下上来了,首先就是如何把设备引脚的电压求出来,判断电流是否超过最大电流和电流短路判断都比较简单。在写二极管的时候没有认真看题,光看到前面说正向时电阻为0,反向时电阻为无穷,我代码也确实时这样实现的,但后面也说了反向时相当于开关打开,所以此时把电阻设置为无穷大并不是重点,重点在于把此时二极管的连通状态设置成false(不连通状态)。至于另外一个重点就是要在设备分析的时候判断设备的输入和输出引脚是否反接,虽然看似受控设备除了二极管都没有引脚反接的情况,但后面好像有一个测试点就是吊扇反接的情况,所以我在设备类(Device)中有一个Boolean类型来判断这个设备有没有引脚反接的情况。
  • 改进建议
    • 家居强电电路模拟程序-3
      虽然这一次的迭代写的非常得心应手,也是唯一一次大作业一遍过,但是个人感觉在代码的过程中还是有投机取巧的情况,只是为了完成这一次大作业,虽然已经提前知道了下一次代码可能要迭代的内容,但依旧没有做方便下一次代码,做到更加完善自己的代码,更加方便下一次代码的迭代,使得本来就难的家居强电电路模拟程序-4雪上加霜。所以,这次代码可以提前在设备类中添加引脚类的属性,并且判断引脚是否反接等方法,做到承上启下的作用,为下一次迭代做好铺垫。
    • 家居强电电路模拟程序-4
      这是最后一次迭代,也是最后一次大作业,由于上次的代码没有为这一次的代码做好铺垫,所以这次的代码想到什么就添加了什么,对原有的代码改动还是蛮大的,所以整体的思路也比较乱。改到最后其实都感觉写的都差不多了,但还是有很多测试点没有过去。所以,这一次代码还应该多思考,在细节的地方多思考。比如说时在show()方法里单独判断电流是否是超过固定电流还是在属性中加入一个Boolean类型来判断电流是否超过固定电流的属性。
      其次就是每一个设备都重写了父类的show()方法,
@Override
	public void show() {
		if(status)
			System.out.print("@"+this.name+":closed");
		else
			System.out.print("@"+this.name+":turned on");
		System.out.print(" "+(int)this.inPin.getVoltage()+"-"+(int)this.outPin1.getVoltage());
		if(this.intensity>this.maxIntensity)
			System.out.println(" exceeding current limit error");
		else
			System.out.println();
	}

除了前面设备名称和状态的输出不相同,后面的输出输入引脚和输出引脚的电压已及判断电流是否超过固定电流的方法都是一样的,虽然都是复制粘贴不用我重新写,但是如果能运用多态的话也能减少代码的长度。

  • 总结
      1. 在代码迭代的过程中,不只要满足于这次代码通过,更要瞻前顾后,起到一个好的承上启下的作用,方便下一次的迭代。
      1. 在写代码之前要做好设计,不要想到哪个点就写哪个点,要有大局观,做到设计好代码再开始写代码。
  • 课程改进建议及意见
      1. 在设计一整个迭代过程时,先将后面有可能迭代的过程说明一下,方便学生们的类的设计和下一步的迭代过程。像这一次家居强电电路模拟程序的迭代,虽然老师最开始有说对引脚类的设计要求,但没有想到后面会有对引脚电压的输出,而我只看前面觉得并没有必要设计引脚类,也不知道设计引脚类之后如何连接设备实现设备的工作和输出,所以就省掉了引脚类。
      1. 在给出测试点时,应该适当给出一点提示,最后一次的迭代虽然给出了提示,但真的看不懂,不明白自己错在了哪里,不明白自己错在了哪里就不知道自己该往哪块地方开始修改,胡乱盯着自己代码怀疑这个或者那个错了然后开始修改无异于大海捞针,找不到方向还浪费了大把时间。
posted @ 2024-06-30 14:48  霜商二九  阅读(49)  评论(0)    收藏  举报