本来昨天晚上以为汽车类的作业已经做好了,虽然也觉得自己做得太简单了因为有太多的工作要做,就没太在意改进的事情。
昨天上了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 AutoMobileComponents; interface type TEngineState = (on, off); // State of Engine type TWheelDirection = (trunLeft, goForward,turnRight); //direction of wheel type TBrakeState =(run, stop); //state of brake {Brake 刹车 } type TBrake = class public BrakeState : TBrakeState; //刹车状态 function GetBrakeState: TBrakeState; //获取刹车状态 procedure SetBrakeState(BrakeStateTmp: TBrakeState); //设置刹车状态 end; {CarBody 车身} type TCarBody = class public CarColor : string; CarLength : Integer; function GetCarColor: string; //获取汽车车身颜色 procedure SetCarColor(CarColorTmp: string); //设置汽车车身颜色 function GetCarLength: Integer; //获取汽车车身长度 procedure SetCarLength(CarLengthTmp: Integer); //设置汽车车身长度 end; {SteeringWheel 方向盘类} type TSteeringWheel = class public WheelDiameter : Integer; //方向盘直径 WheelDirection : TWheelDirection; //方向盘方向 function GetWheelDiameter: Integer; //获取方向盘直径 procedure SetWheelDiameter(WheelDiameterTmp: Integer); //设置方向盘直径 function GetWheelDirection: TWheelDirection; //获取方向盘方向 procedure SetWheelDirection(WheelDirectionTmp: TWheelDirection); //设置方向盘方向 end; {engine 发动机 } type TEngine = class public EngineId : Longint; //发动机编号 EngineState: TEngineState; //发动机状态 function GetEngineId: Longint; //获取发动机编号 procedure SetEngineId(EngineIdTmp: Longint); //设置发动机编号 function GetEngineState: TEngineState; //获取发动机状态 procedure SetEngineState(EngineStateTmp: TEngineState); //设置发动机状态 end; implementation //刹车相关方法 {----------------------------------------------------------------------------- Procedure: GetBrakeStatus Author: yanpinghu Date: 08-八月-2012 Arguments: None Result: TBrakeState -----------------------------------------------------------------------------} function TBrake.GetBrakeState: TBrakeState; begin Result := BrakeState; end; {----------------------------------------------------------------------------- Procedure: SetBrakeState Author: yanpinghu Date: 08-八月-2012 Arguments: BrakeStateTmp: Boolean Result: None -----------------------------------------------------------------------------} procedure TBrake.SetBrakeState(BrakeStateTmp: TBrakeState); begin BrakeState := BrakeStateTmp; end; //车身相关方法 {----------------------------------------------------------------------------- Procedure: GetCarColor Author: yanpinghu Date: 08-八月-2012 Arguments: None Result: string Function: 返回汽车车身的颜色 -----------------------------------------------------------------------------} function TCarBody.GetCarColor: string; begin Result := CarColor; end; {----------------------------------------------------------------------------- Procedure: SetCarColor Author: yanpinghu Date: 08-八月-2012 Arguments: CarColorTmp: string Result: None Function: 设置汽车车身的颜色 -----------------------------------------------------------------------------} procedure TCarBody.SetCarColor(CarColorTmp: string); begin CarColor := CarColorTmp; end; {----------------------------------------------------------------------------- Procedure: GetCarLength Author: yanpinghu Date: 08-八月-2012 Arguments: None Result: real Function: 返回汽车车身的长度 -----------------------------------------------------------------------------} function TCarBody.GetCarLength: Integer; begin Result := CarLength; end; {----------------------------------------------------------------------------- Procedure: SetCarLength Author: yanpinghu Date: 08-八月-2012 Arguments: CarLengthTmp: real Result: None Function: 设置汽车车身的长度 -----------------------------------------------------------------------------} procedure TCarBody.SetCarLength(CarLengthTmp: Integer); begin CarLength := CarLengthTmp; end; //方向盘相关方法 {----------------------------------------------------------------------------- Procedure: GetDiameter Author: yanpinghu Date: 08-八月-2012 Arguments: None Result: Integer Function : 获取方向盘直径 -----------------------------------------------------------------------------} function TSteeringWheel.GetWheelDiameter: Integer; begin Result := WheelDiameter; end; {----------------------------------------------------------------------------- Procedure: SetDiameter Author: yanpinghu Date: 08-八月-2012 Arguments: diameterTmp: Integer Result: None Function : 设置方向盘直径 -----------------------------------------------------------------------------} procedure TSteeringWheel.SetWheelDiameter(WheelDiameterTmp: Integer); begin WheelDiameter := WheelDiameterTmp; end; {----------------------------------------------------------------------------- Procedure: GetDirection Author: yanpinghu Date: 08-八月-2012 Arguments: None Result: TWheelDirection Function : 获取方向盘方向 -----------------------------------------------------------------------------} function TSteeringWheel.GetWheelDirection: TWheelDirection; begin Result := WheelDirection; end; {----------------------------------------------------------------------------- Procedure: SetDirection Author: yanpinghu Date: 08-八月-2012 Arguments: directionTmp: TWheelDirection Result: None Function : 设置方向盘方向 -----------------------------------------------------------------------------} procedure TSteeringWheel.SetWheelDirection(WheelDirectionTmp: TWheelDirection); begin WheelDirection := WheelDirectionTmp; end; //发动机相关方法 {----------------------------------------------------------------------------- Function: GetEngineNum Author: yanpinghu Date: 08-八月-2012 Arguments: None Result: Longint 功能: 获取汽车发动机编号 -----------------------------------------------------------------------------} function TEngine.GetEngineId: Longint; begin Result := EngineId; end; {----------------------------------------------------------------------------- Procedure: SetEngineNum Author: yanpinghu Date: 08-八月-2012 Arguments: IdTmp: Integer Result: None Function: 设置汽车发动机编号 -----------------------------------------------------------------------------} procedure TEngine.SetEngineId(EngineIdTmp: Integer); begin EngineId := EngineIdTmp; end; {----------------------------------------------------------------------------- Procedure: GetEngineState Author: yanpinghu Date: 08-八月-2012 Arguments: None Result: TEngineState Function : 获取汽车发动机状态 -----------------------------------------------------------------------------} function TEngine.GetEngineState: TEngineState; begin Result := EngineState; end; {----------------------------------------------------------------------------- Procedure: SetEngineState Author: yanpinghu Date: 08-八月-2012 Arguments: engineStateTmp: TEngineState Result: None Function : 设置汽车发动机状态 -----------------------------------------------------------------------------} procedure TEngine.SetEngineState(EngineStateTmp: TEngineState); begin EngineState := EngineStateTmp; end; end.
AutoMobile.pas
{----------------------------------------------------------------------------- Unit Name: BaseCar Author: huyp Date: 06-八月-2012 Purpose: BaseCar类是基本的汽车类,具有汽车的一般属性,是其它汽车类的基类 History: V1.0 -----------------------------------------------------------------------------} unit AutoMobile; interface uses AutoMobileComponents, Dialogs; {汽车类} type TCar = class public AutoMobileType : string; //车名 price : real; //价格 { Public declarations } huypSteeringWheel : TSteeringWheel; //方向盘类对象 huypCarBody : TCarBody; //车身类对象 huypEngine : TEngine; //发动机类对象 huypBrake : TBrake; //刹车类对象 procedure SetType(carType: string); //设置车的类型 function GetType: string; //获取车的类型 procedure starting; virtual; //模拟汽车启动函数 procedure driving; virtual; //模拟汽车行驶函数 procedure stopping; virtual; //模拟汽车停止函数 constructor Create(); //构造函数 destructor Destroy();override; //析构函数 end; implementation {----------------------------------------------------------------------------- Procedure: SetType Author: yanpinghu Date: 08-八月-2012 Arguments: carType: string Result: None Function: 设置车的类型,品牌 -----------------------------------------------------------------------------} procedure TCar.SetType(carType: string); begin AutoMobileType := carType; end; {----------------------------------------------------------------------------- Procedure: GetType Author: yanpinghu Date: 08-八月-2012 Arguments: None Result: string Function: 获取车的类型 -----------------------------------------------------------------------------} function TCar.GetType: string; begin result := AutoMobileType; end; {----------------------------------------------------------------------------- Procedure: starting Author: huyp Date: 06-八月-2012 Arguments: None Result: None Funtion: 模拟汽车启动 -----------------------------------------------------------------------------} procedure TCar.starting; begin MessageDlg('I am ' + GetType + ', it''s time to go', mtInformation, [mbOK, mbCancel], 0); end; {----------------------------------------------------------------------------- Procedure: driving Author: huyp Date: 06-八月-2012 Arguments: None Result: None Funtion: 模拟汽车行驶 -----------------------------------------------------------------------------} procedure TCar.driving; begin MessageDlg('Now, I am driving', mtInformation, [mbOK, mbCancel], 0); MessageDlg('Now, I turn left', mtInformation, [mbOK, mbCancel], 0); end; {----------------------------------------------------------------------------- Procedure: stopping Author: huyp Date: 06-八月-2012 Arguments: None Result: None Funtion: 模拟汽车停止 -----------------------------------------------------------------------------} procedure TCar.stopping; begin MessageDlg('finally, I stop at my home', mtInformation, [mbOK, mbCancel], 0); end; {----------------------------------------------------------------------------- Procedure: Create Author: yanpinghu Date: 08-八月-2012 Arguments: None Result: None Function: 汽车类的构造函数,构造了方向盘、刹车、发动机和车身几个部件 -----------------------------------------------------------------------------} constructor Tcar.Create; begin huypSteeringWheel := TSteeringWheel.Create; huypEngine := TEngine.Create; huypBrake := TBrake.Create; huypCarBody := TCarBody.create; end; {----------------------------------------------------------------------------- Procedure: destroy Author: yanpinghu Date: 08-八月-2012 Arguments: None Result: None Function: 汽车类的析构函数,释放构造函数中创建的类消耗的资源 -----------------------------------------------------------------------------} destructor Tcar.destroy; begin huypSteeringWheel.Free; huypEngine.Free; huypBrake.Free; huypCarBody.Free; inherited; end; end.
AutoMobileShow.pas
{----------------------------------------------------------------------------- Unit Name: myCar Author: huyp Date: 06-八月-2012 Purpose: 分别调用TBaseCar TAudiA4 TAudiQ7 TBenzC200类模拟汽车过程 History: V1.0 -----------------------------------------------------------------------------} unit AutoMobileShow; interface uses 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.