Original in Russian: http://programmingmindstream.blogspot.ru/2014/02/4.html
Table of contents
We follow up the posts.
All source code is available here
We’ll assume that we have “ensured the minimal test coverage” of all precedents of the application.
Having assumed this, we can set about CHANGING the architecture of the application.
We introduce a “business class” TCalculator implementing the business logic of the application.
The “business class”:
Now the project’s main form code becomes as follows:
We run our tests and the tests pass.
So what is the result? We have changed the architecture of the application PAIN-FREE and tested if “something” is wrong.
Is the idea clear?
FIRST we’ve ensured the “minimal test coverage” of ALL precedents of the application and ONLY AFTER we have changed the architecture.
We’ve defined “business-logic” class and checked if “SOMETHING is wrong”.
We need MINIMAL coverage because there are some questions, for example, about random data - https://bitbucket.org/ingword/lulinproject/src/573b39b33e09de0d68964f841d69d94df902ab9e/DummyCalculator/Chapter4/Tests/GUI/RandomPlusTest.pas?at=Release
Later on, we’ll discuss “whys” and “whats”.
Meanwhile, have a look at what has already been done. I hope, you will find it useful.
Repository
Table of contents
We follow up the posts.
All source code is available here
We’ll assume that we have “ensured the minimal test coverage” of all precedents of the application.
Having assumed this, we can set about CHANGING the architecture of the application.
We introduce a “business class” TCalculator implementing the business logic of the application.
The “business class”:
unit Calculator; interface type TCalculator = class public class function Add(const A, B: string): string; class function Sub(const A, B: string): string; class function Mul(const A, B: string): string; class function Divide(const A, B: string): string; end;//TCalculator implementation uses SysUtils ; class function TCalculator.Add(const A, B: string): string; var x1, x2, x3 : single; begin x1 := StrToFloat(A); x2 := StrToFloat(B); x3 := x1 + x2; Result := FloatToStr(x3); end; class function TCalculator.Sub(const A, B: string): string; var x1, x2, x3 : single; begin x1 := StrToFloat(A); x2 := StrToFloat(B); x3 := x1 - x2; Result := FloatToStr(x3); end; class function TCalculator.Mul(const A, B: string): string; var x1, x2, x3 : single; begin x1 := StrToFloat(A); x2 := StrToFloat(B); x3 := x1 * x2; Result := FloatToStr(x3); end; class function TCalculator.Divide(const A, B: string): string; var x1, x2, x3 : single; begin x1 := StrToFloat(A); x2 := StrToFloat(B); x3 := x1 / x2; Result := FloatToStr(x3); end; end.
Now the project’s main form code becomes as follows:
unit MainForm; interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls; type TfmMain = class(TForm) Edit1: TEdit; Edit2: TEdit; Edit3: TEdit; Button1: TButton; Button2: TButton; Button3: TButton; Button4: TButton; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure Button3Click(Sender: TObject); procedure Button4Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var fmMain: TfmMain; implementation uses Calculator ; {$R *.dfm} procedure TfmMain.Button1Click(Sender: TObject); begin Edit3.Text := TCalculator.Add(Edit1.Text, Edit2.Text); end; procedure TfmMain.Button2Click(Sender: TObject); begin Edit3.Text := TCalculator.Sub(Edit1.Text, Edit2.Text); end; procedure TfmMain.Button3Click(Sender: TObject); begin Edit3.Text := TCalculator.Mul(Edit1.Text, Edit2.Text); end; procedure TfmMain.Button4Click(Sender: TObject); begin Edit3.Text := TCalculator.Divide(Edit1.Text, Edit2.Text); end; end.
We run our tests and the tests pass.
So what is the result? We have changed the architecture of the application PAIN-FREE and tested if “something” is wrong.
Is the idea clear?
FIRST we’ve ensured the “minimal test coverage” of ALL precedents of the application and ONLY AFTER we have changed the architecture.
We’ve defined “business-logic” class and checked if “SOMETHING is wrong”.
We need MINIMAL coverage because there are some questions, for example, about random data - https://bitbucket.org/ingword/lulinproject/src/573b39b33e09de0d68964f841d69d94df902ab9e/DummyCalculator/Chapter4/Tests/GUI/RandomPlusTest.pas?at=Release
Later on, we’ll discuss “whys” and “whats”.
Meanwhile, have a look at what has already been done. I hope, you will find it useful.
Repository
Комментариев нет:
Отправить комментарий