Delphi汽车类作业之反思与改进
本来昨天晚上以为汽车类的作业已经做好了,虽然也觉得自己做得太简单了因为有太多的工作要做,就没太在意改进的事情。
昨天上了Delphi程序调试的课程,对调试程序有了新的认识。印象最为深刻的有以下几点:
关注编译期间的非语法错误:Warning 和Hints,这些小东西很可能造成潜在的bug; 断点有四种类型:普通断点,条件断点,数据断点和地址断点,而我仅仅使用了普通断点,其它的都还不会!!! 记录测试的过程,不仅仅是记录出现过的问题方便以后查阅,更是要用来明确调试的进度; 聚焦差异:使用svn和beyondCompare; 反思总结:总结出现错误的原因,避免再犯; 把自己遇到的问题讲给别人听,往往在这个过程中问题会得到解决; 以上几点warning和hints以前从来就没注意过,断点也只会普通的断点,svn更是除了作业还没用过。 这周内要学会以上几种断点和svn的实际使用。 晚上在网盘里把大家的作业下下来看了一下,发现我的程序设计有问题,还有很多毛病: 有30+个wanring和hints,原因是很多属性和函数声明了却没有使用; 题目要求是在Car基类的基础上实现各种不同类型的汽车,应该直接通过Car基类来对具体类型的车进行创建,不必再声明为新的类; 夕会的时候问过辅导员,一个Unit文件中可以有多个类(十几个),这些类之间相互关联即可。因此我的刹车类,方向盘类,车身类以及发动机类作为汽车的部件应该放在一个单元文件中。 单元文件的命名要体现文件的用途和含义,这点做得不好。 基于以上问题,对整个汽车类作业推翻重来,从晚上十一点多做到凌晨四点才做好,还有一些需要改进的地方我已经来不及改了,必须得休息一会,今天还有一天的课程。很神奇我居然能扛到快天亮的时候,感觉时间过得特别快。 下面汇报我的成果: 经过重新思考以后,我的工程包含三个单元文件: 第一个是AutoMobileComponents.pas,这个单元文件包含刹车类,方向盘类,车身类的声明和实现; 第二个是AutoMobile.pas,这个单元文件定义了汽车类,汽车类包含一些字段和部件类对象和方法; 第三个是主窗体AutoMobileShow.pas,用来展示效果。 虽然展示出来的效果跟修改前几乎相同,但是所有定义的属性和方法都被调用,waring和hints为0,pas文件个数明显减少,文件命名一目了然。下面开始上代码: AutoMobileComponents.pas{----------------------------------------- Unit Name: myCar Author: huyp Date: 06-八月-2012 Purpose: 分别调用TBaseCar TAudiA4 TAudiQ7 TBenzC200类模拟汽车过程 History: V1.0-----------------------------------------}unit AutoMobileShow;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, AutoMobileComponents, AutoMobile;type TCarForm = class(TForm) btnCarProcess: TButton; //一般汽车操作按钮 btnAudiA4: TButton; //AudiA4操作按钮 btnBenzC200: TButton; //BenzC200操作按钮 btnAudiQ7: TButton; //AudiQ7操作按钮 procedure btnAudiA4Click(Sender: TObject); //模拟奥迪A4流程 procedure btnAudiQ7Click(Sender: TObject); //模拟奥迪Q7流程 procedure btnBenzC200Click(Sender: TObject); //模拟奔驰C200流程 procedure btnCarProcessClick(Sender: TObject); //模拟一般汽车流程 private { Private declarations } public { Public declarations } end;var CarForm: TCarForm; huypCar : TCar;implementation{$R *.dfm}{----------------------------------------- Procedure: btnAudiA4Click Author: huyp Date: 06-八月-2012 Arguments: Sender: TObject Result: None Function: 模拟奥迪A4从启动到停止的流程,调用 TAudiA4类的成员方法-----------------------------------------}procedure TCarForm.btnAudiA4Click(Sender: TObject);var AudiA4 : TCar;begin AudiA4 := TCar.Create; AudiA4.SetType('AudiA4'); AudiA4.price := 28; //方向盘 AudiA4.huypSteeringWheel.SetWheelDiameter(40); AudiA4.huypSteeringWheel.SetWheelDirection(trunLeft); //刹车 AudiA4.huypBrake.SetBrakeState(stop); //车身 AudiA4.huypCarBody.SetCarColor('黑色'); AudiA4.huypCarBody.SetCarLength(2); //发动机 AudiA4.huypEngine.SetEngineId(12344321); AudiA4.huypEngine.SetEngineState(on); ShowMessage('大家好,我是'+ AudiA4.GetType +#13+''+ '我的发动机编号是:' + inttostr(AudiA4.huypEngine.GetEngineId)+#13+''+ '我的颜色是:'+ AudiA4.huypCarBody.GetCarColor+', 车身的长度是'+inttostr(AudiA4.huypCarBody.GetCarLength)+'m'+#13+''+ '我的方向盘的直径是'+inttostr(AudiA4.huypSteeringWheel.GetWheelDiameter)+'cm'); AudiA4.starting; AudiA4.driving; AudiA4.stopping; AudiA4.Free;end;{----------------------------------------- Procedure: btnAudiQ7Click Author: huyp Date: 06-八月-2012 Arguments: Sender: TObject Result: None Function: 模拟奥迪Q7从启动到停止的流程,调用 TAudiQ7类的成员方法-----------------------------------------}procedure TCarForm.btnAudiQ7Click(Sender: TObject);var AudiQ7 : TCar;begin AudiQ7 := TCar.Create; AudiQ7.SetType('AudiQ7'); AudiQ7.price := 85; //方向盘 AudiQ7.huypSteeringWheel.SetWheelDiameter(40); AudiQ7.huypSteeringWheel.SetWheelDirection(trunLeft); //刹车 AudiQ7.huypBrake.SetBrakeState(stop); //车身 AudiQ7.huypCarBody.SetCarColor('蓝色'); AudiQ7.huypCarBody.SetCarLength(2); //发动机 AudiQ7.huypEngine.SetEngineId(12344321); AudiQ7.huypEngine.SetEngineState(on); ShowMessage('大家好,我是'+ AudiQ7.GetType +#13+''+ '我的发动机编号是:' + inttostr(AudiQ7.huypEngine.GetEngineId)+#13+''+ '我的颜色是:'+ AudiQ7.huypCarBody.GetCarColor+', 车身的长度是'+inttostr(AudiQ7.huypCarBody.GetCarLength)+'m'+#13+''+ '我的方向盘的直径是'+inttostr(AudiQ7.huypSteeringWheel.GetWheelDiameter)+'cm'); AudiQ7.starting; AudiQ7.driving; AudiQ7.stopping; AudiQ7.Free; end;{----------------------------------------- Procedure: btnBenzC200Click Author: huyp Date: 06-八月-2012 Arguments: Sender: TObject Result: None Function: 模拟BenzC200从启动到停止的流程,调用 TBenzC200类的成员方法-----------------------------------------}procedure TCarForm.btnBenzC200Click(Sender: TObject); var BenzC200 : TCar;begin BenzC200 := TCar.Create; BenzC200.SetType('BenzC200'); BenzC200.price := 38; //方向盘 BenzC200.huypSteeringWheel.SetWheelDiameter(40); BenzC200.huypSteeringWheel.SetWheelDirection(trunLeft); //刹车 BenzC200.huypBrake.SetBrakeState(stop); //车身 BenzC200.huypCarBody.SetCarColor('红色'); BenzC200.huypCarBody.SetCarLength(2); //发动机 BenzC200.huypEngine.SetEngineId(12344321); BenzC200.huypEngine.SetEngineState(on); ShowMessage('大家好,我是'+ BenzC200.GetType +#13+''+ '我的发动机编号是:' + inttostr(BenzC200.huypEngine.GetEngineId)+#13+''+ '我的颜色是:'+ BenzC200.huypCarBody.GetCarColor+', 车身的长度是'+inttostr(BenzC200.huypCarBody.GetCarLength)+'m'+#13+''+ '我的方向盘的直径是'+inttostr(BenzC200.huypSteeringWheel.GetWheelDiameter)+'cm'); BenzC200.starting; BenzC200.driving; BenzC200.stopping; BenzC200.Free;end;{----------------------------------------- Procedure: btnCarProcessClick Author: huyp Date: 06-八月-2012 Arguments: Sender: TObject Result: None Function: 模拟car从启动到停止的流程,调用 TCar类的成员方法-----------------------------------------}procedure TCarForm.btnCarProcessClick(Sender: TObject);var myCar : TCar;begin myCar := TCar.Create; myCar.SetType('a Common Car'); myCar.starting; myCar.driving; myCar.stopping; myCar.Free;end;end.