现在的位置: 首页 > 综合 > 正文

Delphi汽车类作业之反思与改进

2012年12月31日 ⁄ 综合 ⁄ 共 15013字 ⁄ 字号 评论关闭

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

    昨天上了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.

抱歉!评论已关闭.