本来昨天晚上以为汽车类的作业已经做好了,虽然也觉得自己做得太简单了因为有太多的工作要做,就没太在意改进的事情。
昨天上了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.