İlla OOP mantığı ile kod yazıcam diye her şeyi sınıf olarak tanımlamana gerek yokki.
Döviz kurları arasında dönüşüm yapan bir sınıfın ihtiyaç duyduğu parametreler, doviz1, doviz2 ve parite'dir. Peki senin tasarlamaya çalıştığın sınıf bunları kendisi mi buluyor? Hayır, senin bu bilgileri ona geçmen lazım. E bu durumda basit bir çarpma işlemi için bir sınıf yapmanın mantığı nedir? Üstelik her dönüşüm işlemi yapmak istediğinde bu sınıftan bir nesne yaratman lazım ki bu senin kodunun hem okunmasını hem de bakımını zorlaştırır.
Bu işi fonksiyona göm demiyorum ama illa bir sınıf tanımlayıp bu işi nasıl hallederim diyorsan şunlara dikkat et:
- Tasarladığın sınıfın kod içinde kullanıırlığı rahat olmalı. Bu sınıfı kullanacak kişi tek işlem için 5-6 satır kod yazmamalı. Çünkü işlem özünde o kadar karışık değil.
- Sınıf, belli bir kaç döviz kuruyla sınırlandırılmamalı.
Kod: Tümünü seç
TCurrencyConverter = class
class function Convert(amount: Currency; parity: Double):Currency;
end;
class function TCurrencyConverter.Convert(amount: Currency;
parity: Double): Currency;
begin
Result := amount * parity;
end;
...
TCurrenyConverter.Convert(100, 1.49); // 100 dolar = 149 YTL
TCurrenyConverter.Convert(100, 0.67); // 100 YTL = 67 dolar
TCurrenyConverter.Convert(100, 1.26); // 100 euro = 126 dolar
Asıl önemli olan pariteleri de bir şekilde ifade edebilmek ve dönüşüm yapabilmek.
O yüzden sınıfın amacını biraz genişletelim:
1) Parite bilgilerini tutabilsin.
1.1) Sınırsız sayıda parite bilgisi eklenebilsin
2) Kurlar arası çevirim yapabilsin.
O zaman sınıf arayüzünü tekrar tanımlayalım.
Kod: Tümünü seç
TCurrencyConverter2 = class
private
FParityTable : array of array of double;
FCurrencies: TStringList;
protected
procedure BuildParityTable; virtual;
function CalculateParity(symbol1,symbol2:String):Double; overload;
function CalculateParity(parity1,parity2:Double):Double;overload;
public
constructor Create;
destructor Destroy; override;
procedure AddParity(const currencySymbol:string; const parity:double);
// RemoveParity vs..'de eklenebilir...
function Convert(amount:currency; parity: double):currency; overload;
function Convert(amount:currency; symbol1,symbol2: string):currency; overload;
end;
procedure TCurrencyConverter2.AddParity(const currencySymbol: string;
const parity: double);
var
i : integer;
begin
//Dövizlere ekle
FCurrencies.Add(currencySymbol);
// boyutu gerektiği kadar arttır.
SetLength(FParityTable,FCurrencies.Count);
// tabloya döviz sayısı kadar sütun ekle
for i := Low(FParityTable) to High(FParityTable) do
SetLength(FParityTable[i],FCurrencies.Count);
FParityTable[0][FCurrencies.Count-1] := parity;
// Dönüşüm tablosunu oluştur.
BuildParityTable;
end;
procedure TCurrencyConverter2.BuildParityTable;
var
i,j : integer;
total : integer;
begin
total := High(FParityTable) - Low(FParityTable);
// dönüşüm tablo pariteleri hesapla ve tabloyu oluştur
for i := low(FParityTable) to High(FParityTable) do
for j := low(FParityTable[i]) to High(FParityTable[i]) do
FParityTable[i][j] := CalculateParity(FCurrencies[i],FCurrencies[j]);
end;
function TCurrencyConverter2.CalculateParity(symbol1,
symbol2: String): Double;
var
parity1,parity2 : double;
begin
parity1 := FParityTable[0][FCurrencies.IndexOf(symbol1)];
parity2 := FParityTable[0][FCurrencies.IndexOf(symbol2)];
Result := parity2 / parity1;
end;
function TCurrencyConverter2.CalculateParity(parity1,
parity2: Double): Double;
begin
Result := parity2 / parity1;
end;
function TCurrencyConverter2.Convert(amount: currency;
parity: double): currency;
begin
Result := amount * parity;
end;
function TCurrencyConverter2.Convert(amount: currency; symbol1,
symbol2: string): currency;
var
i,j : integer;
begin
i := FCurrencies.IndexOf(symbol1);
j := FCurrencies.IndexOf(symbol2);
Result := amount * FParityTable[i][j];
end;
constructor TCurrencyConverter2.Create;
begin
FCurrencies := TStringList.Create;
end;
destructor TCurrencyConverter2.Destroy;
begin
FCurrencies.Free;
inherited;
end;
Bu sınıftan bir nesne oluşturup parite bilgilerini ekliyoruz.
Kod: Tümünü seç
CurrConvert := TCurrencyConverter2.Create;
try
CurrConvert.AddParity('YTL',1.00);
CurrConvert.AddParity('USD',1.49);
CurrConvert.AddParity('EUR',1.88);
CurrConvert.AddParity('YEN',2.65);
// pariteler sallamadır.
....
ve şu şekilde kullanıyoruz:
Kod: Tümünü seç
CurrConvert.Convert(100,'EUR','USD'); // 79.25
CurrConvert.Convert(100,'YTL','USD'); // 149.00
CurrConvert.Convert(100,'EUR','YTL'); // 53.19
CurrConvert.Convert(100,'USD','YEN'); // 177.85
...