freeman35 yazdı:bütün yazıyı tekrar alıntı yapman gereksiz
Soruyu soran ve cevap veren aynı arkadaş
Genel de birşeyleri öğrenip,anlamaya çalışırken tek bir kaynak ya da görüşe bağlı kalmadan o konuyla ilgili tüm kaynakları incelemeye ve aralarında ki kullanım farklarını avantaj dezavantajlarını düşünmeye çalışırım.
Ayrıca verdiğiniz veritabanı senaryosu için teşekkür ederim.Bu konuda biraz daha araştırma yaptığımda aşağıda ki örneğe rastladım.Sanırım java kodu.
https://refactoring.guru/replace-condit ... lymorphism
Anladığım kadarı ile şartlı ifadeleri(if,switch,case of vs),poliformizm ile değiştirmemizi söylüyor.
Sanırım sizin de daha önce "Bu sayede aşağıda ki gibi garip bir kullanıma ihtiyacınız kalmaz" dan kastettiğiniz gibi,poliformik bir yapıda,if ve case of gibi şartlı ifadeleri ortadan kaldırırak "daha sadece" ve "daha esnek" bir kodlama elde etmiş oluyoruz.Peki...
Böyle bir senaryo olmaz belki ama örnek teşkil etmesi açısından ;
Bir TComboBox nesnesinde üç tane eleman olduğunu düşünürsek eğer;
"SQL Connection"
"Oracle Connection"
"SysBase Connection"
Ve yine bu seçimlere göre ilgili bağlantıyı,ilgili sınıf yardımı ile açmak(Open;) yada kapatmak(Close;) istersek yine,
if veya case of yazmak durumunda kalacağız gibi görünüyor.
Poliformik bir yapıda kodlamış da olsak, "Bu sayede aşağıda ki gibi garip bir kullanıma ihtiyacınız kalmaz" ,cümlesinde geçtiği gibi o garip kullanıma yine dönmüş olacağız sanki.
Yani şöyle olduğunu varsayalım;
Kod: Tümünü seç
procedure TForm1.ComboBox1Change(Sender: TObject);
var
AConnection : TCustomConnection;
begin
case ComboBox1.ItemIndex of
0 : AConnection := TSQLConnection.Create;
1 : AConnection := TOracleConnection.Create;
2 : AConnection := TSybaseConnection.Create;
end;
AConnection.Open();
end;
Sanırım şu şekilde bir ilave daha yapsak,if ve case of lardan kurtulmuş olacağız;
Kod: Tümünü seç
unit Unit1;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,
System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Generics.Collections,
Vcl.StdCtrls;
type
TForm1 = class(TForm)
ComboBox1: TComboBox;
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
TCustomConnection = class
procedure Open; virtual; abstract;
procedure Close; virtual; abstract;
end;
TSQLConnection = class(TCustomConnection)
public
procedure Open; override;
procedure Close; override;
end;
TOracleConnection = class(TCustomConnection)
public
procedure Open; override;
procedure Close; override;
end;
TSybaseConnection = class(TCustomConnection)
public
procedure Open; override;
procedure Close; override;
end;
var
Form1: TForm1;
AMap: TDictionary<Integer, TCustomConnection>;
implementation
{$R *.dfm}
{ TSQLConnection }
procedure TSQLConnection.Close;
begin
OutputDebugString('SQL connection closed.');
end;
procedure TSQLConnection.Open;
begin
OutputDebugString('SQL connection opened.');
end;
{ TOracleConnection }
procedure TOracleConnection.Close;
begin
OutputDebugString('Oracle connection closed.');
end;
procedure TOracleConnection.Open;
begin
OutputDebugString('Oracle connection opened.');
end;
{ TSybaseConnection }
procedure TSybaseConnection.Close;
begin
OutputDebugString('Sybase connection closed.');
end;
procedure TSybaseConnection.Open;
begin
OutputDebugString('Sybase connection closed.');
end;
procedure TForm1.FormCreate(Sender: TObject);
var
ACustomConnection: TCustomConnection;
AConnectionMap: TDictionary<Integer, TCustomConnection>;
begin
ComboBox1.Items.Add('SQL Connection');
ComboBox1.Items.Add('Oracle Connection');
ComboBox1.Items.Add('Sybase Connection');
ComboBox1.ItemIndex := 1;
AConnectionMap := TDictionary<Integer, TCustomConnection>.Create();
AConnectionMap.Add(0, TSQLConnection.Create);
AConnectionMap.Add(1, TOracleConnection.Create);
AConnectionMap.Add(2, TSybaseConnection.Create);
AConnectionMap.TryGetValue(ComboBox1.ItemIndex, ACustomConnection);
ACustomConnection.Open;
end;
end.
Örnek teşkil etmesi açısından,böyle bir kodlama yaptım.Aksi takdirde TDictionary'ye "nesne örneklerini"(instance) eklemek yerine,sınıfların meta bilgilerini ekledikten sonra,ihtiyaç duyulan ilgili sınıfın,meta bilgilerinden oluşturarak yazmak daha akıl karı bir kodlama olacaktır diye düşünüyorum.Çünkü her veritabanı için, ilgili veritabanı sınıfı implementasyonu yazılmış, hali hazırda olabilir.Ama,belki de veritabanı sınıfı hiç kullanılmayarak gereksiz yere bellekte yer işgal edecektir diye düşünüyorum.
Bu konularda ki fikir ve önerilerinizi paylaşırsanız sevinirim.